有没有一种巧妙的方法在IF语句中的两个条件下执行XOR运算?

时间:2016-10-30 16:48:10

标签: python binary logical-operators xor

我目前正在创建一个二进制计算器,它允许正负二进制输入。关于我的问题,我有以下代码:

if (firstvalue[0] == "-" and not secondvalue[0] == "-") or (secondvalue[0] == "-" and not firstvalue[0] == "-"): 
    invertedbinary.append("-")

很明显,如果任何一个数字为负数但不是两个数字,则最终字符串将具有负号。否则,两者都是正数,并且字符串上没有负号。

我只是想知道是否有更简洁的方法来做到这一点?我尝试使用^,但我猜它只是一个按位运算符。

if firstvalue[0] == "-" ^ secondvalue[0] == "-":

我也试过xor,但是显然没有运气。有关更简洁的方法的任何建议吗?

2 个答案:

答案 0 :(得分:6)

如果您使用括号,

^将正常工作:

if (firstvalue[0] == "-") ^ (secondvalue[0] == "-"):

您也可以在!=的位置使用^。它在这里的工作方式完全相同,但可能会更加清晰。

答案 1 :(得分:1)

使用^要记住的一件事是,如果任何表达式是非bool,它会出现意外行为:a ^ b不等于(a and not b) or (b and not a),如果a = 5 }和b = 2

由于xor不能短路,你也可以使用一个函数。

from operator import xor as xor_
from functools import reduce

def xor(*args):
    return reduce(xor_, map(bool, args))

if xor(firstvalue[0] == '-', secondvalue[0] == '-'):
    ...

这适用于任意数量的值,也适用于非布尔值,因此您可以执行xor(1, 1, 1, 1) = 0xor(1, 1, 1, 1, 1) = 1