Python中的yield和send

Python中的yield和send

创建生成器yield

1、第一种方法:

a = (x for x in range(5))
print(a)
print(next(a))
print(a.__next__())
for i in a:
    print(i)

输出为:

<generator object <genexpr> at 0x108827410>
0
1
2
3
4

2、第二种方法

def fun(n):
    for i in range(n):
        yield i
b = fun(5)
print(b)
print(next(b))
print(b.__next__())

输出为:

<generator object fun at 0x107a21e60>
0
1

可以看到,调用next方法后输出第一个结果,然后进行for循环的后面的。

生成器的send方法

def fun(n):
    for i in range(n):
        k = yield i
        print(k)
b = fun(5)
b.send(None)    # 或者next(b)/b.__next__()
b.send('a')
b.send('b')

输出结果:

a
b

总结

yield的用法是:记住上一次返回时在函数体中的位置,调用此函数从上一次返回的位置开始执行。
send的用法时:send()方法返有一个参数,该参数指定的是上一次被挂起的yield语句的返回值。
区别:当send()的参数为None时,正好与next方法等价。在调用send()方法时,要么先调用一次next()到函数挂起的位置,或者直接send(None)。

yield form方法

yield from方法用于重构生成器

def fib(n):
    for i in range(n):
        k = yield i
        print(k)

import random
def copyfib(n):
    print('I am copy from stupid fib')
    yield from fib(n)
    print('Copy end')
N = 20
csfib = copyfib(N)
fib_res = next(csfib)
while True:
    print(fib_res)
    try:
        fib_res = csfib.send(random.uniform(0, 0.5))
    except StopIteration:
        break

输出结果:

I am copy from stupid fib
0
0.05186524665169567
1
0.08687317431928088
2
0.2721640235628532
3
0.08568872335803795
4
0.15850810860489845
Copy end

猜你喜欢

转载自blog.csdn.net/qq_1290259791/article/details/80994192
今日推荐