"Boolean" operations in Python (ie: the and/or operators)
Solution 1:
What are other use cases of this,
Conciseness (and therefore clarity, as soon as you get used to it, since after all it does not sacrifice readability at all!-) any time you need to check something and either use that something if it's true, or another value if that something is false (that's for and
-- reverse it for or
-- and I'm very deliberately avoiding the actual keywords-or-the-like True
and False
, since I'm talking about every object, not just bool
!-).
Vertical space on any computer screen is limited, and, given the choice, it's best spent on useful readability aids (docstrings, comments, strategically placed empty lines to separate blocks, ...) than in turning, say, a line such as:
inverses = [x and 1.0/x for x in values]
into six such as:
inverses = []
for x in values:
if x:
inverses.append(1.0/x)
else:
inverses.append(x)
or more cramped versions thereof.
and/or what is the rationale for this rather unintuitive implementation?
Far from being "unintuitive", beginners regularly were tripped up by the fact that some languages (like standard Pascal) did not specify the order of evaluation and the short-circuiting nature of and
and or
; one of the differences between Turbo Pascal and the language standard, which back in the day made Turbo the most popular Pascal dialect of all times, was exactly that Turbo implemented and
and or
much like Python did later (and the C language did earlier...).
Solution 2:
What are other use cases of this,
No.
what is the rationale for this rather unintuitive implementation?
"unintuitive"? Really? I'd disagree.
Let's think.
"a and b" is falsified if a
is false. So the first false value is sufficient to know the answer. Why bother transforming a
to another boolean? It's already false. How much more false is False
? Equally false, right?
So a
's value -- when equivalent to False
-- is false enough, so that's the value of the entire expression. No further conversion or processing. Done.
When a
's value is equivalent to True
then b
's value is all that's required. No further conversion or processing. Why transform b
to another boolean? It's value is all we need to know. If it's anything like True
, then it's true enough. How much more true is True
?
Why create spurious additional objects?
Same analysis for or.
Why Transform to Boolean? It's already true enough or false enough. How much more True can it get?
Try This.
>>> False and 0
False
>>> True and 0
0
>>> (True and 0) == False
True
While (True and 0)
is actually 0
, it's equal to False
. That's false-enough for all practical purposes.
If it's a problem, then bool(a and b)
will force the explicit conversion.
Solution 3:
Basically a and b
returns the operand that has the same truth value as the whole expression.
It might sound a bit confusing but just do it in your head: If a
is False
, then b
does not matter anymore (because False and anything
will always be False
), so it can return a
right away.
But when a
is True
then only b
matters, so it returns b
right away without even looking.
This is a very common and very basic optimization many languages do.