Python 为什么print(";text{}";format(yield i))是无效语法,而print(";text{}";format((yield i))是有效语法?

Python 为什么print(";text{}";format(yield i))是无效语法,而print(";text{}";format((yield i))是有效语法?,python,yield,Python,Yield,当我遇到这段代码的时候,我正在经历一个关于函数的问题 def协同程序(): 对于范围(1,10)内的i: 打印(“从生成器{}”。格式((产量i))) c=协同程序() c、 发送(无) 尝试: 尽管如此: 打印(“从用户{}”。格式(c.send(1))) 除了停止迭代:通过 正如您所见,作者在屈服i周围使用了大括号;我不明白为什么需要它 forstr.format()没有提到format()的任何类型的参数。我确信我的困惑源于这样一个事实,即我不知道yield语句是做什么的,或者在调用它时

当我遇到这段代码的时候,我正在经历一个关于函数的问题

def协同程序():
对于范围(1,10)内的i:
打印(“从生成器{}”。格式((产量i)))
c=协同程序()
c、 发送(无)
尝试:
尽管如此:
打印(“从用户{}”。格式(c.send(1)))
除了停止迭代:通过
正如您所见,作者在
屈服i
周围使用了
大括号
;我不明白为什么需要它

for
str.format()
没有提到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
[1]中的
:def coroutine():
…:对于范围(1,10)内的i:
…:打印(“从生成器{}”。格式(产量i))
…:c=coroutine()
…:c.发送(无)
…:试试看:
…:虽然正确:
…:打印(“从用户{}”。格式(c.send(1)))
…:除了停止迭代:通过
文件“”,第3行
打印(“来自生成器{}”。格式(产量i))
^
SyntaxError:无效语法
在中,您可以阅读:

我建议您总是在屈服表达式周围加上括号 当您使用返回的值执行某些操作时,如上所述 例子。括号并不总是必要的,但更容易理解 始终添加它们,而不必记住何时需要它们。 (解释了精确的规则,即屈服表达式 必须始终用括号括起来,除非它出现在顶层 作业右侧的表达式

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


另外,在这个答案中还有一些信息:

我想说它类似于
sum(范围(3)中的I为0)
(语法错误)vs
sum((范围(3)中的I为I)),0)
(确定)。在某些情况下,python需要“额外的”大括号,即使从人的角度来看,它们也不是必需的语法错误意味着它与
str.format
无关;
yield
语句必须在括号中(不是大括号)在表达式中。
yield i
是一个语句。
格式
参数需要是表达式。通过使用大括号将
yield i
包装成表达式以供将来参考,语法错误后的所有内容都与错误无关。这个问题的90%是混淆;一个可能只是比较,例如
def():0+产量i
vs
def():0+(产量i)
@TigerhawkT3谢谢。我显然是在错误的地方寻找这个错误的答案。但是@francis_duvivier和@Tomerikoo的答案清楚地为我指明了正确的方向。这是一个声明,格式参数需要是表达式。但是决定继续回答这个问题-因为没有太多互联网上帮助我的资源。