Python中的插入符号操作符(^)是做什么的?

Python中的插入符号操作符(^)是做什么的?,python,operators,caret,Python,Operators,Caret,我今天在python中遇到了插入符号操作符,并进行了尝试,得到了以下输出: >>> 8^3 11 >>> 8^4 12 >>> 8^1 9 >>> 8^0 8 >>> 7^1 6 >>> 7^2 5 >>> 7^7 0 >>> 7^8 15 >>> 9^1 8 >>> 16^1 17 >>> 15^1

我今天在python中遇到了插入符号操作符,并进行了尝试,得到了以下输出:

>>> 8^3
11
>>> 8^4
12
>>> 8^1
9
>>> 8^0
8
>>> 7^1
6
>>> 7^2
5
>>> 7^7
0
>>> 7^8
15
>>> 9^1
8
>>> 16^1
17
>>> 15^1
14
>>>

它似乎是基于8,所以我猜是某种字节运算?我似乎找不到关于这个搜索站点的更多信息,除了它在浮动中的行为异常,有没有人链接到这个操作员的工作,或者你能在这里解释一下吗?

这是一点一点的排他性的。二进制位运算符记录在中。

它是位运算符(异或)

如果一个操作数(且只有一个)的计算结果为true,则结果为true

证明:

>>> 0^0
0
>>> 1^1
0
>>> 1^0
1
>>> 0^1
1
要解释您自己的一个示例:

>>> 8^3
11
这样想:

1000 # 8 (binary) 0011 # 3 (binary) ---- # APPLY XOR ('vertically') 1011 # result = 11 (binary) 1000#8(二进制) 0011#3(二进制) ----#应用异或(“垂直”) 1011#结果=11(二进制)
它根据需要调用对象的
\uuuuxor\uuuxor()
\uuxor\uuxor()
方法,对于整数类型,该方法执行按位异或。

一般来说,符号
^
\uuxor\uxor
\uxor\ucode>方法的一个版本。符号左右两侧放置的任何数据类型都必须以兼容的方式实现此功能。对于整数,它是常见的异或运算,但例如,对于类型为
int
的类型
float
,没有内置函数定义:

In [12]: 3 ^ 4
Out[12]: 7

In [13]: 3.3 ^ 4
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-13-858cc886783d> in <module>()
----> 1 3.3 ^ 4

TypeError: unsupported operand type(s) for ^: 'float' and 'int'
然后类似的东西会起作用,现在,仅对于
Foo
的实例,
^
符号将意味着求幂

In [16]: x = Foo(3)

In [17]: x
Out[17]: 3.0

In [18]: x ^ 4
Out[18]: 81.0

使用
^
操作符时,在帘幕后面调用该方法

a^b
相当于
a.\uuuxor\uuuu(b)

另外,
a^=b
相当于
a=a.\uuuuuuixor(b)
(其中
\uuuuuuuuxor\uuuuxor
通过使用
^=/code>隐式调用
\uuuuuixor\uuuuuxor
时用作回退)

原则上,
\uuuxor\uuxor
的功能完全取决于它的实现。Python中的常见用例有:

  • 集合的对称差异(所有元素正好出现在两个集合中的一个集合中)
演示:

  • 两个整数的位按位不相等
演示:

说明:

    101 (5 decimal)
XOR 110 (6 decimal)
-------------------
    011 (3 decimal)

对于整数,与它在C.^中所做的相同,在python shell中,您可以键入
help('^')
注意,它对于浮点数的行为并不奇怪(它只是不适用于浮点数!)。还要注意的是,许多人在寻找求幂运算符时意外地遇到了这个问题。@seth:
help('^')
在我的Python 2.6.1(apple build)中没有任何作用@洛特:你说的“完全覆盖”是指这个吗?。对于不熟悉这个概念的人来说似乎有点稀疏……我在我的解释器(2.5.4)中尝试了这个方法,得到了:>>>帮助(“^”)没有为“^”找到Python文档一个稍具说明性的示例可能包括两个在同一位中具有
1
的数字,以明确
1 xor 1=0
。我想补充的是,您可以通过键入
0bX
来实现二进制数,其中X是二进制数
0b0001
0b0010
,等等。所以,
0b1101^0b1110
会给你
0b0011
(或3)。我认为“如果一个(且只有一个)操作数(计算结果)为真”,这是不准确的,这将是布尔xorwoah的定义,这是可能的吗?我们也可以改变
+
操作符的工作方式吗?是的,
+
符号在对数值类型执行另一种操作(数学加法)的同时,可以对
列表执行一种操作(串联)。在这种情况下,您将重写类中的
\uuuuu add\uuuuuuu
\uuuu radd\uuuuu
方法。作为旁注,这些方法的
\uuuuuu r*\uuuuuuuu
版本(如
\uuuuuuuxor\ucode>或
\uuu radd\uuuuu
)将从中缀符号右侧的参数调用,并且仅当对左手符号的函数的调用不起作用时。你可以把它想象成
try:left\u hand\u symbol.\uuuuuxor\uuuuu(right\u hand\u symbol);除了:右侧符号。\ uuuurxor\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuo(左侧符号)
,但是
xor
可以被中任何可用的中缀操作符所取代。这意味着我?伙计,python比我想象的要复杂得多,所以你可以说类似于
(CompositionA | CompositionB)//CompositionC
,它的意思是“先播放构图A,然后播放构图B,同时同时并行播放构图C。”谈谈一段漂亮的代码吧!
>>> a = {1, 2, 3}
>>> b = {1, 4, 5}
>>> a^b
{2, 3, 4, 5}
>>> a.symmetric_difference(b)
{2, 3, 4, 5}
>>> a = 5
>>> b = 6
>>> a^b
3
    101 (5 decimal)
XOR 110 (6 decimal)
-------------------
    011 (3 decimal)