Does Python support short-circuiting in boolean expressions?
Answers:
Thank you for visiting the Q&A section on Magenaut. Please note that all the answers may not help you solve the issue immediately. So please treat them as advisements. If you found the post helpful (or not), leave a comment & I’ll get back to you as soon as possible.
Method 1
Yep, both and and or operators short-circuit — see the docs.
Method 2
Short-circuiting behavior in operator 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:
>>> 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 None 0 "" () [] {}
Short-circuiting behavior in function: any(), all():
Python’s any() and all() functions also support short-circuiting. 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. It stops executing as soon as a True is encountered and returns 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(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
Comparisons can be chained arbitrarily; for example,
x < y <= zis equivalent tox < y and y <= z, except thatyis evaluated only once (but in both caseszis not evaluated at all whenx < yis found to be false).
>>> 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). For example:
Operation
x and ygives the resultif x is false, then x, else y
Unlike in other languages e.g. &&, || operators in C that return either 0 or 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:
>>> 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 is given in Practical Python By Magnus Lie Hetland:
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>'.
You could use an if statement, but you could also state things very succinctly:
In [171]: name = raw_input('Enter Name: ') or '<Unknown>'
Enter Name:
In [172]: name
Out[172]: '<Unknown>'
In other words, if the return value from raw_input is true (not an empty string), it is assigned to name (nothing changes); otherwise, the default '<Unknown>' is assigned to name.
Method 3
Yes. Try the following in your python interpreter:
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
Method 4
Yes, Python does support Short-circuit evaluation, minimal evaluation, or McCarthy evaluation for Boolean operators. It is used to reduce the number of evaluations for computing the output of boolean expression. Example –
Base Functions
def a(x):
print('a')
return x
def b(x):
print('b')
return x
AND
if(a(True) and b(True)):
print(1,end='nn')
if(a(False) and b(True)):
print(2,end='nn')
AND-OUTPUT
a b 1 a
OR
if(a(True) or b(False)):
print(3,end='nn')
if(a(False) or b(True)):
print(4,end='nn')
OR-OUTPUT
a 3 a b 4
All methods was sourced from stackoverflow.com or stackexchange.com, is licensed under cc by-sa 2.5, cc by-sa 3.0 and cc by-sa 4.0