使用Python 3.4,我在这里得到ICollection<personPartner>
:
SyntaxError: invalid syntax
但这会生成一个生成器对象:
>>> xlist = [1,2,3,4,5]
>>> [yield(x) for x in xlist]
SyntaxError: invalid syntax
是否需要围绕产量的圆括号?
答案 0 :(得分:8)
yield
keyword可以两种方式使用:作为语句,作为表达式。
最常见的用法是作为生成器函数中的语句,通常在它自己的行和所有函数中。它可以像这样使用:
yield <expr>
yield from <expr>
然而,只要允许表达式,就可以使用yield表达式。但是,它们需要特殊的语法:
(yield <expr>)
(yield from <expr>)
如您所见,括号是使yield
作为表达式工作的语法的一部分。因此,语法上不允许将yield
关键字用作没有括号的表达式。这就是你需要在列表理解中使用括号的原因。
话虽这么说,如果你想使用列表理解语法来创建一个生成器,你应该使用生成器表达式语法:
(x for x in xlist)
注意括号而不是方括号将其从列表推导转换为生成器表达式。
请注意,starting with Python 3.7,yield
表达式在comprehensions和generator表达式中不推荐使用(除了最左边的for
子句的可迭代内),以确保正确评估结构。从Python 3.8开始,这将导致语法错误。
这使得问题中的确切列表理解成为不推荐的用法:
>>> [(yield(x)) for x in xlist]
<stdin>:1: DeprecationWarning: 'yield' inside list comprehension
<generator object <listcomp> at 0x000002E06BC1F1B0>