- 创建List和generator的区别仅在于最外层的[]和()
- 如果一个函数定义中包含yield关键字,那么这个函数就不再是一个普通函数,而是一个generator
- generator保存的是算法,每次调用next(g),就计算出g的下一个元素的值,直到计算到最后一个元素,没有更多的元素时,抛出StopIteration的错误。
- 生成器既实现了迭代器接口,也实现了可迭代接口 。也就是说g.iter() is g
def f():
print('in f(),1')
yield 1
print('in f(),2')
yield 2
print('in f(),3')
yield 3
g = f()
print(g.__next__())
print(g.__next__())
print(g.__next__())
print(g.__next__())
第四次调用时,超出停止迭代异常。
不过呢,我们创建了一个generator后,基本上永远不会调用next(),因为太麻烦了。所以,通过for循环来迭代它,并且不需要关心StopIteration的错误。
g = f()
for x in g:
print(x)
print(g.__iter__() is g)
返回true
解决方案:
iter在调用的时候并不会直接运行,而是返回一个包含next()方法的生成器对象。
class PrimeNumbers:
def __init__(self,start,end):
self.start = start
self.end = end
def isPrimeNum(self,k):
if k < 2:
return False
for i in range(2,k):
if k % i == 0:
return False
return True
def __iter__(self):
for k in range(self.start,self.end + 1):
if self.isPrimeNum(k):
yield k
n = 0
for x in PrimeNumbers(1,1235):
print(x)
n = n + 1
print(n)
了解生成器可以看看廖老师的博客,很详细。
http://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000/0014317799226173f45ce40636141b6abc8424e12b5fb27000