gpt4 book ai didi

python - 'r = yield n' 和 'r = (yield n)' 有什么区别?

转载 作者:太空宇宙 更新时间:2023-11-04 00:01:25 25 4
gpt4 key购买 nike

我正在学习协程并尝试了一些教程,我找到了这段代码。

>>> def g(n):
... while n >= 0:
... r = (yield n)
... if r:
... n = r
... else:
... n -= 1

我问自己为什么会有r = (yield n),然后我修改了如下代码,

>>> def f(n):
... while n >= 0:
... r = yield n
... if r:
... n = r
... else:
... n -= 1
...
>>>

之后我猜测当调用send(value)时,r = yield n会返回值,而r = (yield n) 会返回一个元组,例如 (value,)。

所以我单独测试了代码,结果是:

>>>
>>> gc = g(5)
>>> gc.send(None)
5
>>> type(gc.send(4))
<class 'int'>
>>>

>>> fc = f(5)
>>> fc.send(None)
5
>>> fc.send(4)
4
>>> type(fc.send(4))
<class 'int'>

两个结果都是“int”类型,不是元组类型。我真的很困惑,这两个代码之间的区别是什么?看起来完全没有区别。

最佳答案

没有区别,可以直接用parser验证:

>>> source1 = "r = (yield n)"
>>> source2 = "r = yield n"
>>> import ast
>>> ast.dump(ast.parse(source1))
"Module(body=[Assign(targets=[Name(id='r', ctx=Store())], value=Yield(value=Name(id='n', ctx=Load())))])"
>>> ast.dump(ast.parse(source2))
"Module(body=[Assign(targets=[Name(id='r', ctx=Store())], value=Yield(value=Name(id='n', ctx=Load())))])"

您也可以通过检查 disassembly 以更迂回的方式得出相同的结论。 fg

非空元组需要逗号,参见 When are parentheses required around a tuple?

关于python - 'r = yield n' 和 'r = (yield n)' 有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55584256/

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