我有一些代码:
a_part = [2001, 12000]
b_part = [1001, 2000]
c_part = [11, 1000]
d_part = [1, 10]
data = range(1, 12000)
labels = [a_part, b_part, c_part, d_part]
sizes = []
# ---
for part in labels:
sum = 0
for each in data:
sum += each if each >= part[0] and each <= part[1] else 0
# error
# sum += each if each >= part[0] and each <= part[1]
sizes.append(sum)
print(sizes)
我将其重写为更 Pythonic:
sizes = [sum(x for x in data if low<=x<=high) for low,high in labels]
# error
# sizes = [sum(x for x in data if low<=x<=high else 0) for low else 0,high in labels]
print(sizes)
我发现在第一个代码片段中我不能遗漏 else 0 而第二个示例不能包含 else 0。
else 0 在这些示例之间有什么区别?
请您参考如下方法:
这里有两个截然不同的东西。
首先你有一个表达式,并且使用了 conditional expression产生值(value);这需要 else,因为表达式总是需要产生东西。
例如,如果您这样写:
sum += each if each >= part[0] and each <= part[1] # removing "else 0"
如果测试为假,那么总和会增加多少?
在第二个你有一个generator expression ,并且 if 是可能部分的一部分(称为 comp_if in the grammar ),在(嵌套的)for 循环旁边。与 if ...: 语句类似,它过滤使用了序列中的哪些元素,并且在 false 情况下不需要产生值;否则你不会过滤。
将其带回到您的示例中:
sum(x for x in data if low<=x<=high)
当 if 测试为 false 时,x 只是从循环中省略而不求和。你会在第一个例子中做同样的事情:
if each >= part[0] and each <= part[1]:
# only add to `sum` if true
sum += each
