关于生成器的优秀教程有很多。看了不少教程后以为弄明白生成器是怎么回事了,结果对廖雪峰pyhon教程协程一课中生成器案例(
点击打开链接)和
类似的生成器案例(点击打开链接)没看懂。后来又看了《python生成器详解》(
点击打开链接)一文对send()方法的阐述,才理解了上述的两个案例。本文是对send()方法的进一步补充(若本人理解错误,烦请大家指正)。以下为一个生成函数案例,引用自《python生成器详解》中的例子,并稍作了修改。
# --*-- coding: utf-8 --*--
import random, time
def echo(value=None):
while True:
a = (yield value)
print("The a is", a)
print ('The value is', value)
if value:
value += 1
print ('The value is', value)
g = echo(1)
print g.next()
print g.send(3)
print g.send(8)
print g.send(10)
。以下为代码调试
1
('The a is', 3)
('The value is', 1)
('The value is', 2)
2
('The a is', 8)
('The value is', 2)
('The value is', 3)
3
('The a is', 10)
('The value is', 3)
('The value is', 4)
4
当调用g.next()时,执行yield value 生成1,函数暂停并返回1,注意此时函数
不会执行“将1附给变量a”。接着调用
g.send(3),接下来的函数执行步骤依次为:(1)参数3作为表达式
(yield value)的值,并附给变量a返回,函数yield恢复从执行a=yield表达式开始。(2)上次函数暂停时value=1,将此value代入
value += 1,得到value=2(#解释了输出
('The value is', 1)
('The value is', 2)
)。(3)执行yield value 生成2,函数暂停并返回2,注意此时函数仍不会执行“将2附给变量a”。后面的
g.send(8)和
g.send(10)步骤以此类推。