【发布时间】:2017-03-28 10:40:53
【问题描述】:
TL;DR:我们可以在lambda 中实现yield 或生成器语句(带有循环)吗?
我的问题是澄清:
是否可以用yield实现下面的简单循环功能
def loopyield():
for x in range(0,15):
yield x
print(*loopyield())
导致错误:
lamyield=lambda x: yield x for x in range(0,15)
^
SyntaxError: invalid syntax
看起来,它期望某些东西作为未写入返回语句的正确操作数,但发现 yield 并感到困惑。
是否有适当的合法方式来循环实现这一目标?
旁注:yield 可以是语句/表达式,具体取决于您询问的对象:yield - statement or expression?
最终答案: yield 可以与 lambda 一起使用,但限制(单行)使其无用。 for/while 在 lambda 中不可能,因为它们不是表达式。 -user2357112 隐式 for 循环可以使用列表推导,并且 yield 在列表推导中有效。 -wim
Verdict- 无法使用显式循环,因为 python 中的 lambda 只能包含表达式,要编写显式循环,您需要使用语句。 -wim
【问题讨论】:
-
“但你也可以使用像
print()这样的语句,只要它包含在一行中” - 错误!print是 Python 3 中的函数,print调用是普通表达式。您不能在yield调用中使用任意单行语句。 -
试图用
lambda写这个是没有意义的。如果您想将其填充到一行,(x for x in range(0, 15))将是您的生成器函数的直接 genexp 翻译。 -
我同意。我试图检验一个理论。再想一想,由于
lambda必须放入单个语句的限制,我怀疑我能否实现任何在lambda中具有循环的东西。但最终澄清这一点会很好,因为它一直困扰着我。 -
虽然从技术上讲,您可以将
yield放在 lambda 函数中,但 lambda 函数的约束使其基本上没有用处。 -
你必须用括号括起来
(yield x)。但是整个for循环语法无论如何都不是有效的表达式。
标签: python python-3.x loops lambda generator