python生成器学习心得

关于生成器的优秀教程有很多。看了不少教程后以为弄明白生成器是怎么回事了,结果对廖雪峰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)步骤以此类推。










你可能感兴趣的:(python生成器学习心得)