为什么print“ text {}”formatyield i是无效的语法,而print“ text {}”formatyield i是有效的?

问题描述

遇到此代码时,我正在对selectkbest函数进行this这样的问题

def coroutine():
    for i in range(1,10):
        print("From generator {}".format((yield i)))
c = coroutine()
c.send(None)
try:
    while True:
        print("From user {}".format(c.send(1)))
except stopiteration: pass

您可以看到作者在braces附近使用了yield i;我不明白为什么需要它。

str.format()的{​​{3}}没有提到有关format()参数的任何类型。我确信我不知道yield语句是做什么的,或者在调用它时会生成生成什么类型​​的事实引起了我的困惑。

您能帮我理解为什么在str.format函数调用中需要在括号周围加上括号吗?

编译器不是很有帮助,所以我不得不问这个问题

In [1]: def coroutine():
   ...:     for i in range(1,10):
   ...:         print("From generator {}".format(yield i))
   ...: c = coroutine()
   ...: c.send(None)
   ...: try:
   ...:     while True:
   ...:         print("From user {}".format(c.send(1)))
   ...: except stopiteration: pass
  File "<ipython-input-1-024981190f27>",line 3
    print("From generator {}".format(yield i))
                                         ^
SyntaxError: invalid Syntax

解决方法

referenced generator article中,您可以阅读:

我建议您始终在yield表达式两边加上括号 当您使用返回值进行操作时,如上 例。括号并非总是必需的,但是更容易 总是添加它们,而不必记住何时需要它们。 (PEP 342解释了确切的规则,即yield-expression 必须始终加上括号,除非它出现在顶层 表达式在作业的右侧。

因此,由于使用了yield i的返回值,并且yield i不是赋值右侧的顶级表达式,因此必须将其括起来。

此外,此答案还有更多信息:https://stackoverflow.com/a/37845447/4962858