【发布时间】: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 这解释了一切。幸运的是,我知道最好不要这样做。 :)