【问题标题】:Why does the generator send method print results to the screen without a call to the print function?为什么生成器将方法打印结果发送到屏幕而不调用打印函数?
【发布时间】:2017-07-26 03:37:31
【问题描述】:

请参阅下面的控制台会话:

>>> def f(x):
...  for _ in range(10):
...   y = yield
...   x.append(y)
...   yield x
...
>>> x = []
>>> g = f(x)
>>> for _ in g:
...  g.send(1)
...
[1]
[1, 1]
[1, 1, 1]
[1, 1, 1, 1]
[1, 1, 1, 1, 1]
[1, 1, 1, 1, 1, 1]
[1, 1, 1, 1, 1, 1, 1]
[1, 1, 1, 1, 1, 1, 1, 1]
[1, 1, 1, 1, 1, 1, 1, 1, 1]
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1]

请注意,.send() 方法会导致生成器输出打印到屏幕上。我相信这是.send() 方法导致的,因为如果生成器输出为None,则屏幕上不会打印任何内容(None 的常见情况)。

>>> x = []
>>> g = f(x)
>>> for i in g:
...  g.send(1)
...
>>> x
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1]

此外,如果我们只是在不发送任何输入的情况下进行迭代,则屏幕上不会打印任何内容(上述f 的任一版本都会出现):

>>> x = []
>>> g = f(x)
>>> for i in g:
...  pass
...
>>> 

有人可以解释为什么会发生这种输出到屏幕的情况吗?我在想这里发生了一些有趣的事情,但我不知道它是什么。

为了澄清,我想这里没有什么比你这样做更复杂的事情发生了:

>>> []
[]

控制台只是重复一个表达式的结果。但是为什么在上面的例子中控制台表现得好像有重复的表达式输入?

【问题讨论】:

  • 最小示例:>>> while True: 0
  • @JoshLee 这解释了一切。幸运的是,我知道最好不要这样做。 :)

标签: python generator yield


【解决方案1】:

来自Python docs

send() 方法返回生成器产生的下一个值,或者 如果生成器退出而没有产生另一个,则引发 StopIteration 价值。

每次调用send() 方法时,它都会返回生成器产生的下一个值。

在交互式终端中,这些返回的结果会打印到您的屏幕上。没有什么太神奇的了。

【讨论】:

  • 有道理。我想我不知道为什么我觉得这很令人惊讶,但我做到了。
【解决方案2】:

我觉得自己很笨。答案很简单!这是一个表达式:

g.send(1)

...就像任何其他表达式一样,它将被打印到控制台-如果在循环内多次:

>>> 0
0
>>> for _ in range(2):
...  0
... 
0
0

【讨论】:

    猜你喜欢
    • 2022-11-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-13
    • 1970-01-01
    相关资源
    最近更新 更多