2017-02-17 127 views
-2

我看到下面一段簡單的代碼的一些變化:奇怪的Python的布爾運算符

if dist_1>dist_2 : 
    print enemy_2 
else: 
    print enemy_1 

變化1:

print (enemy_1, enemy_2)[dist_1 > dist_2] 

變化2:

e1, d1, e2 = (raw_input() for _ in '123') 
print (e1, e2)[d1 > raw_input()] 

能有人請解釋print (x,y)[x>y]代碼的工作原理是什麼?

+1

我在這裏添加了一個python 2標籤,因爲我確信這在Python 3中不起作用 –

+1

它只是一個元組,根據'x> y'的結果訪問0或1 ... – Li357

+1

@MadPhysicist它沒有花時間在3.6.0下進行測試。有用! – Jules

回答

3

布爾實際上是整數的一個子類中的Python:

isinstance(True, int) 
isinstance(False, int) 

都是真實的陳述。所以你可以用一個布爾值來索引一個兩元素序列。如果布爾值爲False,您將獲得第一個元素。如果布爾值爲True,則會得到第二個元素。

表達式(enemy_1, enemy_2)創建了一個雙元素tuple[dist_1 > dist_2]提供了布爾指數。 print是偶然的;它只是用來輸出結果。

+1

爲防止混淆:類型bool從int類型派生,因此isinstance(2,bool)爲False。所以布爾實際上是整數,但整數不是布爾。就像貓是動物,但動物不一定是貓。 –

+0

@JacquesdeHooge。我不是特別相關的,相反是不正確的,但我確實讓我的語言更準確地表明它。 –

+0

我很想知道爲什麼downvote。我的解釋中有什麼不真實或根本缺乏? –

1

如果你將至少一個逗號放在parens中,它將變成一個元組。與列表類似,您可以索引一個元組。您通常使用整數進行索引。但是,如果使用的是布爾然後假將被解釋爲0和True您索引將被解釋爲1

因此,代碼:

(enemy_1, enemy_2)[dist_1 > dist_2] 

是英文解釋爲「如果dist_1>比dist_2給予我從元組中取得第1項,否則給我第0項。「

如果你願意,你可以做一個元組教程。

+2

「如果你把東西在parens它成爲一個元組」。不一定:是(2)'元組? –

+0

@ Jean-FrançoisFabreNotpick:如果它是函數調用的一部分,那麼是的,它可能成爲元組的一部分(['PyArg_ParseTupleAndKeywords'](https://docs.python.org/3/c-api/arg.html #c.PyArg_ParseTupleAndKeywords)或者如果函數接受'* args'):-) – MSeifert