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
表达式推导和发电机表达式中弃用(从最左边的for
条款的迭代内开),以确保推导适当地评估。从Python 3.8开始,这会导致语法错误。
这使得确切名单在理解问题的过时用法:
>>> [(yield(x)) for x in xlist]
<stdin>:1: DeprecationWarning: 'yield' inside list comprehension
<generator object <listcomp> at 0x000002E06BC1F1B0>
其值得注意的是,围绕'x'括号在你的例子没有做任何事情。 'yield'是一个关键字,而不是一个函数。 – Blckknght
不要在理解中使用'yield'。它做了一些疯狂的事情,这绝对不是你想要的,它应该是一个语法错误。 – user2357112