导航

生成器函数_yield_yield from_send

Posted on 2019-03-28 23:37  菜花教授  阅读(107)  评论(0编辑  收藏  举报

生成器函数

 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)