Відповіді:
Так, and
і or
оператори короткого замикання - дивіться документи .
and
, or
:Давайте спочатку визначимо корисну функцію, щоб визначити, чи виконується щось чи ні. Проста функція, яка приймає аргумент, роздруковує повідомлення та повертає введення, не змінюючи.
>>> def fun(i):
... print "executed"
... return i
...
Можна спостерігати поведінку короткого замикання Пітона з and
, or
операторів в наступному прикладі:
>>> fun(1)
executed
1
>>> 1 or fun(1) # due to short-circuiting "executed" not printed
1
>>> 1 and fun(1) # fun(1) called and "executed" printed
executed
1
>>> 0 and fun(1) # due to short-circuiting "executed" not printed
0
Примітка . Наступні значення інтерпретатор вважає помилковими:
False None 0 "" () [] {}
any()
, all()
:Python any()
і all()
функції також підтримують коротке замикання. Як показано в документах; вони оцінюють кожен елемент послідовності в порядку, поки не знаходять результат, який дозволяє достроково вийти з оцінки. Розгляньте приклади нижче, щоб зрозуміти обидва.
Функція any()
перевіряє, чи будь-який елемент є True. Він припиняє виконання, як тільки зустрічається True, і повертає True.
>>> any(fun(i) for i in [1, 2, 3, 4]) # bool(1) = True
executed
True
>>> any(fun(i) for i in [0, 2, 3, 4])
executed # bool(0) = False
executed # bool(2) = True
True
>>> any(fun(i) for i in [0, 0, 3, 4])
executed
executed
executed
True
Функція all()
перевіряє, що всі елементи є істинними, і зупиняє виконання, як тільки виявляється False:
>>> all(fun(i) for i in [0, 0, 3, 4])
executed
False
>>> all(fun(i) for i in [1, 0, 3, 4])
executed
executed
False
Крім того, в Python
Порівняння можуть бути пов'язані довільно ; наприклад,
x < y <= z
еквівалентнийx < y and y <= z
, за винятком того, щоy
він оцінюється лише один раз (але в обох випадкахz
взагалі не оцінюється, колиx < y
виявляється помилковим).
>>> 5 > 6 > fun(3) # same as: 5 > 6 and 6 > fun(3)
False # 5 > 6 is False so fun() not called and "executed" NOT printed
>>> 5 < 6 > fun(3) # 5 < 6 is True
executed # fun(3) called and "executed" printed
True
>>> 4 <= 6 > fun(7) # 4 <= 6 is True
executed # fun(3) called and "executed" printed
False
>>> 5 < fun(6) < 3 # only prints "executed" once
executed
False
>>> 5 < fun(6) and fun(6) < 3 # prints "executed" twice, because the second part executes it again
executed
executed
False
Edit:
Ще один цікавий момент , щоб відзначити : - Logical and
,or
оператори в Python повертає операнд значення замість Boolean ( True
або False
). Наприклад:
Операція
x and y
дає результатif x is false, then x, else y
На відміну від інших мов, наприклад &&
, ||
оператори в C, які повертають або 0, або 1.
Приклади:
>>> 3 and 5 # Second operand evaluated and returned
5
>>> 3 and ()
()
>>> () and 5 # Second operand NOT evaluated as first operand () is false
() # so first operand returned
Аналогічно or
оператор повертає ліве найбільше значення, для якого bool(value)
== True
else right most false значення (відповідно до поведінки короткого замикання), приклади:
>>> 2 or 5 # left most operand bool(2) == True
2
>>> 0 or 5 # bool(0) == False and bool(5) == True
5
>>> 0 or ()
()
Отже, чим це корисно? Один із прикладів використання, наведених у Practical Python By Magnus Lie Hetland:
Скажімо, користувач повинен ввести своє ім’я, але може вирішити нічого не вводити. У цьому випадку ви хочете використовувати значення за замовчуванням '<unknown>'
. Ви можете використовувати оператор if, але ви також можете викладати речі дуже стисло:
In [171]: name = raw_input('Enter Name: ') or '<Unkown>'
Enter Name:
In [172]: name
Out[172]: '<Unkown>'
Іншими словами, якщо значення повернення з raw_input є істинним (не порожній рядок), воно присвоюється імені (нічого не змінюється); в іншому випадку за замовчуванням '<unknown>'
призначено name
.
0
є falsy (так що це не просто 0
, це 0.0
, 0j
, decimal.Decimal(0)
, fractions.Fraction(0)
і т.д.), як і всі колекції з довжиною 0
(так у верхній частині того, що ви перерахували, b''
[PY3], u''
[py2] і set()
/ frozenset()
є всі вбудовані модулі, які оцінюються як хибні), але визначені користувачем / сторонні типи можуть визначати свої власні (з __bool__
[Py3] / __nonzero__
[Py2] безпосередньо або опосередковано шляхом визначення __len__
).