【发布时间】:2018-05-30 18:27:19
【问题描述】:
有很多关于类似问题的好问题,例如
python generator "send" function purpose?
What does the "yield" keyword do?
让我们回到“发送”的定义:
恢复执行并将一个值“发送”到生成器函数中。 value 参数成为当前 yield 表达式的结果。 send() 方法返回生成器产生的下一个值,或者 如果生成器退出而没有产生另一个,则引发 StopIteration 价值。当调用 send() 启动生成器时,必须调用 以 None 作为参数,因为没有 yield 表达式 可以收到价值
但我觉得我错过了一些重要的事情。这是我的示例,其中包含 3 个 send 调用,包括带有 None 值的初始调用,用于初始化生成器:
def multiplier():
while True:
m = yield # Line #3
print('m = ' + str(m)) # Line #4
yield str(m * 2) # Line #5
yield str(m * 3) # Line #6
#------------------------
it = multiplier()
print('it.send(None): ')
print(str(it.send(None)))
print('--------------')
print('it.send(10): ')
print(it.send(10))
print('--------------')
print('it.send(100): ')
print(it.send(100))
print('--------------')
这是一个输出:
it.send(None):
None
--------------
it.send(10):
m = 10
20
--------------
it.send(100):
30
--------------
问题:
当我在第 5 行中使用
it.send(10)时会发生什么。要是我们 按照定义,生成器继续执行。发电机 接受10作为输入值并在当前yield expression中使用它。在我的例子中是yield str(m * 2),但是m设置为10。什么时候发生的。是不是因为 第 3 行中m和yield之间的引用?第 6 行
it.send(10)发生了什么,为什么输出仍然是30? 这是否意味着我上一个问题中的参考仅有效 一次?
注意:
如果我更改了示例并在第 5 行和第 6 行之间添加了一行 m = yield,然后在 print(it.send(10)) 之后使用 next(it) - 在这种情况下,输出开始有意义:20 和 300
【问题讨论】:
-
您的代码中只有一个
yield表达式:m = yield。即使您发送了一个值,m也不会被重新分配,直到while循环的下一次迭代。 -
@vaultah 什么时候设置?在第一次或第二次
send通话之后?第一个send只是yield-s 和第二个更改/设置yield值并将其分配给m,然后在第二个“yield”调用后停止? -
@Axalix 在第一个
send之前,生成器中没有执行任何操作。第一次调用send时,生成器会一直执行,直到输入m = yield中的yield。在第二个send,yield返回参数send并继续执行直到输入yield str(m * 2)。 -
@MichaelButscher 这对我来说很有意义,但是 Python 在什么时候为
m赋值?第二个send电话会发生这种情况吗? -
@Axalix 是的。第二个
send让yield表达式返回参数值,然后将值分配给m
标签: python python-3.x