The AND/OR part Re: [Tutor] Sample9.py and Sample9.pyc & seting path to Python open files ...
Magnus Lycka
magnus at thinkware.se
Wed Nov 26 13:28:39 EST 2003
> So in the one from techiwarehouse.com, there is an explanation of so-called Logical operators: and, or, and not. I do not understand explanation of and operator:
In Boolean arithmetic, there are only two values, True (let's
call that 1 for the moment) and False, let's call that 0 for
now. There are also three operators, AND (we'll call that *),
OR (let's call that +) and finally NOT (let's call that !).
This arithemtic is based on a philosophical concept of logic
and truth. IF the battery works, AND the light bulb is working
AND I turn it on, my lamp will emit light.
Written as an equation:
emit_light = battery_works AND light_bulb_works AND turned_on
Or rephrased:
IF the battery does NOT work OR the light bulb is NOT working
or I do NOT turn it on, the lamp will NOT emit light.
Written as an equation:
NOT emit_light = (NOT battery_works) OR (NOT light_bulb_works) OR
(NOT turned_on)
(Actually, this transformation from AND to NOT/OR is called
de Morgans theorem, but that doesn't matter now.)
In general:
True AND True = True
True AND False = False
False AND True = False
False AND False = False
True AND True = True
True AND False = False
False AND True = False
False AND False = False
NOT True = False
NOT False = True
Written with the shorter notation I suggested above, we get:
1 * 1 = 1
1 * 0 = 0
0 * 1 = 0
0 * 0 = 0
1 + 1 = 1
1 + 0 = 1
0 + 1 = 1
0 + 0 = 0
!1 = 0
!0 = 1
As you see, AND behaves exactly like multiplication,
and OR is very close to addition, with the little
quirk that 1 + 1 = 0. Note that this is not normal
binary arithmetic, where 1 + 1 = 10. Still, it's
close enough to normal arithemtic for 1, 0 and *, +
to become popular symbols for True, False and AND, OR.
If you generalize the equations above, and let X or Y
represent values that can be either True or False,
we can say that
if X is true:
X AND Y = Y
X OR Y = X
if X is false:
X AND Y = X
X OR Y = Y
Are you following this? It's a generalization of
1 AND 1 = 1
1 AND 0 = 0
0 AND 1 = 0
0 AND 0 = 0
1 OR 1 = 1
1 OR 0 = 1
0 OR 1 = 1
0 OR 0 = 0
If Boolean theory, this assumes that X is either true
or false. In some programming languages, such as Python,
this concept has been extended a bit.
Basically, in Python, 0, 0j, 0.0, "", [], (), {}, None
and instances of classes where the __nonzero__ method returns
a false value are false. All (?) other values are true.
So, this...
>>> 0 or 5
5
..is completely in line with George Boole. Five is one of
many representations of True, and 0 is one of several
representations of False, so what is says above is "False
AND True = True" That's completely correct.
A possible problem occurs if you have to completely unfounded
idea that all truths are equal, and that all incarnations of
false are equal, since for instance
>>> (0 or 5) == (0 or 3)
False
One truth isn't always identical another... (Or as another
George put it: "All animals are equal, but some are more
equal than others." ;)
In the case of comparisions (<, <=, ==, !=, > and >=) Python
returns the values True (which is basically 1 on disguise)
and False (which is basically 0 in disguise). In previous
versions it returned 1 and 0. The not-operator also returns
True or False.
>>> not 0
True
>>> 1 == ''
False
>>> not "Hello"
False
>>> 5 < 3
False
It would be very odd if "1 == 1" would return 42 or some
other arbitrary value, but in the case of AND and OR, it's
very useful to use the generalization I mentioned above:
if X is true:
X AND Y = Y
X OR Y = X
if X is false:
X AND Y = X
X OR Y = Y
This enables us to use AND and OR as very compact versions
of if statements that we can put inside expressions. For
instance, if we have a variable X that can either contain
an integer on the value None, and we want to treat None as
0 from a mathermatical perspective, we can write something
like...
R = ((X or 0) + Y) * Z
..instead of...
if X:
R = (X + Y) * Z
else:
R = Y * Z
Or, if you are displaying email messages, you could use
something like...
print subject or "<no subject>"
..instead of...
if subject:
print subject
else:
print "<no subject>"
I think it's less common that the and-operator is used
like this in Python, but for instance, you could do...
y = (x >= 0 and x) * 5
..instead of...
if x > 0:
y = x > 5
else:
y = 0
--
Magnus Lycka, Thinkware AB
Alvans vag 99, SE-907 50 UMEA, SWEDEN
phone: int+46 70 582 80 65, fax: int+46 70 612 80 65
http://www.thinkware.se/ mailto:magnus at thinkware.se
More information about the Tutor
mailing list