gpt4 book ai didi

python - 为什么 yield 表达式会崩溃?

转载 作者:太空狗 更新时间:2023-10-30 00:53:01 26 4
gpt4 key购买 nike

我四处乱逛,注意到下面的代码产生了一次值,而我期望它返回一个生成器对象。

def f():
yield (yield 1)
f().next() # returns 1

def g():
yield (yield (yield 1)
g().next() # returns 1

我的问题是 yield 表达式的 value 是什么,以及如果 yield 表达式崩溃,为什么我们允许嵌套 yield 表达式?

最佳答案

The value of the yield expression after resuming depends on the method which resumed the execution. If __next__() is used (typically via either a for or the next() builtin) then the result is None. Otherwise, if send() is used, then the result will be the value passed in to that method.

所以这样:

def f():
yield (yield 1)

等同于:

def f():
x = yield 1
yield x

在这种情况下(因为您没有使用 generator.send())等同于:

def f():
yield 1
yield None

您的代码只查看生成器生成的第一项。如果您改为调用 list() 来使用整个序列,您将看到我所描述的内容:

def f():
yield (yield 1)

def g():
yield (yield (yield 1))


print(list(f()))
print(list(g()))

输出:

$ python3 yield.py 
[1, None]
[1, None, None]

如果我们手动迭代生成器(正如您所做的那样),但是 .send() 它赋值,那么您可以看到 yield“返回”这个值:

gen = f()
print(next(gen))
print(gen.send(42))

输出:

$ python3 yield_manual.py 
1
42

关于python - 为什么 yield 表达式会崩溃?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52247537/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com