2013-09-17 2 views
1

Не могли бы вы посоветовать, как python запускает несколько терминов, если?Python: как, если обрабатывается?

Например:

a = 0 
    b = 0 
    c = 0 

    if a == 0 and b == 1 and c == 0: 
    # test fails 

Я думаю питона внутренне расщепляется тест на 3, если. Но, есть два возможных случая:

  • питон запускает все три, если один за другим, и один из них неправильно, то испытание терпит неудачу
  • или питона пробегов, если один за другим, на первый не удалось, если тест завершился неудачно, а другие, если не выполняются

Как python выполняет этот тест самостоятельно?

Спасибо и уважением, Hugo

+3

Это короткое замыкание ... то есть первое условие, которое * не соответствует критериям, заставляет тест сбой ... –

+2

См. Http://stackoverflow.com/questions/13960657/does-python-evaluate-ifs -paramaters-lazily – doctorlove

+2

Если быть точным, это не является свойством 'if', а оператора' and'/'or'. – glglgl

ответ

11

and - short-circuit operator.

Второй аргумент оценивается, если первый из них - True. Аналогично, для последующих аргументов.

+0

+1, правильный термин используется –

3

Второй. and/or являются операторами короткого замыкания - если нет необходимости, второй аргумент не оценивается. См. Документ boolean-operations-and-or-not.

3

Python использует «ленивые вычисления» для if: Смотрите docs

«выражение х и у сначала вычисляет х, если х является ложным, его значение возвращается, в противном случае, у вычисляется и итоговое значение - ».

+5

Я не уверен, что правильно сказать, что python использует ленивую оценку. OP, если оператор оценивает условия лениво, да. Правильный термин здесь будет http://en.wikipedia.org/wiki/Short-circuit_evaluation. –

+1

от wiki: на языках, которые используют ленивую оценку по умолчанию (например, Haskell), все функции эффективно «короткого замыкания», а специальные операторы короткого замыкания не нужны. –

5

Это не имеет ничего общего с условным предложением, но булевыми операторами and и or. Это short-circuit operators. Если первое значение False, то немедленно применяется False. В противном случае оценивается второе значение.

Вот хороший пример:

>>> def a(): 
...  print 'a is running!' 
...  return True 
... 
>>> def b(): 
...  print 'b is running!' 
...  return False 
... 
>>> def c(): 
...  print 'c is running!' 
...  return True 
... 
>>> if a() and b() and c(): 
...  print 'hello!' 
... 
a is running! 
b is running! 

Потому что b возвращает False, c не в конечном итоге работает, потому что нет никакой необходимости.