2010-08-30 13 views
6

除非我瘋了if None not in xif not None in x是等效的。是否有首選版本?我猜None not in更英文,因此更pythonic,但not None in是更像其他語言的語法。是否有首選版本?「無不在」vs「」無無「

+2

另請參見http://stackoverflow.com/questions/2710940 – Gumbo 2010-08-30 21:20:10

+0

如果您只是將1個操作符更改爲另一個操作符,則很多SO上的問題將會是重複的 – Falmarri 2010-08-30 23:50:20

回答

14

他們編譯到相同的字節碼,所以是的,它們是等價的。

>>> import dis 
>>> dis.dis(lambda: None not in x) 
    1   0 LOAD_CONST    0 (None) 
       3 LOAD_GLOBAL    1 (x) 
       6 COMPARE_OP    7 (not in) 
       9 RETURN_VALUE 
>>> dis.dis(lambda: not None in x) 
    1   0 LOAD_CONST    0 (None) 
       3 LOAD_GLOBAL    1 (x) 
       6 COMPARE_OP    7 (not in) 
       9 RETURN_VALUE 

documentation也清楚地表明,兩者是等價的:

x not in s返回x in s否定。

正如你所說的None not in x是更自然的英語,所以我更喜歡使用它。

如果你寫not y in x可能不清楚你的意思是not (y in x)還是(not y) in x。如果您使用not in,則沒有歧義。

+0

謝謝,不知道您可以將字節碼這個。 – 2010-08-30 21:55:52

7

表達

not (None in x) 

(括號中加入爲了清楚)是用普通的布爾否定。然而,

None not in x 

添加更多可讀的代碼特殊的語法(這裏有沒有可能,也沒有任何意義,使用和,或等在前面)。如果添加了這個特殊情況,請使用它。

同樣適用於

foo is not None 

not foo is None 

我找到了 「不」 更加清晰易讀。作爲額外的好處,如果表達式是更大的布爾表達式的一部分,則not的範圍立即清除。

+0

提及範圍+1 – Falmarri 2010-08-30 21:31:41