在Python中实现XOR

时间:2015-10-04 04:11:39

标签: python xor

所以我试图在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为False"或" P xor Q为True&# 34;)全部取决于XOR的真值表。

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

当我运行此程序时,无论用户输入什么内容,print语句为" P xor Q为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")

2 个答案:

答案 0 :(得分:2)

TF都是" true"因为任何非空字符串都是" true"在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

现在,当两个值彼此不相等时,XOR就是这样:

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

答案 1 :(得分:0)

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

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

>>> bool('False')
True

>>> bool('0')
True

>>> bool('')
False

请参阅the documentation

如果您不使用字符串,则Python会将0{}[]视为等同于False,即零容器或空容器。大多数其他事情都是True

如果要将其中任何一个用作输入,可以使用ast.literal_eval将字符串值转换为实际类型,然后转换为bool以获取TrueFalse。< / p>

>>> 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")