Python生成器next方法和send方法

next方法:生成器的next方法获取yield语句返回的下一个值。也就是说,next函数返回的是yield后面的值,yield b(为了更加直观,可以加括号)

In [78]: def fib(n):
    ...:     i,a,b=0,0,1
    ...:     while i < n:
    ...:         yield b
    ...:         a,b = b,a+b
    ...:         i += 1
    ...:
In [85]: f=fib(6)

In [86]: next(f)
Out[86]: 1

In [87]: next(f)
Out[87]: 1

In [88]: next(f)
Out[88]: 2

In [89]: next(f)
Out[89]: 3

In [90]: next(f)
Out[90]: 5

In [91]: next(f)
Out[91]: 8

In [92]: next(f)
---------------------------------------------------------------------------
StopIteration                             Traceback (most recent call last)
<ipython-input-92-aff1dd02a623> in <module>()
----> 1 next(f)

send方法:
对于send方法,我有点理解不了,看了这个例子感觉懂了一点。参考链接:https://www.jb51.net/article/113154.htm
这篇文章里面是这样讲的: 这里yield 1整体被视为一个表达式,你send的内容会作为这个表达式的值,随便你左边用什么东西接收或者不接收,总之yield就是你send进来的那个东西。这个表达式变成你send进来后的东西后继续执行,再次遇到yield,输出yield后面跟着的表达式。

那么我可不可以这样理解,next(g)获取了(i+1)的值,也就是1,函数到这里中断。g.send(111)向yield (r+1) 发送111,111作为yield (i+1)的值被赋值给receive,函数继续执行,打印出“extra111”,一次循环后遇到yield,再次中断。

In [94]: def generator():
    ...:   while True:
    ...:     i = 0
    ...:     receive=yield (i+1)
    ...:     print('extra'+str(receive))
    ...:  
    ...: g=generator()
    ...: print(next(g))
    ...: print(g.send(111))
    ...: print(next(g))
    ...:
1
extra111
1
extraNone
1
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值