In Java and C, the expression `<condition> ? <expression True> : expression False` is widely used as an inline format. It could make the logic more clear than multi-line format for guys who understand this convention. Actually, there is a logically equivalent expression in Python, which is `<expression True> if <condition> else <expression False>`. However, I found a number of articles that have partial misconception, in which, they hold the argument that the expression `<expression True> if <condition> else <expression False>` is logically equivalent to the expression `<condition> and <expression True> or <expression False>`. The aim of this short post is to conduct a comparison between the two expressions and explain why the second expression is not logically equivalent to the first one.

## Python logical expressions

This is the link to the Documentation of Boolean operations in Python3.

For convenience, I put the quotation here.

The expression x and y first evaluates x; if x is false, its value is returned; otherwise, y is evaluated and the resulting value is returned.

The expression x or y first evaluates x; if x is true, its value is returned; otherwise, y is evaluated and the resulting value is returned.

## Experiments

In this case, it seems that the expression `<condition> and <expression True> or <expression False>` can be used as a ternary operator. However, there is still an exception. Let’s look at the code block.

Obviously, the expression `(2 > 1)` returns `True`, the first line should output `0` if this expression is logically equivalent to the expression `<expression True> if <condition> else <expression False>`. However, the output of the second line and the third line seem reasonable.

## Explanation

In the first experiment `(2 > 1) and 0 or 1`, after calculating the value of `(2 > 1)`, the Python interpreter evaluates the first operand of the `and` operator, which is `True` and then returns the resulting value, which is `False`. Since `0 and True` returns `False`. After that, the interpreter evaluates the expression `False or 1`, which returns `1`.

## Conclusion

The logical expression `<condition> and <expression True> or <expression False>` could be used as a tricky way as a ternary operator. However, the edge case must be taken into consideration. The recommend way of handling this scenario is to use the expression `<expression True> if <condition> else <expression False>`, which is also officially recommended. However, the returning rules could also be used for other cases, for example `or` operator can be use to assign a default value, an example is as follows: