python生成器作为表达式

2024-04-25 17:34:29 发布

您现在位置:Python中文网/ 问答频道 /正文

在python中,第二个代码段toto会被拒绝,而第一个代码段titi没有问题,这有什么哲学上的原因吗?你知道吗

def titi():
    for m in range(5):
      if m < 4:
        yield m 


toto = for m in range(5):
            if m < 4:
                yield m

编辑:

我希望函数体是一个有效的表达式,并且能够平等地定义

def titi():
   toto  

Tags: 函数in编辑forif表达式def代码段
2条回答

一个原因是赋值运算符=必须在右边有一个表达式,而不是一个(系列)语句。然后,您可能会问为什么会这样,我猜选择它是为了限制解析器的复杂性,并且不允许人们认为混淆的代码。你知道吗

请注意,您的toto可以这样有效地拼写:

toto = (
            m
    for m in range(5)
        if m < 4
)

(换行和缩进只是为了强调这与无效代码中的结构非常接近)。你知道吗

我认为,在编程语言中,任何类型的循环都不能分配给变量,因为我想循环可能缺少一些与变量相关的确定性概念。你的例子是一个特例,因为它的结构非常简单,而且你包含了关键字yield。所以是的,你的例子可能是有效的,但是这意味着一些循环可以分配给变量,而不是其他的,这缺乏一致性。例如,Python弥补了列表理解和生成器(您的第一个代码段)的不足。在这些情况下,循环实际上被封装在某种父对象中,这为它们提供了一个更确定的或有界的方面。事实上,没有任何循环可以是生成器或列表理解的一部分,这很好地为那些循环提供了一种特殊的状态,比如你的循环,它们可以假装被分配给变量。你知道吗

相关问题 更多 >