问题描述
python 新手。使用 ^
运算符时如何验证实现 n 个参数异或的函数?我扩展了代码来处理字符串输入。为此,我假设 0.0
、''
和 None
将是 0
,而任何其他正值或负值都将是 1
.但是,整数值将以通常的方式处理,因此 6^5 == 3
。我更愿意将输入强制转换为可以强制转换的整数(例如,11.0
或 '11'
可以转换为 int
)。
我已经在其他地方看到了 Python 中逻辑与按位异或运算的问题,但它们的局限性在于讨论仅限于输入 a
和 b
。我想验证一个测试到任意数量的参数和强制输入的解决方案。
检查其他解决方案
我尝试了一些来自 How do you get the logical xor of two variables in Python? 的逻辑异或建议。但是,我尝试过的所有解决方案似乎都不起作用。例如:
-
^
不适用于字符串,并且不可迭代。 -
int(bool(a) ^ bool(b))
不适用于n
参数。 -
(a and not b) or (not a and b)
如果输入b
是字符串,则中断。
我尝试了什么
我从以下代码开始。
图表 1
def xor(*args):
return int(any(args) != all(args))
Exhibit 1 的逻辑只适用于两个参数的情况,我还没有弄清楚在更多参数的情况下它的真值表是什么样的。因此,我调整了函数以使用 ^=
运算符,如下所示。
图表 2
def xor(*args,parity = True):
exOr = False
checker = list()
for arg in args:
# try to coerce arg to int,so that '11' = 11,11.0 = 11
exOr ^= arg if type(arg) == int else bool(arg)
checker.append(bool(arg))
exOr = 0 if all(checker) and not parity else exOr
return int(exOr)
Exhibit 2 的逻辑似乎适用于我测试过的任何数量的参数,尽管在纸上手动写下真值表并在 python 输出中跟踪很容易出错。此外,Exhibit 2 中的代码在可以强制的地方根本不强制输入。
为什么在图表 2 中使用奇偶校验参数?
对于两个以上的输入(xor - The Interesting Gate 和 How is an xor with more than two inputs supposed to work)的异或逻辑的两种解释似乎存在一些分歧。在我看来,针对两个以上输入的解决方案应该在两个选项之间进行选择,因为这两个选项显然都已写入标准,这就是我添加累加器和反转 all(checker)
的逻辑的原因。
问题总结
我希望上面的讨论是有道理的。我不知道如何有效地测试代码,也不知道如何将输入强制转换为 int
(如果可以)。为了测试代码,我觉得我需要一种比将纸质笔记与函数输出进行比较更好的方法。
解决方法
这篇文章是关于使用 try:
和 except:
的强制转换部分的解决方案。然而,这并不能回答测试问题。
在原函数中:
def cInt(arg):
tmp = arg
try:
arg = int(float(arg))
if arg == float(tmp):
return arg
else:
return tmp
except:
return tmp
def xor(*args,parity = True):
exOr = False
checker = list()
for arg in args:
arg = cInt(arg)
exOr ^= arg if type(arg) == int else bool(arg)
checker.append(bool(arg))
exOr = 0 if all(checker) and not parity else exOr
return int(exOr)
xor(1,'1.0',"1")
xor(1,"1",parity = False)
1
0