Python是否支持短路?

本文翻译自:Does Python support short-circuiting?

Python是否支持布尔表达式短路?


#1楼

参考:https://stackoom.com/question/ApD6/Python是否支持短路


#2楼

Short-circuiting behavior in operator 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    ""    ()    []     {}

Short-circuiting behavior in function: 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

Short-circuiting behavior in Chained Comparison: 链式比较中的短路行为:

Additionally, in Python 此外,在Python中

Comparisons can be chained arbitrarily ; 比较可以任意链接 ; for example, x < y <= z is equivalent to x < y and y <= z , except that y is evaluated only once (but in both cases z is not evaluated at all when x < 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 ). 一个更有趣的一点需要注意: -逻辑andor运营商在Python返回一个操作数的 ,而不是一个布尔值( TrueFalse )。 For example: 例如:

Operation x and y gives the result if 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 '<unknown>' . 假设用户应该输入他或她的名字,但可能选择不输入任何内容,在这种情况下,您要使用默认值'<unknown>' You could use an if statement, but you could also state things very succinctly: 您可以使用if语句,但也可以非常简洁地陈述一下:

In [171]: name = raw_input('Enter Name: ') or '<Unkown>'
Enter Name: 

In [172]: name
Out[172]: '<Unkown>'

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 '<unknown>' is assigned to name . 否则,默认的'<unknown>'被分配给name


#3楼

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

#4楼

是的, andor运算符都短路-请参阅docs

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值