yield(x)vs.(yield(x)):python中围绕yield的括号

GoG*_*oGo 6 python python-3.x

使用Python 3.4,我SyntaxError: invalid syntax来到这里:

>>> xlist = [1,2,3,4,5]
>>> [yield(x) for x in xlist]
SyntaxError: invalid syntax
Run Code Online (Sandbox Code Playgroud)

但是这会生成一个生成器对象:

>>> [(yield(x)) for x in xlist]
<generator object <listcomp> at 0x00000076CC8E5DB0>
Run Code Online (Sandbox Code Playgroud)

是否需要围绕产量的圆括号?

pok*_*oke 9

yield关键字可以以两种方式使用:作为语句,作为表达.

最常见的用法是作为生成器函数中的语句,通常是在它自己的行和所有.它可以像这样使用:

yield <expr>
yield from <expr>
Run Code Online (Sandbox Code Playgroud)

然而,yield表达式可以在允许表达式的任何地方使用.但是,它们需要特殊的语法:

(yield <expr>)
(yield from <expr>)
Run Code Online (Sandbox Code Playgroud)

如您所见,括号是将yield工作作为表达式的语法的一部分.因此,语法上不允许将yield关键字用作没有括号的表达式.这就是为什么你需要在列表理解中使用括号.

话虽这么说,如果你想使用列表理解语法来创建一个生成器,你应该使用生成器表达式语法:

(x for x in xlist)
Run Code Online (Sandbox Code Playgroud)

请注意括号而不是方括号将其从列表推导转换为生成器表达式.


请注意,从Python 3.7开始,yield表达式在理解和生成器表达式中不推荐使用(除了最左边的for子句的可迭代内部),以确保正确评估结构.从Python 3.8开始,这将导致语法错误.

这使得问题中的确切列表理解成为不推荐的用法:

>>> [(yield(x)) for x in xlist]
<stdin>:1: DeprecationWarning: 'yield' inside list comprehension
<generator object <listcomp> at 0x000002E06BC1F1B0>
Run Code Online (Sandbox Code Playgroud)