簡體   English   中英

Python-'如果沒有'

[英]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 != 0if ,你可以使用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))

andor是布爾運算符,不是邏輯&| 所以寫

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將這些轉換為FalseTrueTrue

在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 但是我們知道0False not運算符將否定該表達式,因此not False將變為True

同樣, not i % 5也適用。

希望能幫助到你。

可以測試任何對象的真值,以在if或while條件中使用,或用作以下布爾運算的操作數。 以下值為“假”:

  • 沒有

  • 任何數字類型的零,例如0、0L,0.0、0j。

  • 任何空序列,例如'',(),[]。

  • 任何空映射,例如{}。

  • 用戶定義的類的實例,如果該類定義了一個非零 ()或len ()方法,則該方法返回整數零或布爾值False。 [1]

所有其他值都被認為是真實的-因此許多類型的對象總是真實的。

另請參閱: https : //docs.python.org/2/library/stdtypes.html

請參見,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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM