生成器函数
'''
yield类似于return
相同:
都返回出去一个值
不同:
yield每次返回时, 会记录当前执行的位置
等下次调用生成器, 会从该位置向下走
return 直接终止函数
'''
# 2. 生成器函数
def mygen():
print('one')
yield 1
print('two')
yield 2
print('three')
yield 3
# 创建生成器对象
gen = mygen()
# 使用next
res = next(gen)
'''
首先初始化生成器, 返回一个生成器对象
第一次调用: 执行print('one'), yield返回1,
暂停记录当前位置
第二次调用: 执行print('two'), yield返回2,
暂停记录当前位置
第三次调用: 执行print('three'), yield返回3,
暂停记录当前位置,
此时生成器已经不能在返回数据, 再次调用就会报错
'''
生成器写斐波那契数列?
def fbnq(max_len):
a = 0
b = 1
i = 0
while i < max_len:
yield b
a, b = b, a + b
# yield a
i += 1
gen = fbnq(10)
for i in gen:
print(i)
send
'''
next和send的区别:
next: 只能取值
send: 能取本次yield的返回值,
也能给上次yield传入值.
send注意点:
第一个send不能给yield传值, 默认写None
最后一个yield接收不到send的发送值
'''
def mygen():
print('start')
res = yield 1
print(res)
# res是send第二次的传入值, yield把2返回给send
res = yield 2
print(res)
res = yield 3
print(res)
# 初始化生成器, 获得生成器对象
gen = mygen()
# 第一次调用, send传入None
yield_res = gen.send(None)
yield_res = gen.send('send1')
yield_res = gen.send('send2')
# 此时生成器已经没有数据, 再次调用就会报错
# yield_res = gen.send('send3')
# send和next可以混合使用
gen = mygen()
yield_res = gen.send(None)
yield_res = next(gen)
yield_res = next(gen)
yield from
把可迭代对象变成一个迭代器返回
def mygen():
listvar = ["鼎泰亚", "李楠", "陈根基", "陈元勇"]
yield from listvar
gen = mygen()
for i in gen:
print(i)