在 Python 中实现 XOR

Posted

技术标签:

【中文标题】在 Python 中实现 XOR【英文标题】:Implementing XOR in Python 【发布时间】:2016-01-01 00:12:43 【问题描述】:

所以我正在尝试在 Python 中实现逻辑运算符 XOR。我首先询问用户他们想要测试多少个输入(4 - TT、TF、FT、FF)。我知道 XOR 计算 T&T->F、T&F->T、F&T->T、F&F->F。

我将作为用户输入的第一个布尔值存储在变量 P 中作为字符串。然后我转换为布尔值。就这样……

    P = input("Enter boolean number 1: ")
    P = bool(P)

我不会立即将输入转换为 bool,因为任何非空字符串都会导致 True,无论字符串是否为“False”。

我已经为上述四种可能的条件建立了 XOR 真值表作为四个单独的 if 语句,然后只打印(“P xor Q is False”或“P xor Q is True”),这一切都取决于真值表异或。

所有这些逻辑都在一个 for 循环中,从用户输入他们想要输入的数量开始,从 1 倒数到 0。

当我运行这个程序时,无论用户输入什么,打印语句都是“P xor Q is False”。

我就是不知道为什么!我觉得解决方案很简单,这让我很困扰,所以任何正确方向的帮助都将不胜感激,谢谢!

这是我的代码:

numOfInputs = int(input("Enter the number of inputs: "))

for num in range(numOfInputs, 0, -1):
    print()

    P = input("Enter the first boolean: ")
    P = bool(P)
    Q = input("Enter the second boolean: ")
    Q = bool(Q)

    print()

    if(P == True and Q == True):
        print("P xor Q is False")
    if(P == True and Q == False):
        print("P xor Q is True")
    if(P == False and Q == True):
        print("P xor Q is True")
    if(P == False and Q == False):
        print("P xor Q is False")

【问题讨论】:

“我不会将输入转换为 bool” - 但你可以,在 P = bool(P) 行中。为什么你认为你没有? 那还是和 P = bool(input(...)) 一样吗?我有点想,如果立即强制转换,除了空字符串之外的任何内容都会被评估为“True”。 任何非空字符串都将作为布尔值转换为 True。如果您将 bool 调用移至另一行,这不会改变。 有道理。那我应该如何改变我的方法呢? @PaulGowder 我已经使用literal_eval 发布了一个答案,这是安全的。使用eval 确实不是一个好主意。 【参考方案1】:

TF 都是“真”,因为任何非空字符串在 Python 中都是“真”。这或许可以解释为什么您的循环没有按预期工作。

第一步是修复你的选角:

p = input('Enter a boolean value, True or False: ')
if p.lower() == 'false':
   p = False
q = input('Enter the second boolean, True or False: ')
if q.lower() == 'false':
   q = False

现在,异或只是两个值不相等时:

if p != q:
   print('p xor q is true')
else:
   print('p xor q is false')

【讨论】:

刚刚也想通了。作品!我将如何仅使用逻辑运算符(and/not/or)来实现它,所以没有等号或不等号? @S.Tolm 您的比较代码很好,只是您的输入需要修复。 这里没有p = Trueq = True 案例。无论如何,它碰巧大部分都可以工作,但它非常脆弱。【参考方案2】:

如果您对 False 使用空字符串,您的代码可以正常工作,即只需按 return

空字符串是bool 转换为False 的唯一字符串值:

>>> bool('False')
True

>>> bool('0')
True

>>> bool('')
False

见the documentation。

如果您不使用字符串,Python 认为 0[] 都等同于 False,即零容器或空容器。大多数其他的东西都是True

如果您想使用其中任何一个作为输入,您可以使用ast.literal_eval 将字符串值转换为实际类型,然后转换为布尔值以获得TrueFalse

>>> import ast.literal_eval
>>> value = literal_eval('False')
>>> type(value)
bool
>>> value
False

>>> value = literal_eval('0')
>>> type(value)
int
>>> bool(value)
False

您的布尔比较可以简化,例如:

if(P == True and Q == False):
    print("P xor Q is True")

可能是:

if P and not Q:
    print("P xor Q is True")

【讨论】:

以上是关于在 Python 中实现 XOR的主要内容,如果未能解决你的问题,请参考以下文章

在 Python 中实现类似列表的索引访问

在 Python 中实现 Typescript 接口

python 在python中实现倒数第一个堆栈

一日一技:在 Python 中实现函数重载

在 Python 中实现 XOR

python 在Python中实现经典的快速排序算法