On Jul 15, 2009, at 12:07 AM, Dr. Phillip M. Feldman wrote:
I appreciate the effort that people have made, but I'm not impressed
with any
of the answers. For one thing, xor should be able to accept an
arbitrary
number of input arguments (not just two)
You originally proposed this in the context of the existing short-
circuit boolean operators. Those operators (being infix) take only
two operands.
and should return True if and only
if the number of input arguments that evaluate to True is odd
The existing and/or operators always return the value of one of the
operands--not necessarily True or False--which is another important
property, but one that can't be translated fully to xor. Given the
lack of context in your original post, hopefully you'll forgive me
being unimpressed by your not being impressed. :)
Here's my code:
def xor(*args):
"""xor accepts an arbitrary number of input arguments, returning
True
if and only if bool() evaluates to True for an odd number of the
input
arguments."""
result= False
for arg in args:
if bool(arg): result= not result
return result
If all you want is a True or False result, I'd write it like this:
import operator
def xor(*args):
return reduce(operator.xor, map(bool, args)) # or imap
In order to make it act more like the other logical operators, I'd use
MRAB's 2-argument xor as the reducer--though I can't really see the
utility.
def xor2(a, b):
return (not b and a) or (not a and b)
def xor(*args):
return reduce(xor2, args)
You may also find this question interesting:
http://stackoverflow.com/questions/432842/
-Miles
--
http://mail.python.org/mailman/listinfo/python-list