在python中,对于iterables,可以构造许多单行迭代命令。
对于某些此类迭代,如果需要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语句必须在之后声明。使用之前的i if not i%2==0 for i in range(10)
?
答案 0 :(得分: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 :(得分:1)
在第一个示例中,您有一个无条件循环,其中if-expression作为列表理解值。正确的语法是:
(a if b else c for i in iterable)
\___________/
|
actual expression
如果a if b else c
评估为true,则 a
相当于b
,否则为c
。
在第二个示例中,您有一个条件列表理解。您基本上是从可迭代中跳过值;或者更确切地说,您正在指定采取的措施:
(a for i in iterable if <condition>)
如果是总和,您可以使用第一种语法重写列表推导,因为零是添加的空元素(因此总和):
sum(i if i % 2 != 0 else 0 for i in range(10))