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