Question About Logic In Python
rrr at ronadam.com
Wed Sep 21 20:53:34 CEST 2005
Steven D'Aprano wrote:
>> bool(a and b) * value
>>Would return value or zero, which is usually what I want when I do this
>>type of expression.
> That's all very interesting, and valuable advice for somebody who doesn't
> understand how Python's logical operators work, but the question is, when
> would you actually want that type of expression?
It's a filter which returns a value or zero depending on conditions a and b.
High pass filter:
(value > 0) * value
Low pass filter:
(value < 0) * value
Band pass filter:
(min < value < max) * value
Changing and and or to return bools only, doesn't prevent us from doing
anything we can already do. It just means changing the context to
explicitly return a non bool when you want one as I did here.
> In practice, how often do you really care that your truth values have the
> specific values 0 and 1 rather than anything false and anything true? In
> what circumstances?
We can separate these into two groups...
1. True and false condition testing in which the result of the
condition is not used in any further expressions.
You are correct in this case, it doesn't matter. Any True values would work.
2. Expressions that will be used in a calculation or another
This matters because if you aren't careful your results may not be what
But group (2) can also be a part of group (1). So then again it may
matter there too.
This has more to do with clarity and separating function into forms that
have the potential for least surprises. Or to put it another way, forms
that are predictable with no exceptional circumstances.
In boolean math it is useful to add and subtract.
>>> a = b = True
>>> a + b
2 # Non boolean result.
>>> True * True
1 # Why not return True here as well?
This is like adding two integer types and getting a float.
There's the possibility of adding two (normally) True values and getting
a False result.
>>> a = True
>>> b = -1
>>> a + b # True_value + True = False_value
Should bool type act like bools as expressed here?
# P1: X = 0 or X = 1
# P2: 0 . 0 = 0
# P3: 1 + 1 = 1
# P4: 0 + 0 = 0
# P5: 1 . 1 = 1
# P6: 1 . 0 = 0 . 1 = 0
# P7: 1 + 0 = 0 + 1 = 1
Table 1: Boolean Postulates
Python's bools work this way if you use 'and' and 'or' and always cast
any non bools to bools first. But it would be easier IMO if bool
operations gave bool results so I wouldn't need to do:
bool_result = a and bool(b)
bool_result = bool(a and b)
On one hand these seem like little things, but little things is
sometimes what will bite you the hardest as they are more likely to get
by your guard.
More information about the Python-list