-3

在 python 中,对于可迭代对象,可以构造许多单行迭代命令。

对于某些这样的迭代,需要使用 if 语句。

有时 if 语句和 for 语句的顺序很重要。假设我想找到 0 到 10 之间奇数的总和:

>>> sum(i if not i%2==0 for i in range(10))
SyntaxError: invalid syntax
>>> sum(i for i in range(10) if not i%2==0)
25

那些单行语句本质上不是很容易理解,但是我真的不明白为什么 if 语句必须出现for 语句之后。使用前者不是更符合常识i if not i%2==0 for i in range(10)吗?

4

2 回答 2

5

在生成器表达式(或列表推导式)中,应该像嵌套它们一样列出语句。

您的sum()表达式可以嵌套为:

for i in range(10):
    if not i%2 == 0:
        # do something with i

您无法更改该顺序,以下内容没有意义,因为i未定义:

if not i%2 == 0:
    for i in range(10):
        # do something with i
于 2012-12-04T22:22:26.013 回答
1

在您的第一个示例中,您有一个以 if 表达式作为列表理解值的无条件循环。正确的语法是:

(a if b else c for i in iterable)
 \___________/
    |
   actual expression

a if b else c等效于aifb计算结果为 true,c否则。

在您的第二个示例中,您有一个条件列表理解。您基本上是在跳过可迭代的值;或更准确地说,您正在指定采用哪些:

(a for i in iterable if <condition>)

在求和的情况下,您可以使用第一种语法重写列表推导,因为零是加法的空元素(因此求和):

sum(i if i % 2 != 0 else 0 for i in range(10))
于 2012-12-04T22:29:08.520 回答