Python学习笔记(二)

1.__init__()__new__()方法

  • __new__()方法是静态方法,而__init__()为实例方法
  • __new__()方法一般需要返回类的对象,当返回类的对象十五讲自动调用__init__()方法进行初始化,如果没有类的对象放回,则__init__()方法不会被调用
  • 当需要控制实例创建的时候可使用__new__()方法,而控制实例初始化的时候使用__init__()方法
  • 一般情况下不需要覆盖__new__()方法,但当子类集成自不可变类型,如strint或者tuple的时候,往往需要覆盖该方法

2.迭代器

迭代器对象要求支持迭代器协议的对象,在Python中,支持迭代器协议就是实现对象的__iter__()next()方法,前者返回的是一个迭代器,后者返回当前的元素,并指向下一个元素的位置。

1
2
3
4
5
6
7
8
9
10
11
12
13
class Fib(object):
def __init__(self):
self._a = 0
self._b = 1
def __iter__(self):
return self
def next(self):
self._a,self._b = self._b, self._a + self._b
return self._a
for i,f in enumerate(Fib()):
print f
if i > 10:
break

python中可用的迭代器的标准库有itertools

3.生成器

生成器,按照一定的算法生成一个序列。生成器实现了迭代器协议,可以一定程度上看做迭代器。Python中有专门的关键字yield实现生成器。

1
2
3
4
5
6
7
8
def fib(n):
a,b = 1,1
while a < n:
yield a
a,b = b,a+b
for i, f in enumerate(fib(10)):
print f

递归生成器的例子

1
2
3
4
5
6
7
8
9
10
11
def permutations(li):
if len(li) == 0:
yield li
else:
for i in range(len(li)):
li[0], li[i] = li[i], li[0]
for item in permutations(li[1:]):
yield [li[0]] + item
for item in permutations(range(3)):
print item

参考资料

编写高质量代码:改善Python程序的91个建议