2017-02-07 26 views

回答

0

在Python中|&是按位運算符,他們做位計算。

另一方面,andor是邏輯(布爾)運算符。

0

|是位運算和Python腳本做到位計算 這裏使用此

i = 200 

j = 201 

if i == 200 or j == 201: 
    print "Hi" 
else: 
    print "No" 
2

這個問題實際上是運算符優先級之一,沒有具體使用按位|而不是邏輯or的; True | TrueTrue or True給出了相同的結果。

Python docs比較==比按位|優先級高,所以你的條件表達式計算到:

i == (200 | j) == 201 

哪個是假的。如果您添加括號以說明:

(i == 200) | (j == 201) 

您會得到您所期望的行爲。


但是,正確的做法是使用or。使用or的原因是沒有括號,因爲布爾運算符的優先級比比較低。另外:

  • 它更具有可讀性,因爲它是自然語言來表達你的意思
  • 它短路,因此,如果左邊是truthy右手側並不需要是評價
  • 它工作在更寬的範圍的情況下,其中按位操作將是一個TypeError
+0

在腳本語言中,還應該考慮處理'None'。 'True或None'不會拋出異常,'(True | None)'拋出'TypeError'。 'True和None'等於'None',但在if語句中的作用與False相同。 – nigel222

+0

也考慮功能評估。 Python'和'和'or'使用短路邏輯,所以'f()或g()'調用'f',但是如果'f'返回True或者「truthy」,不會調用'g'。 'g()或f()'在'g'返回true時調用'g'而不是'f'。 '(f()| g())'將總是調用'f'和'g'。當'f'或'g'是調用時影響實例狀態的類實例的方法時,這變得非常重要。 – nigel222

+0

@ nigel222是的,使用'或'確實是正確的,但這並不是OP代碼無法按預期工作的原因。我會做得更清楚。 – jonrsharpe