如何使用n个参数和强制验证在python中执行xor的函数? 图表 1图表 2为什么在图表 2 中使用奇偶校验参数?

问题描述

python 新手。使用 ^ 运算符时如何验证实现 n 个参数异或的函数?我扩展了代码来处理字符串输入。为此,我假设 0.0''None 将是 0,而任何其他正值或负值都将是 1 .但是,整数值将以通常的方式处理,因此 6^5 == 3。我更愿意将输入强制转换为可以强制转换的整数(例如,11.0'11' 可以转换为 int)。

我已经在其他地方看到了 Python 中逻辑与按位异或运算的问题,但它们的局限性在于讨论仅限于输入 ab。我想验证一个测试到任意数量的参数和强制输入的解决方案。

检查其他解决方

我尝试了一些来自 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 GateHow 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

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...