【问题标题】:What's the difference between 'r = yield n' and 'r = (yield n)'?'r = yield n' 和 'r = (yield n)' 有什么区别?
【发布时间】:2019-04-09 02:27:14
【问题描述】:

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

>>> 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”类型,而不是元组类型。 我真的很困惑,这两个代码之间有什么区别? 好像没什么区别。

【问题讨论】:

    标签: python python-3.x coroutine


    【解决方案1】:

    没有区别,可以直接用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())))])"
    

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

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

    【讨论】:

      【解决方案2】:

      好像没什么区别。

      你是对的——根本没有区别。

      r = (yield n) 赋值只是有一些多余的括号。 这很像分配four = 1 + (1 + 1) + 1;括号不会改变任何东西。

      如果您想要一个 1 元组,请使用逗号:

      >>> r = 6,
      >>> r
      (6,)
      

      随意添加括号,例如(6,), 如果你觉得你应该注意你的表达式是一个元组这一事实。

      【讨论】:

        【解决方案3】:

        没有区别。括号告诉解释器首先计算这个语句。当解释器读取r = yield n时,会先计算yield n,然后赋值给r。它已经先计算出产量 n,所以不需要括号。如果你想让它成为一个元组,你可以使用这个代码r = (yield n,)

        【讨论】:

          猜你喜欢
          • 2011-04-18
          • 1970-01-01
          • 2013-03-04
          • 2010-11-19
          • 2011-04-28
          • 1970-01-01
          • 2016-06-01
          • 2017-01-09
          • 2017-09-22
          相关资源
          最近更新 更多