Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Python multiple nested ternary expression

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)]
like image 487
oliversm Avatar asked Jun 19 '17 17:06

oliversm


People also ask

Can you have multiple ternary operators?

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.

How many expressions are allowed inside 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.

Is nested ternary operator a good practice?

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 Answers

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
               )
)
like image 172
inspectorG4dget Avatar answered Oct 12 '22 21:10

inspectorG4dget