V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
saximi
V2EX  ›  Python

请教一个关于生成器的问题

  •  
  •   saximi · 2017-07-30 17:36:59 +08:00 · 1924 次点击
    这是一个创建于 2698 天前的主题,其中的信息可能已经有所发展或是发生改变。
    def gen():
    for i in range(10):
    print('i=',i)
    X = yield i
    print('X=',X)

    G = gen()
    print('next(G)=',next(G)) #语句 1
    print('G.send(77)=',G.send(77)) #语句 2
    print('G.send(88)=',G.send(88)) #语句 3
    print('next(G)=',next(G)) #语句 4

    输出如下:
    i= 0
    next(G)= 0
    X= 77
    i= 1
    G.send(77)= 1
    X= 88
    i= 2
    G.send(88)= 2
    X= None #为何会有这个输出?
    i= 3
    next(G)= 3

    对于上面生成器的执行,我对各语句的执行情况理解如下:
    语句 1,执行到 X=yield 0 时挂起,返回 i(即 0),进入主程序体的下一条语句(即下面的语句 2 )。
    语句 2,先恢复 X=yield 0 的环境,然后将上一条语句中的 X 从 0 修改为 77,并依次执行 print ('X=',77 )、print('i=',1),直到遇到 X=yield 1 语句时再度挂起,挂起时返回 i(即 1)。
    语句 3,先恢复 X=yield 1 的环境,然后将上一条语句中的 X 从 1 修改为 88,并依次执行 print ('X=',88 )、print('i=',2),直到遇到 X=yield 2 语句时再度挂起,挂起时返回 i(即 2)。
    语句 4,因为语句 3 是执行到 X=yield 2 时才挂起,挂起时 X=2。所以现在一进入语句 4,就应该执行 print('X=',2),但是为何却输出 X=None ? 这点我不明白,恳请大家指点,谢谢!
    9 条回复    2017-07-31 10:21:11 +08:00
    wisej
        1
    wisej  
       2017-07-30 20:54:26 +08:00
    next(G) 等价于 G.send(None)
    ErnestChan
        2
    ErnestChan  
       2017-07-30 21:01:52 +08:00 via Android   ❤️ 1
    一不小心看成了“生殖器”。心里想是不是 JJ 出了什么问题。调侃一下,楼主莫怪。
    lxml
        3
    lxml  
       2017-07-30 21:21:50 +08:00
    @wisej #1 臣附议
    saximi
        4
    saximi  
    OP
       2017-07-30 23:29:58 +08:00
    @wisej 谢谢,既然这样的话,我要如何才能吧下一个 i 正确赋值给 X 呢,用 next(G)已经做不到了。
    saximi
        5
    saximi  
    OP
       2017-07-30 23:31:06 +08:00
    @ErnestChan 哈哈,我倒希望是生殖器了,这样研究起来不会那么枯燥
    johnny23
        6
    johnny23  
       2017-07-30 23:35:18 +08:00 via iPhone
    @ErnestChan 我也是 !!!我怎么了
    wisej
        7
    wisej  
       2017-07-31 00:05:36 +08:00
    @saximi 把 下一个 i 正确赋值给 X,不是很懂你的需求。。能讲得更清楚点么
    saximi
        8
    saximi  
    OP
       2017-07-31 00:45:03 +08:00
    @wisej 没问题了,我想明白了,谢谢!
    rootx
        9
    rootx  
       2017-07-31 10:21:11 +08:00 via iPhone
    @ErnestChan 妈蛋 我也看成这个了…
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5313 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 22ms · UTC 08:38 · PVG 16:38 · LAX 00:38 · JFK 03:38
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.