2012-12-04 25 views
-3

在python中,对于迭代,可以构建许多单行迭代命令。带有if语句的列表理解(或单行)

对于某些此类迭代if-statements是必需的。

有时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)不是更符合常识吗?

+0

你为什么要写'不是i%2 == 0'而不是'i%2!= 0'? – phihag

+0

“这些单行本质上是不可理解的”是一个非常严格的一揽子声明。事实上,他们很容易理解,而且功能非常强大。 –

+0

你实际上在说“就目前而言,列表解析的python语法不是很理解,我们不应该改变它是另一种方式吗?”。那么,有很多人成功地使用了Python的这一特性;所以它/是/可理解的。如果你不喜欢它,那么你总是可以自己修改解析器并将其作为PEP提出。当然,欢迎您随时查找/发明一种语言,让您以自己的方式表达列表理解。 – inspectorG4dget

回答

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 
1

在你的第一个例子,你作为列表理解值,具有带if-expression的无条件循环。正确的语法是:

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

a if b else c相当于a如果b计算结果为真,否则c

在你的第二个例子中,你有一个有条件的列表理解。你基本上忽略了迭代中的值;或者更准确地说,你所指定的取:

(a for i in iterable if <condition>) 

在总和的情况下,可以使用第一种语法重写你的列表理解,因为零点是加法(正因为如此之空元素):

sum(i if i % 2 != 0 else 0 for i in range(10))