[英]Python - 'if not'
以下代碼
multiples = []
for i in range(1,1000):
if i % 3 == 0 or i % 5 == 0:
multiples.append(i)
addition = sum(multiples)
print addition
和
print(sum([i for i in range(1, 1000) if not (i%3 and i%5)]))
做同樣的事。
現在,第二個代碼中的if not
部分如何計算?
我的意思是,在第一個代碼中,必須專門說明i % 3 == 0 or i % 5 == 0
,而在第二個代碼中,無需== 0
即可實現相同的目的。
使用德摩根定律 :
i % 3 == 0 or i % 5 == 0
是相同的:
not (i % 3 != 0 and i % 5 != 0)
在python中,將數字轉換為布爾值時,任何非零值都將變為True
。
因此,而不是做i % 3 != 0
中if
,你可以使用i % 3
因為如果它的0
它會False
,如果它是非零這將是True
。
這是python的真值表: https : //docs.python.org/3.6/library/stdtypes.html#truth
PS sum()
可以將生成器作為參數,因此您實際上可以這樣做:
sum(i for i in range(1, 1000) if not (i%3 and i%5))
and
和or
是布爾運算符,不是邏輯&
和|
。 所以寫
a == 0 or b == 0
和寫作一樣
not a or not b
所以他們做同樣的事情
作為結論,最好的辦法是避免你的條件否定,不產生額外的列表理解,但用發電機的理解,而不是,我不會介意的測試對零,而不是使用not
因為他們是整數畢竟。 我會這樣做:
print(sum(i for i in range(1, 1000) if i%3==0 or i%5==0))
這是Python將整數轉換為布爾值的方式的影響。 i % 3
的結果取決於i
的值是0、1或2。 在Python 3.x中(並且默認情況下在Python 2.x中也是如此,除非您已對其進行了重新分配),所有非零整數的值均為False
,零值的值為True
。
因此if not (i % 3)
將評價(i % 3)
為一個整數0,1或2,然后not
將這些轉換為False
, True
, True
。
在Python中,通常將0
解釋為false。 因此,在第一個代碼塊中, i % 3 == 0
有效地等於not i % 3
。 命令行示例:
>>> 6 % 3 == 0
True
>>> not 6 % 3
True
>>> 7 % 3 == 0
False
>>> not 7 % 3
False
0 === false
這個快捷方式在許多語言中都會出現,如果您不習慣它,可能會感到困惑。
在Python中,每個對象都有一個布爾值。
在整數的情況下,除0
以外,它們中的任何一個都是True
。
因此,當您將數字i
可以除以3
,表達式i % 3
將為0
。 但是我們知道0
是False
。 not
運算符將否定該表達式,因此not False
將變為True
。
同樣, not i % 5
也適用。
希望能幫助到你。
可以測試任何對象的真值,以在if或while條件中使用,或用作以下布爾運算的操作數。 以下值為“假”:
沒有
假
任何數字類型的零,例如0、0L,0.0、0j。
任何空序列,例如'',(),[]。
任何空映射,例如{}。
用戶定義的類的實例,如果該類定義了一個非零 ()或len ()方法,則該方法返回整數零或布爾值False。 [1]
所有其他值都被認為是真實的-因此許多類型的對象總是真實的。
請參見,i%3 == 0如果條件滿足,則返回true。 現在,在python中假設:
i = 6
6 % 3 = 0 and 0==0 is true
因此,結果將是正確的。 在第二種情況下
6 % 3 = 0.
現在,布爾值0表示錯誤。 因此,使用not表示不為假,即為true。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.