本文翻译自:Does Python support short-circuiting?
Python是否支持布尔表达式短路?
参考:https://stackoom.com/question/ApD6/Python是否支持短路
and
, or
: 操作符and
的短路行为, or
: Let's first define a useful function to determine if something is executed or not. 我们首先定义一个有用的函数来确定是否执行了某些操作。 A simple function that accepts an argument, prints a message and returns the input, unchanged. 一个简单的函数,它接受一个参数,打印一条消息并返回输入,且未更改。
>>> def fun(i):
... print "executed"
... return i
...
One can observe the Python's short-circuiting behavior of and
, or
operators in the following example: 在以下示例中,可以观察Python的 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
Note: The following values are considered by the interpreter to mean false: 注意:解释器认为以下值表示false:
False None 0 "" () [] {}
any()
, all()
: 函数中的短路行为: any()
, all()
: Python's any()
and all()
functions also support short-circuiting. Python的any()
和all()
函数还支持短路。 As shown in the docs; 如文档所示; they evaluate each element of a sequence in-order, until finding a result that allows an early exit in the evaluation. 他们按顺序评估序列中的每个元素,直到找到可以尽早退出评估的结果。 Consider examples below to understand both. 考虑下面的示例以了解两者。
The function any()
checks if any element is True. 函数any()
检查是否有任何元素为True。 It stops executing as soon as a True is encountered and returns 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
The function all()
checks all elements are True and stops executing as soon as a False is encountered: 函数all()
检查所有元素是否为True,并在遇到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
Additionally, in Python 此外,在Python中
Comparisons can be chained arbitrarily ; 比较可以任意链接 ; for example,
x < y <= z
is equivalent tox < y and y <= z
, except thaty
is evaluated only once (but in both casesz
is not evaluated at all whenx < y
is found to be false). 例如,x < y <= z
等效于x < y and y <= z
,除了y
仅被评估一次(但是在两种情况下,当x < y
被发现为假时,z
都不被评估)。
>>> 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: 编辑:
One more interesting point to note :- Logical and
, or
operators in Python returns an operand's value instead of a Boolean ( True
or False
). 一个更有趣的一点需要注意: -逻辑and
, or
运营商在Python返回一个操作数的值 ,而不是一个布尔值( True
或False
)。 For example: 例如:
Operation
x and y
gives the resultif x is false, then x, else y
if x is false, then x, else y
操作x and y
给出结果if x is false, then x, else y
Unlike in other languages eg &&
, ||
与其他语言(例如&&
, ||
operators in C that return either 0 or 1. C中的运算符返回0或1。
Examples: 例子:
>>> 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
Similarly or
operator return left most value for which bool(value)
== True
else right most false value (according to short-circuiting behavior), examples: 同样or
运算符返回最左边的值,其中bool(value)
== True
否则返回最右边的假值(根据短路行为),示例:
>>> 2 or 5 # left most operand bool(2) == True
2
>>> 0 or 5 # bool(0) == False and bool(5) == True
5
>>> 0 or ()
()
So, how is this useful? 那么,这有什么用呢? One example use given in Practical Python By Magnus Lie Hetland: Magnus Lie Hetland在《 实用Python》中给出的一个示例用法:
Let's say a user is supposed to enter his or her name, but may opt to enter nothing, in which case you want to use the default value '
. 假设用户应该输入他或她的名字,但可能选择不输入任何内容,在这种情况下,您要使用默认值'
。 You could use an if statement, but you could also state things very succinctly: 您可以使用if语句,但也可以非常简洁地陈述一下:
In [171]: name = raw_input('Enter Name: ') or ''
Enter Name:
In [172]: name
Out[172]: ''
In other words, if the return value from raw_input is true (not an empty string), it is assigned to name (nothing changes); 换句话说,如果raw_input的返回值是true(不是空字符串),则将其分配给name(不变);否则,它将返回true。 otherwise, the default '
is assigned to name
. 否则,默认的'
被分配给name
。
Yes. 是。 Try the following in your python interpreter: 在您的python解释器中尝试以下操作:
and 和
>>>False and 3/0
False
>>>True and 3/0
ZeroDivisionError: integer division or modulo by zero
or 要么
>>>True or 3/0
True
>>>False or 3/0
ZeroDivisionError: integer division or modulo by zero
是的, and
和or
运算符都短路-请参阅docs 。