python:lambda、yield 语句/表达式和循环(澄清)

新手上路,请多包涵

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

看起来,它期望一些东西作为未写的 return 语句的正确操作数,但发现了 yield 并感到困惑。

是否有适当的合法方法来循环实现此目的?

旁注: yield 可以是语句/表达式,具体取决于你问的是谁: yield - 语句或表达式?

最终答案: yield 可以与 lambda 一起使用,但限制(单行)使其无用。 for/while 在 lambda 中不可能,因为它们不是表达式。 -user2357112 隐式 for 循环可以通过列表理解实现,并且 yield 在列表理解内有效。 - 维姆

判决- 显式循环是不可能的,因为 python 中的 lambda 只能包含表达式,要编写显式循环,您将需要使用语句。 -wim

原文由 theMobDog 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 959
2 个回答

您似乎试图创建的单行代码实际上在技术上可以通过 lambda 实现,您只需要为解析器提供更多帮助:

 >>> lamyield = lambda: [(yield x) for x in range(15)]
>>> print(*lamyield())
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14

这在列表理解中隐式使用了一个 for 循环。在理解之外使用显式 while 循环或 for 循环是不可能的。那是因为 python 中的 lambda 只能包含 表达式,要编写显式循环,您将需要使用 语句

注意:此语法在 Python 3.7 中已弃用,并将在 Python 3.8 中引发 SyntaxError

原文由 wim 发布,翻译遵循 CC BY-SA 4.0 许可协议

是否有必要在 yield lambda 如果你可以用生成器重写它这样吗?

 In[1]: x = (i for i in range(15))
In[2]: x
Out[2]: <generator object <genexpr> at 0x7fbdc69c3f10>

In[3]: print(*x)
Out[3]: 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14

In[4]: x = (i for i in range(0, 15))
In[5]: x.__next__()
Out[5]: 0

In[6]: next(x)
Out[6]: 1

原文由 ncopiy 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题