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