[英]if-else sentence in one-line-python
我有一些代碼:
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)
我改寫了它,使其更具Python風格:
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
區別是else 0
?
您在這里有兩個非常不同的事情。
首先,您有一個表達式,並在使用條件表達式來產生值。 這需要一個else
因為一個表達式總是需要產生一些東西 。
例如,如果您寫了:
sum += each if each >= part[0] and each <= part[1] # removing "else 0"
那么如果測試為假,將加到總和上呢?
在第二個中,您有一個生成器表達式 ,而if
是可能部分的一部分( 在語法中稱為comp_if
), 位於 (嵌套) for
循環旁邊。 就像if ...:
語句一樣,它過濾序列中使用了哪些元素,並且在錯誤的情況下不需要產生值。 您將不會進行其他過濾。
讓我們回到您的示例:
sum(x for x in data if low<=x<=high)
if
測試為假,則x
將從循環中省略並且不求和。 您將在第一個示例中執行相同的操作:
if each >= part[0] and each <= part[1]:
# only add to `sum` if true
sum += each
這根本不是相同的語法。 第一個是三元運算符(類似於C中的(a?b:c))。 在這里沒有else子句沒有任何意義。 第二個是列表理解,if子句的目的是過濾可迭代的元素。
x if y else z
這是一個內聯if表達式,它返回一個值。 它必須始終返回值,不能返回值,因此它必須包含else
子句。
[x for x in y if z]
這是一個列表理解。 這里的if
充當循環的過濾器。 等效for x in y: if z: ...
要在其中放置else
,可以將inline-if表達式替換為x
:
[x if y else z for foo in bar]
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.