您的位置:首页 > 编程语言 > Python开发

python-7-如何使用生成器函数实现可迭代对象?

2017-05-02 17:11 971 查看


创建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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: