在 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】:
T
和 F
都是“真”,因为任何非空字符串在 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 = True
或q = True
案例。无论如何,它碰巧大部分都可以工作,但它非常脆弱。【参考方案2】:
如果您对 False
使用空字符串,您的代码可以正常工作,即只需按 return。
空字符串是bool
转换为False
的唯一字符串值:
>>> bool('False')
True
>>> bool('0')
True
>>> bool('')
False
见the documentation。
如果您不使用字符串,Python 认为 0
、、
[]
都等同于 False
,即零容器或空容器。大多数其他的东西都是True
。
如果您想使用其中任何一个作为输入,您可以使用ast.literal_eval
将字符串值转换为实际类型,然后转换为布尔值以获得True
或False
。
>>> 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的主要内容,如果未能解决你的问题,请参考以下文章