2014-01-27 3 views
3

Почему self.year дважды? У меня возникли проблемы с выяснением логики линии. Может кто-то помочь мне с этим?Логический оператор «и» в python

return (self.year and self.year == date.year or True) 

Я иду через http://www.openp2p.com/pub/a/python/2004/12/02/tdd_pyunit.html и столкнулся линию ... И, конечно, у меня нет понимания проблемы и, или, ни, XOR, XNOR или любое логическое выражение. Но я смущен, как он был использован здесь ..

:-)

+2

[Булевские операции] (http://docs.python.org/release/2.5.2/lib/boolean.html) – devnull

+0

Я знаю, что они есть, но я хочу знать логику того, чтобы иметь self.year дважды. @devnull – Nabin

+0

@devnull Python 2.5 довольно старый, не был активно развит в течение нескольких лет. Вот ссылка на более свежие (Py3) документы: http://docs.python.org/3/library/stdtypes.html#boolean-operations-and-or-not – aquavitae

ответ

1

Порядок оценки вопросов (см. here). Код:

return self.year and self.year == date.year 

можно переписать:

return self.year and (self.year == date.year) 

Или, в полном объеме:

if self.year: 
    if self.year == date.year: 
     return True 
    else: 
     return False 
return False # Actually return self.year, but usually a boolean is intended in this sort of situation 

Однако выражение вы вывесили всегда будет вычисляться True из-за or True в то конец. Используя круглые скобки, чтобы показать порядок оценки:

return (self.year and (self.year == date.year)) or True 
+0

Спасибо .. Я получил это теперь .. И, конечно, смысл и/или не изменился никогда. Правильно? :-) – Nabin

2
return (self.year and self.year == date.year or True) 

В этом случае сначала происходит проверка на существование на self.year, который будет возвращать (я предполагаю) None (в python == False), если он не существует. после этого он сравнивается с date.year

Я думаю, что это немного избыточно, потому что сравнение вернет false в любом случае, если self.year не существует.

Как прокомментировал Bereal на ваш вопрос, последний or True странно на самом деле, потому что, кажется, вызывает общее выражение всегда возвращать True

общий Примечание: В питоне логические выражения всегда вычисляются «в порядке Внешность ».

+0

в порядке появления или есть какое-либо преимущество? – Nabin

+0

'A и B и C' эквивалентны' (A и B) и C'. 'A == 1 или 2' не 'A == (1 или 2)' but '(A == 1) или 2' эффективно: всегда true, если' A == 0' – Kraay89

1

Эта линия всегда возвращает истину, потому что вы делаете or с истинным значением.

Кроме того, первый он проверяет self.year не None или False, чем чеки, если self.year равно date.year.

1
return (self.year and self.year == date.year or True) 

Да, требуется включить self.year дважды. Поскольку он будет проверять, что есть что-то self.year, и если оно не определено, оно даст ошибку, что нет такой вещи, как «self.year», то есть она не определена. Поскольку он утверждает, что self.year - это то, что определено, чем оно будет проверять его ценность.

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