迭代器
生成器(generator)
1 生成器是一种特殊的迭代器,它比迭代器更优雅,编写更加简洁。
2 生成器(Generator),可以一边循环一边计算后续的元素,这样就不必创建完整的list,从而节省大量的空间。
3 通过next(generator)方法打印数据,generator保存的是算法,每次调用next(),就计算出下一个元素的值,直到计算到最后一个元素,没有更多的元素时,抛出StopIteration的错误。
创建生成器
方法1:只要把一个列表生成式的 [ ] 改成 ( )
G=(x*2 for x in range(6)) # 生成器对象
# 输出方式:
# 1.
# for i in G:
# print(i)
# 2.
while True:
try:
print(next(G))
except:
break
方法2 使用yield创建生成器
# -*-coding:utf-8-*-
def gen(n):
"""斐波那契"""
i, a, b = 0, 0, 1
while i < n:
a, b = b, a + b
i += 1
yield b
g = gen(10)
while True:
try:
print(next(g))
except:
break
要点:
1. 假如函数中有yield,则不再是函数,而是生成器
2. yield 会产生一个断点,挂起函数, 且保存当前状态
3. 若yield后面紧接着一个数据,就会把数据返回,作为next打印的下一个值
4.可以通过next或send唤醒生成器,让生成器从断点处继续执行,g.send(None)等价于next(g)
5.send方法可在唤醒的同时向断点处传入一个附加数据:print("返回值:",gen.send("python"))
6 这3种方法都可以生成下一个数据
g = gen(10) # g是生成器
print(g.__next__())
print(next(g))
print(g.send(None))