2015-08-03 3 views
4

Есть ли какие-либо объяснения по поводу следующего синтаксиса условий Python?Синтаксис специальных условий с круглыми скобками и скобками

>>> a = 10 
>>> s = (0, 1)[a<10] 
>>> print s 
0 
>>> a = -10 
>>> s = (0, 1)[a<10] 
>>> print s 
1 

Это похоже на заявление if. Почему это работает?

+2

Это будет написано любым разумным как 's = 1, если <10 еще 0'! Связано: http://stackoverflow.com/a/470376/3001761 – jonrsharpe

ответ

7

В Python bool является подклассом int.

>>> issubclass(bool, int) 
True 

Другими словами, False равно 0, и True равно 1:

>>> False == 0 
True 
>>> True == 1 
True 

Таким образом, они могут быть использованы в качестве индекса:

>>> ['No', 'Yes'][False] # ['No', 'Yes'][0] 
'No' 
>>> ['No', 'Yes'][True] # ['No', 'Yes'][1] 
'Yes' 

Выражение a < 10 дает True или False на основе значения a. Таким образом, (0, 1)[a < 10] даст 0 или 1 соответственно.

5

(0, 1) является 2-элементным tuple. Вы можете получить доступ к его значения с помощью index accessors[0] и [1] вроде этого:

>>> (0, 1)[0] 
0 
>>> (0, 1)[1] 
1 

Теперь в Python, булевы значения True и False фактически экземпляры int (потому что bool является подтипом int):

>>> issubclass(bool, int) 
True 
>>> isinstance(True, int) 
True 
>>> isinstance(False, int) 
True 

ИНТ значения True и False являются 1 и 0:

>>> True == 1 
True 
>>> False == 0 
True 

Таким образом, вы можете использовать их два доступ к элементам в вашем 2-элементе кортеже:

>>> (0, 1)[False] 
0 
>>> (0, 1)[True] 
1 

И это объясняет, почему указания условия там, который возвращает логическое значение, будет работать так же хорошо.

Это также упоминается в documentation (курсив):

логические значения являются двумя постоянными объектами False и True. Они используются для представления значений истинности (хотя другие значения также могут считаться ложными или истинными). В числовых контекстах (например, при использовании в качестве аргумента для арифметического оператора) они ведут себя как целые числа 0 и 1 соответственно.

Смежные вопросы