生成器函数
1 '''
2 yield类似于return
3
4 相同:
5 都返回出去一个值
6
7 不同:
8 yield每次返回时, 会记录当前执行的位置
9 等下次调用生成器, 会从该位置向下走
10
11 return 直接终止函数
12 '''
13
14
15 # 2. 生成器函数
16 def mygen():
17 print('one')
18 yield 1
19
20 print('two')
21 yield 2
22
23 print('three')
24 yield 3
25
26
27 # 创建生成器对象
28 gen = mygen()
29
30
31 # 使用next
32 res = next(gen)
33
34 '''
35 首先初始化生成器, 返回一个生成器对象
36
37 第一次调用: 执行print('one'), yield返回1,
38 暂停记录当前位置
39
40 第二次调用: 执行print('two'), yield返回2,
41 暂停记录当前位置
42
43 第三次调用: 执行print('three'), yield返回3,
44 暂停记录当前位置,
45
46 此时生成器已经不能在返回数据, 再次调用就会报错
47
48 '''
生成器写斐波那契数列?
1 def fbnq(max_len):
2 a = 0
3 b = 1
4
5 i = 0
6 while i < max_len:
7 yield b
8 a, b = b, a + b
9 # yield a
10 i += 1
11
12
13 gen = fbnq(10)
14 for i in gen:
15 print(i)
send
1 '''
2 next和send的区别:
3 next: 只能取值
4 send: 能取本次yield的返回值,
5 也能给上次yield传入值.
6
7 send注意点:
8 第一个send不能给yield传值, 默认写None
9 最后一个yield接收不到send的发送值
10 '''
1 def mygen():
2 print('start')
3 res = yield 1
4 print(res)
5
6 # res是send第二次的传入值, yield把2返回给send
7 res = yield 2
8 print(res)
9
10 res = yield 3
11 print(res)
12
13
14 # 初始化生成器, 获得生成器对象
15 gen = mygen()
16
17 # 第一次调用, send传入None
18 yield_res = gen.send(None)
19 yield_res = gen.send('send1')
20 yield_res = gen.send('send2')
21 # 此时生成器已经没有数据, 再次调用就会报错
22 # yield_res = gen.send('send3')
1 # send和next可以混合使用
2 gen = mygen()
3 yield_res = gen.send(None)
4 yield_res = next(gen)
5 yield_res = next(gen)
yield from
把可迭代对象变成一个迭代器返回
1 def mygen():
2 listvar = ["鼎泰亚", "李楠", "陈根基", "陈元勇"]
3
4 yield from listvar
5
6
7 gen = mygen()
8
9 for i in gen:
10 print(i)