生成器是一类特殊的迭代器
创建生成器最简单的方法是吧列表生成式的”[]”改成”()”
(x*2 for x in range(10))
可以按照迭代器的方法来使用,通过next()、list()、for循环使用
使用生成器来完成菲波拉切数列更加简便
def fib(n):
current = 0
num1, num2 = 0, 1
num = num1
num1,num2 = num2, num1+num2
current += 1
yield num
return 'done'
f = fib(5)
print(next(f))
print(next(f))
print(next(f))
print(next(f))
print(next(f))
在生成器中,把return换成了yield,有了yield 的函数就不再是一个函数,而是一个生成器了
yield关键字又两点作用:
保存当前函数的运行状态,暂停执行,讲生成器挂起
将yield关键字后面的值作为返回值,起到return的作用
可以使用next()函数让生成器从暂停处继续执行,唤醒生成器
除了next()函数可以还需改生成器之外,send()函数也可以唤醒生成器,使用send唤醒的好处是可以在唤醒的同时加上一条附加数据
def gen():
n = 0
while n < 10:
temp yield n
print(temp)
n += 1
f = gen()
f.send("hahah")
-------------------
结果:
hahah
1
除了next()、send()还有__next__()
f.__next__()