1. “and” and “or” returns the object
>>> [] and {}
[] # what???
Python’s “and” operation and “or” operation doesn’t returns “True” or “False”.
A or B # is equal to
A if A is True else B
# and also
A and B # is equal to
A if A is False else B
Note that neither and nor or restrict the value and type they return to
False
andTrue
, but rather return the last evaluated argument.
ref: https://docs.python.org/3/reference/expressions.html#boolean-operations
2. Chaining comparison operators
>>> def f(x):
... print(x)
... return x
...
>>> 1 > f(2) > f(3)
2
False
>>> 1 < f(2) < f(3)
2
3
True
>>> 1 > f(2) and f(2) > f(3)
2
False
>>> 1 < f(2) and f(2) < f(3)
2
2
3
True
>>> a = 2
>>> a > 1 == a > 1
False
>>> a < 3 == True
False
>>> 1 < 3 is True
False
Comparisons can be chained arbitrarily, e.g.,
x < y <= z
is equivalent tox < y and y <= z
, except that y is evaluated only once (but in both cases z is not evaluated at all whenx < y
is found to be false). Formally, if a, b, c, …, y, z are expressions and op1, op2, …, opN are comparison operators, thena op1 b op2 c ... y opN z
is equivalent toa op1 b and b op2 c and ... y opN z
, except that each expression is evaluated at most once.
ref: https://docs.python.org/3/reference/expressions.html#comparisons