您的位置:

python常用的小技巧(python入门操作)

本文目录一览:

Python中常见魔法方法介绍

魔法方法 (Magic Methods) 是Python中的内置函数,一般以双下划线开头和结尾,例如__ init__ 、 __del__ 等。之所以称之为魔法方法,是因为这些方法会在进行特定的操作时会自动被调用。

在Python中,可以通过dir()方法来查看某个对象的所有方法和属性,其中双下划线开头和结尾的就是该对象的魔法方法。以字符串对象为例:

可以看到字符串对象有 __add__ 方法,所以在Python中可以直接对字符串对象使用"+"操作,当Python识别到"+"操作时,就会调用该对象的 __add__ 方法。有需要时我们可以在自己的类中重写 __add__ 方法来完成自己想要的效果。

我们重写了 __add__ 方法,当Python识别"+"操作时,会自动调用重写后的 __add__ 方法。可以看到,魔法方法在类或对象的某些事件出发后会自动执行,如果希望根据自己的程序定制特殊功能的类,那么就需要对这些方法进行重写。使用魔法方法,我们可以非常方便地给类添加特殊的功能。

1、构造与初始化

__ new __ 、 __ init __ 这两个魔法方法常用于对类的初始化操作。上面我们创建a1 = A("hello")时,但首先调用的是 __ new __ ;初始化一个类分为两步:

a.调用该类的new方法,返回该类的实例对象

b.调用该类的init方法,对实例对象进行初始化。

__new__ (cls, *args, **kwargs)至少需要一个cls参数,代表传入的类。后面两个参数传递给 __ init __ 。在 __ new __ 可以决定是否继续调用 __ init __ 方法,只有当 __ new __ 返回了当前类cls的实例,才会接着调用 __ init __ 。结合 __ new __ 方法的特性,我们可以通过重写 __ new __ 方法实现Python的单例模式:

可以看到虽然创建了两个对象,但两个对象的地址相同。

2、控制属性访问这类魔法

方法主要对对象的属性进行访问、定义、修改时起作用。主要有:

__getattr__(self, name): 定义当用户试图获取一个属性时的行为。

__getattribute__(self, name):定义当该类的属性被访问时的行为(先调用该方法,查看是否存在该属性,若不存在,接着去调用getattr)。

__setattr__(self, name, value):定义当一个属性被设置时的行为。

当初始化属性时如self.a=a时或修改实例属性如ins.a=1时本质时调用魔法方法self. __ setattr __ (name,values);当实例访问某个属性如ins.a本质是调用魔法方法a. __ getattr __ (name)

3、容器类操作

有一些方法可以让我们自己定义自己的容器,就像Python内置的List,Tuple,Dict等等;容器分为可变容器和不可变容器。

如果自定义一个不可变容器的话,只能定义__ len__ 和__ getitem__ ;定义一个可变容器除了不可变容器的所有魔法方法,还需要定义__ setitem__ 和__ delitem__ ;如果容器可迭代。还需要定义__ iter __。

__len__(self):返回容器的长度

__getitem__(self,key):当需要执行self[key]的方式去调用容器中的对象,调用的是该方法

__setitem__(self,key,value):当需要执行self[key] = value时,调用的是该方法

__iter__(self):当容器可以执行 for x in container:,或者使用iter(container)时,需要定义该方法

下面举一个例子,实现一个容器,该容器有List的一般功能,同时增加一些其它功能如访问第一个元素,最后一个元素,记录每个元素被访问的次数等。

这类方法的使用场景主要在你需要定义一个满足需求的容器类数据结构时会用到,比如可以尝试自定义实现树结构、链表等数据结构(在collections中均已有),或者项目中需要定制的一些容器类型。

魔法方法在Python代码中能够简化代码,提高代码可读性,在常见的Python第三方库中可以看到很多对于魔法方法的运用。

因此当前这篇文章仅是抛砖引玉,真正的使用需要在开源的优秀源码中以及自身的工程实践中不断加深理解并合适应用。

Python编程常用技巧

链接:

提取码:dfsm

Python 编程高手之路。本课程分五个阶段,详细的为您打造高手之路,本课程适合有一定python基础的同学。

用Python可以做什么?可以做日常任务,比如自动备份你的MP3;可以做网站,很多著名的网站就是Python写的。总之就是能干很多很多事。

课程目录:

第一阶段

第一章:用户交互

第二章:流程控制

第三章:数据类型

第四章:字符编码

第五章:文件处理

第二阶段

第六章:函数概述

第七章:闭包函数

......

Python元组常用操作小技巧

所以这篇文章,我们先来回顾和总结Python数据结构里常用操作。Python中常见的数据结构可以统称为容器(container)。序列(如列表和元组)、映射(如字典)以及集合(set)是三类主要的容器。而扁平序列如str、bytes、bytearray、memoryview 和 array.array等不在这篇文章的讨论范围内。

在此,我们先从元组开始说起。

元组区别于列表的显著特征之一就是它不能被修改,但其另外一个作用就是 用于没有字段名的记录 [1] 。因为后者经常被忽略,我们先来看看元组作为记录的作用。

使用括号就可以定义一个元组。元组中的每个元素都存放了记录中一个字段的数据,外加这个字段的位置。正是这个位置信息给数据赋予了意义。下面的例子中,元组就被当作记录加以利用:

输出为:

上述for循环中的操作提取了元组中的元素,也叫作拆包(unpacking)。平行赋值是对元组拆包很好的应用,示例如下:

还有一个经典而优雅的应用是交换变量的值:

用 * 运算符把一个可迭代对象拆开作为函数的参数,例如Python的内置函数pmod接收两个数字类型的参数,返回商和余数。以下范例将使用 * 将元组传入函数。

输出为:

有些函数有多个返回值,将其赋给一个变量时,变量类型即是元组:

输出为:

zip是Python的内置函数,能够接收两个或多个序列,并组成一个元组列表,在Python3中会返回一个迭代器,如下所示:

输出为:

元组当然也支持一些常规操作,如对于元组 a = (1, 'y', 5, 5, 'x') :

上述内容不仅涵盖了元组的基本操作,同时也结合了实际工作中常搭配使用的其他函数、运算符等。在回顾这些知识时主要参考了两本经典的Python编程书籍:《流畅的Python》和《像计算机科学家一样思考Python》,有兴趣的朋友可以深入阅读!

希望这篇文章对你有帮助,下回将总结Python列表的使用技巧。

[1]《流畅的Python》:

(Python)numpy 常用操作

不放回取样:

从列表ori中不放回地取n个数

通过这种操作,我们可以获得一个二维列表的子集:

(如果这个二维列表是图的邻接矩阵,那么就是对图进行随机采样,获得一个图的子图)

首先要注意,"+" 操作对于list和numpy.array是完全不同的

python 中的list,"+"代表拼接:

在numpy.array中,"+"代表矩阵相加

keepdim指的是维度不变,常在sum中使用。如:

会发现,keepdim之后还是二维的

这里要注意,pytorch和numpy里max()函数的返回值是不同的

pytorch:

也就是说,max(1)代表求第一维的最大值,对于二维数组来说,就是求纵向的最大值,然后,第一个返回值是最大值所形成数组,第二个返回值是最大值所在的索引。这一个技巧在机器学习的分类任务中很常用,比如我们的分类任务是把数据分成m类,那么最终我们模型的输出是m维的,对于n个样本就是n*m,如果要判断我们的模型最终的分类结果,就是找n个样本里,每个样本m维输出的最大值索引,代表样本是这个类的可能性最大。我们可以方便地用这种方式找到最大值地索引:

其中test_out是模型输出,predict_y则是分类结果

另外一点要注意的是,numpy与pytorch不同,numpy的max()只有一个返回值:

也就是说,numpy.max()不会返回最大值所在的索引