The Boolean values in Python are True
and False
, typically used to control if-statements and while-loops.
The Python "bool" type (short for "boolean") has only two values - True
and False
.
Expressions yielding a bool value like a > 10
, can be combined with and or not, like following (printing 'yay' if a is in the range 0..100 inclusive):
if a >= 0 and a <= 100: print('yay')
Python is unique in using the plain words like "and" for this. many languages use "&&" for and, "||" for or.
a and b
→ True if both are True
a or b
→ True if one or the other or both are True
not a
→ Inverts True/False
There is "precedence" between and/or/not, analogous to arithmetic precedence, where "*" has higher precedence than "+".
Precedence order: not
is highest precedence, followed by and
, followed by or
. Mnemonic: not
is like unary minus e.g. '-6', and
is like * mutliplication, or
is like + addition.
Q: what does the following do:
if a < 6 and b < 6 or c < 6:
The and
goes first (higher precedence), so the above is equivalent to the following form with parenthesis added to show the order the comparisons are evaluated:
if (a < 6 and b < 6) or c < 6:
To force the or
to go first, put in parenthesis like this:
if a < 6 and (b < 6 or c < 6):
If you are unsure, you can always add parenthesis to an expression to force the order you want.
Suppose you have an int i, and you want to check if the char at that index is alphabetic .. but only if i is valid. You can write that this way...
if i < len(s) and s[i].isalpha():...
This works because the boolean evaluation goes left to right, stopping ("short-circuiting") as soon as it can. So in the example above, if i < len(s)
is False (i.e. i is large), the whole expression evaluates to False. In particular the s[i].isalpha()
is not evaluated. Attempting to evaluate it would be an error, since i is too large, creating an IndexError.
Writing the i<len(s)
test to the left of the s[i]
in effect protects it, and this is a common programming pattern. Most computer languages use short circuiting in the their boolean expressions like this.