迭代器必须实现两个方法,一个是__iter__,一个是__next__方法。__iter__方法用于初始化迭代器,__next__方法用于生成值。我动手实践了一下:
# _*_ coding:utf-8 _*_
class QuadraticGenerator:
def __iter__(self):
self.__n = 1
return self
def __next__(self):
n = self.__n
self.__n+=1
return n * n
if __name__ == '__main__':
for i in QuadraticGenerator():
print(i, end=',')
if i > 100:
break
这个简单的迭代器不断输出平方,永远不会终止,所以我用了一个if去终止,输出结果如下:
1,4,9,16,25,36,49,64,81,100,121,
列表生成式是python的语法糖,可以简洁地基于一个迭代器生成一个列表。如:
# _*_ coding:utf-8 _*_
if __name__ == '__main__':
a = [x * x for x in range(10)]
print(type(a))
for x in a:
print(x, end=',')
&esmp;这种语法创建了一个list,输出为:
<class 'list'>
0,1,4,9,16,25,36,49,64,81,
如果将生成式的方括号改成小括号,那么就是一个生成器表达式了。我们可以试一试:
# _*_ coding:utf-8 _*_
if __name__ == '__main__':
a = (x * x for x in range(10))
print(type(a))
for x in a:
print(x, end=',')
循环时效果和list一样,但是类型是迭代器,输出如下:
<class 'generator'>
0,1,4,9,16,25,36,49,64,81,
生成器是一个特殊的函数,return关键字变成了yield。每次迭代后会保存函数运行的位置,下次迭代时从保存的位置继续运行。说了这么多不如一个例子:
def seq():
yield 1
yield 2
yield 3
yield 4
yield 5
if __name__ == '__main__':
for i in seq():
print(i, end=',')
输出结果:
1,2,3,4,5,
&esmp;通过这个例子,就可以很容易理解网络上那些yield关键字的教程文章了。那么最开始的产生平方的例子就很容易改写了:
def quadratic(n):
for i in range(n):
yield i * i
if __name__ == '__main__':
for i in quadratic(10):
print(i, end=',')
比创建一个类的写法简洁多了,输出如下:
0,1,4,9,16,25,36,49,64,81,