首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Python,为什么在使用生成器yield时,.py和shell会得到不同的结果?

Python,为什么在使用生成器yield时,.py和shell会得到不同的结果?
EN

Stack Overflow用户
提问于 2016-06-12 13:52:05
回答 1查看 44关注 0票数 1

我正在学习协程,我发现了一个叫做“关于协程和并发的有趣课程”的pdf文件。这里有一个不可靠的例子:

代码语言:javascript
复制
def countdown(n):
print("Counting down from", n)
while n >= 0:
    newvalue = (yield n)
    # If a new value got sent in, reset n with it
    if newvalue is not None:
        n = newvalue
    else:
        n -= 1

我将它放在一个名为"bogus.py“的文件中,然后转到python外壳。

代码语言:javascript
复制
>>> from bogus import countdown
>>> c = countdown(5)
>>> for n in c:
...     print(n)
...     if n == 5:
...         c.send(3)
...
Counting down from 5
5
3
2
1
0
>>>

是的,我得到了5 3 2 10...但是当我把这些语句放入bogus.py中时,我得到了不同的结果...

代码语言:javascript
复制
def countdown(n):
print("Counting down from", n)
while n >= 0:
    newvalue = (yield n)
    # If a new value got sent in, reset n with it
    if newvalue is not None:
        n = newvalue
    else:
        n -= 1

c = countdown(5)
for n in c:
    print(n)
    if n == 5:
        c.send(3)

然后..。

代码语言:javascript
复制
$ python bogus.py
Counting down from 5
5
2
1
0

我得到了5210...!3在哪里?我很困惑,我真的不知道为什么.请帮帮我,并为我的英语道歉。

哦,我还发现如果我在shell代码中做了一点修改,那么我会得到:

代码语言:javascript
复制
>>> from bogus import countdown
>>> c = countdown(5)
>>> for n in c:
...     print(n)
...     if n == 5:
...         k = c.send(3)
...
Counting down from 5
5
2
1
0
>>>
EN

回答 1

Stack Overflow用户

发布于 2016-06-12 14:03:24

在交互模式下,Python会自动打印计算结果不是None的任何表达式语句的repr。这不包括函数和类中的表达式语句,但包括循环中的表达式语句,例如:

代码语言:javascript
复制
>>> for n in c:
...     print(n)
...     if n == 5:
...         c.send(3)  # <- right here

这就是交互模式下3的来源。就我个人而言,我从来没有遇到过这种行为是可取的。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37771137

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档