With the Python (2.7) ternary expression x if cond else y
what is the logical order when evaluating multiple expressions of these nested in order: e.g.
1 if A else 2 if B else 3
Drawing out the truth table for this is appears this is evaluated as 1 if A else (2 if B else 3)
rather than (1 if A else 2) if B else 3
:
A True False
B
True 1 2
False 1 3
Could someone please explain why this is executed in this order, and possibly suggest some material that gives an intuition about why this is used/preferred?
This doesn't seem obvious when considering the ordering using the inline for
statement:
>>>[(i, j, k) for i in range(1) for j in range(2) for k in range(3)]
[(0, 0, 0), (0, 0, 1), (0, 0, 2), (0, 1, 0), (0, 1, 1), (0, 1, 2)]
But what if we are to use multiple if-else statements? Such issues can be tackled using multiple ternary operators in a single statement. In the above syntax, we have tested 2 conditions in a single statement using the ternary operator.
The conditional (ternary) operator is the only JavaScript operator that takes three operands: a condition followed by a question mark ( ? ), then an expression to execute if the condition is truthy followed by a colon ( : ), and finally the expression to execute if the condition is falsy.
Except in very simple cases, you should discourage the use of nested ternary operators. It makes the code harder to read because, indirectly, your eyes scan the code vertically. When you use a nested ternary operator, you have to look more carefully than when you have a conventional operator.
1 if A else 2 if B else 3
translates to this:
def myexpr(A, B):
if A:
return 1
else:
if B:
return 2
else:
return 3
Your ternary expression can be interpreted with parentheses as follows:
(
(1 if A) else (
(2 if B) else 3
)
)
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With