使用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)
是否需要围绕产量的圆括号?
的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)
| 归档时间: |
|
| 查看次数: |
840 次 |
| 最近记录: |