In Python, and and or perform Boolean logic, as you would expect, but they do not return a Boolean value; instead, they return one of the values they actually compare against.
1. and:
>>> 'a' and 'b' 'b' >>> '' and 'b' '' >>> 'a' and 'b' and 'c' 'c'
evaluates the expression from left to right in a Boolean context. If all values in the Boolean context are true, then and returns the last value.
If a value in the Boolean context is false, then and returns the first false value
Second, or:
>>> 'a' or 'b' 'a' >>> '' or 'b' 'b' >>> '' or [] or {} {} >>> 0 or 'a' or 'c' 'a'
When using or, in the Boolean context from the left to the right calculus value, just like and. If a value is true, or returns that value immediately
If all values are false, or returns the last false value
Note that or in a Boolean context will continue to perform expression calculations until the first true value is found. Then the remaining comparison values will be ignored
3. and-or:
and-or combines the previous two syntaxes and can be inferred.
>>> a='first' >>> b='second' >>> 1 and a or b 'first' >>> (1 and a) or b 'first' >>> 0 and a or b 'second' >>> (0 and a) or b 'second' >>>
This syntax looks similar to the bool ? a : b expression in C language. The entire expression is evaluated from left to right, so the and expression is evaluated first. 1 and 'first' evaluate to 'first', then 'first' or 'second' evaluate to 'first'.
0 and 'first' evaluate to False, then 0 or 'second' evaluate to 'second'.
and-or is mainly used to imitate the ternary operator bool?a:b, that is, when the expression bool is true, take a, otherwise take b.
and-or trick, the bool and a or b expression, when a evaluates to false in a boolean context, does not work like the C language expression bool ? a : b .
4. Safe use of and-or
>>> a="" >>> b="second" >>> (1 and [a] or [b]) [''] >>> (1 and [a] or [b])[0] '' >>>
Since [a] is a non-empty list, it will never be false. Even if a is 0 or '' or some other false value, list [a] is true because it has one element.
A responsible programmer should encapsulate the and-or technique into a function:
def choose(bool,a,b): return (bool and [a] or [b])[0] print choose(1,'','second') #''