生成器就是生成迭代器对象的函数,除了可以使用生成式来创建一个生成器外,还可以在函数内部通过yield语句来实现生成器
yield语句
yield语句可以在函数内部多次返回值,与return不一样,return后,函数将会结束,yield语句在返回后,会记住函数内部状态,当下次再次执行函数的时候,会接着上次状态继续执行(记忆局部变量,循环)
def generator_iter():
yield 1
yield 2
yield 3
my_iter = generator_iter()
# 生成器可以被迭代
for i in my_iter:
print(i)
# 输出 1 2 3
# 通常情况下,当生成器迭代完成后,会自动close,可以选择手动关闭生成器
# my_iter.close()
generator_iter
称为生成器函数,执行后返回一个迭代器my_iter
,称为生成器
斐波拉契生成器
def fb_generate(n):
fb_lists = [1, 1]
for fb in fb_lists:
if len(fb_lists) < n:
fb_lists.append(sum(fb_lists[-2:]))
yield fb
生成20位斐波拉契数列
for fb in fb_generate(20):
print(fb)
yield from子迭代表达式
yield表达式也可以通过另一个子生成器生成一个新的迭代器
def generator_iter():
yield from range(10)
my_iter = generator_iter()
for i in my_iter: print(i)
# 输出0 1 2 3 4 5 6 7 8 9
生成器send方法
yield
语句除了可以返回迭代数据,还可以通过send
来接受数据
# 通过yield接受外部输入
def generator_send():
while True:
# 在此等待输入
n = yield
if n % 2 == 0:
print("%s 是 偶数" % n)
else:
print("%s 是非偶数" % n)
my_yield = generator_send()
# next到第一次yield
next(my_yield)
# 通过send向生成器函数发送数据
my_yield.send(10)
# 10 是 偶数
my_yield.send(11)
# 11 是非偶数
my_yield.close()
讨论区