1
函数说明:在函数中写一个字符串说明,用__doc__属性访问
def cal(x):
'Calculate the square of x'
return x * x
print(cal.__doc__)
2
列表作为参数传入函数时会改变列表中的值,类似指针,需要采用深拷贝确保原始列表不会改变。可以采用切片的方法,如n = name[:],这样n能获得name的全部值且地址不同。字典也会改变,只要是可改变的数据类型一般都会改变,元组和数不会改变。
3
‘zhao ming xu’.split(),会根据空格划分。如果指定了划分分隔符则按照指定的划分。
4
zip用法,zip(x,y),返回的是一个zip 对象,list(zip(x,y))后返回一个由x,y各个元素对应组成的元组形成的列表,比如x=[1,2,3],y=[4,5,6],list(zip(x,y))返回[(1,4),(2,5),(3,6)].
5
*和**的收集和分配参数的作用。
例如收集参数 def func(x,y,z=3,*args,**kwargs),调用func(1,2,3,4,5,6,foo=‘f’,bar=‘bar’),args是(4,5,6)组成的元组,kwargs={‘foo’=‘f’,‘bar’=‘bar’}字典类型。
分配参数,add(x,y,z),params = [1,2,3],add(*params),将params分别赋值给x,y,z.
func(x,y,z,foo=2,bar=3),
params = [1,2,3]
kwparams = {
‘foo’=‘foo’,
‘bar’=‘bar’
}
func(*params,**kwparams),将分别分配给函数的各个参数
在定义函数的时候使用了*,**的话在分配时比较麻烦,比如func(*args,**kwargs),args=[1,2,3],kwargs = {‘foo’=2,‘bar’=10},在传入参数时仍然需要*,func(*args,**kwargs),如果是定义时func(args,kwargs),则传入时func(args,kwargs)
6
vars()返回一个字典,包含各种变量、函数等python对象的键值对,locals(),globals()分别返回局部和全局变量的键值对。如需在函数内部方位和形参同名的全局变量,可以使用globals()[‘name’]。
重新关联全局变量,
x = 1
def func(): global x return x+1
func()
x会成为2
7
class的私有属性和方法通过两个下划线实现,从而对该类的属性和方法完全隐藏,外部不能访问。类内部仍然可以访问。一般打一个下划线以警示不要从外部修改。
8
abc模块里面的abstractmethod,抽象方法的意思是抽象类的方法,其必须在抽象类的子类中实现,抽象类不能(至少不应该)实例化抽象类的使用均应该作为基类存在。
9
所谓魔法方法(magic method)一般指的就是类中有两个下划线构成的,如构造函数__init__等等。
10
魔法方法,getitem,setitem,delitem,其中delitem是在调用del函数时使用,getitem是在利用[]取元素时使用。
11
模块collections中包含很多抽象和具体的类可以用来作为基类。也可以用内置类型作为基类,如果要使用基类的方法,则调用super().__init__(), super().__getitem__(),注意传入的参数。
class counterlist(list):
def __init__(self,*args):
super().__init__(*args)
self.counter = 0
def __getitem__(self,index):
self.counter += 1
return super().__getitem__(index)
12
静态方法和类方法,staticmethod和classmethod,都可以由对象直接调用,也可以用实例调用,静态方法没有类似self的参数,类方法有,一般命名为cls,其关联到类。
class myclass():
@staticmethod
def smeth():
print('this is the static method')
@classmethod
def cmeth(cls):
print('this is the class method')
if __name__ == '__main__':
m = myclass()
m.smeth()
m.cmeth()
myclass().cmeth()
myclass().smeth()
13
hasattr和getattr可以获取类的属性和方法
14 迭代器和生成器
更正规的定义是,实现了方法__iter__的对象是可迭代的,而实现了方法__next__的对象
是迭代器。
通过对可迭代对象调用内置函数iter,可获得一个迭代器。
it = iter([1, 2, 3])
next(it)
1
next(it)
2
可迭代对象和迭代器不是一个意思。
生成器是一种使用普通函数语法定义的迭代器,有yield的是生成器,迭代器一般用类来创建,生成器用简单的函数创建。
生成器就是通过函数生成一个迭代器,从而利用该迭代器