python生成器作为表达式

时间:2019-11-02 11:47:11

标签: python generator

是否有哲学上的原因,为什么在第一个代码段toto正常的情况下,第二个代码段titi将在python中被拒绝?

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  

2 个答案:

答案 0 :(得分:1)

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

请注意,您的toto可以通过如下有效方式进行拼写:

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

(仅在此处使用换行符和缩进来强调这与无效代码中的结构非常相似)。

答案 1 :(得分:0)

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