有没有一种巧妙的方法可以在 IF 语句中对两个条件执行异或运算?

Is there a neat way to perform XOR operation on two conditions in IF statement?

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

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

很明显,如果其中一个数字为负数但不是两个都为负数,则最终字符串将带有负号。否则,两者都是正数,字符串上不会有负号。

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

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

我也试过 xor 以防万一,但显然运气不好。关于更简洁的方法有什么建议吗?

如果使用括号

^ 将正常工作:

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

你也可以用!=代替^。它的工作方式与此处完全相同,但可能更清晰一些。

要记住 ^ 的一件事是,如果任何表达式是非布尔值,它将出现意外行为:a ^ b 不等于 (a and not b) or (b and not a) 如果,说 a = 5b = 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