我看不懂send
方法。我知道它是用来操作发电机的。但语法在这里:generator.send(value)
.
我不知何故无法理解为什么该值应该成为当前yield
表达式的结果。我准备了一个例子:
def gen():
for i in range(10):
X = yield i
if X == 'stop':
break
print("Inside the function " + str(X))
m = gen()
print("1 Outside the function " + str(next(m)) + '\n')
print("2 Outside the function " + str(next(m)) + '\n')
print("3 Outside the function " + str(next(m)) + '\n')
print("4 Outside the function " + str(next(m)) + '\n')
print('\n')
print("Outside the function " + str(m.send(None)) + '\n') # Start generator
print("Outside the function " + str(m.send(77)) + '\n')
print("Outside the function " + str(m.send(88)) + '\n')
#print("Outside the function " + str(m.send('stop')) + '\n')
print("Outside the function " + str(m.send(99)) + '\n')
print("Outside the function " + str(m.send(None)) + '\n')
结果是:
1 Outside the function 0
Inside the function None
2 Outside the function 1
Inside the function None
3 Outside the function 2
Inside the function None
4 Outside the function 3
Inside the function None
Outside the function 4
Inside the function 77
Outside the function 5
Inside the function 88
Outside the function 6
Inside the function 99
Outside the function 7
Inside the function None
Outside the function 8
好吧,坦率地说,这让我感到惊讶。
- 在文档中我们可以读到,当一个
yield
语句被执行时,生成器的状态被冻结并且 的值expression_list
被返回给next
的调用者。好吧,这似乎没有发生。为什么我们可以在里面执行if
语句和print
函数gen()
。 - 我如何理解为什么
X
函数内部和外部不同?好的。让我们假设将send(77)
77 传输到m
. 那么,yield
表达式变为 77。那么 是什么X = yield i
?函数内部的 77 在外部发生时如何转换为 5? - 为什么第一个结果字符串没有反映生成器内部发生的任何事情?
无论如何,你能以某种方式评论这些send
和yield
陈述吗?