我在
python 3中尝试使用生成器并编写了这个相当人为的生成器:
def send_gen():
print(" send_gen(): will yield 1")
x = yield 1
print(" send_gen(): sent in '{}'".format(x))
# yield # causes StopIteration when left out
gen = send_gen()
print("yielded {}".format(gen.__next__()))
print("running gen.send()")
gen.send("a string")
输出:
send_gen(): will yield 1
yielded 1
running gen.send()
send_gen(): sent in 'a string'
Traceback (most recent call last):
File "gen_test.py", line 12, in
gen.send("a string")
StopIteration
所以gen .__ next __()到达x = yield 1并且得到1.我认为x将被赋值为None,然后gen.send()会查找下一个yield语句,因为x = yield 1是“used”,然后得到一个StopIteration.
相反,似乎发生的事情是x被发送“一个字符串”,打印出来,然后python尝试寻找下一个产量并得到一个StopIteration.
所以我试试这个:
def send_gen():
x = yield 1
print(" send_gen(): sent in '{}'".format(x))
gen = send_gen()
print("yielded : {}".format(gen.send(None)))
输出:
yielded : 1
但现在没有错误.在将x分配给None之后,send()似乎没有尝试查找下一个yield语句.
为什么行为略有不同?这与我如何启动发电机有关吗?