【问题标题】:What does the caret (^) operator do?插入符号 (^) 运算符有什么作用?
【发布时间】:2011-01-27 22:14:36
【问题描述】:

我今天在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,所以我猜测某种字节操作?我似乎找不到关于这个搜索网站的太多信息,除了它对浮点数的行为很奇怪,有人有这个操作员做什么的链接吗?或者你能在这里解释一下吗?

【问题讨论】:

  • 对于整数,它在 C 中也是如此。^_-
  • 仅供参考,在 python shell 中,您可以输入 help('^')
  • 请注意,它对浮点数的行为并不奇怪(它只是对浮点数不起作用!)。另请注意,许多人在寻找求幂运算符 ** 时不小心遇到了这个问题。
  • @seth: help('^') 在我的 Python 2.6.1(苹果版本)中什么也没做。 @S.Lott:当您说“完全覆盖”时,您是指这个(docs.python.org/reference/…)吗?对于不熟悉这个概念的人来说似乎有点稀疏......
  • 我在我的解释器 (2.5.4) 中尝试过这个并得到: >>> help('^') no Python documentation found for '^'

标签: python operators caret


【解决方案1】:

这是一个逐位异或。二进制位运算符记录在chapter 5 of the Python Language Reference

【讨论】:

    【解决方案2】:

    这是一个按位的XOR(异或)。

    如果一个(并且只有一个)操作数(计算结果为)为真,则结果为真。

    演示:

    >>> 0^0
    0
    >>> 1^1
    0
    >>> 1^0
    1
    >>> 0^1
    1
    

    解释你自己的一个例子:

    >>> 8^3
    11
    

    这样想:

    1000#8(二进制) 0011#3(二进制) ---- # 应用异或('垂直') 1011 # 结果 = 11(二进制)

    【讨论】:

    • 一个更具说明性的示例可能包括两个数字在同一位中具有1,以明确1 xor 1 = 0
    • 我想补充一下,您可以通过输入0bX 来计算二进制数,其中 X 是您的二进制数。 0b00010b0010 等。所以,0b1101 ^ 0b1110 会给你0b0011(或 3 个)。
    • 我认为“如果一个(并且只有一个)操作数(评估为)为真,则结果为真。”不准确,布尔异或的定义是什么
    【解决方案3】:

    它根据需要调用对象的__xor__()__rxor__() 方法,对于整数类型执行按位异或。

    【讨论】:

      【解决方案4】:

      一般来说,符号^__xor____rxor__ 方法的infix 版本。无论放在符号的左右两侧的数据类型都必须以兼容的方式实现此功能。对于整数,它是常见的XOR 操作,但例如对于类型为float 和类型为int 的函数没有内置定义:

      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'
      

      关于 Python 的一个巧妙之处在于,您可以在自己的类中覆盖此行为。例如,在某些语言中,^ 符号表示求幂。你可以这样做,就像一个例子:

      class Foo(float):
          def __xor__(self, other):
              return self ** other
      

      然后这样的事情会起作用,现在,仅对于 Foo 的实例^ 符号将表示求幂。

      In [16]: x = Foo(3)
      
      In [17]: x
      Out[17]: 3.0
      
      In [18]: x ^ 4
      Out[18]: 81.0
      

      【讨论】:

      • 哇,这可能吗?我们能否改变+ 运算符的工作方式?
      • 是的,这就是+ 符号如何为list(连接)执行一种操作,同时为数字类型执行另一种操作(数学加法)。在这种情况下,您将覆盖类中的 __add____radd__ 方法。
      • 附带说明,这些 __r*__ 版本(如 __rxor____radd__)将从出现在 右侧的参数中调用中缀符号,并且仅当对左侧符号的函数调用不起作用时。你可以把它想象成try: left_hand_symbol.__xor__(right_hand_symbol); except: right_hand_symbol.__rxor__(left_hand_symbol),但xor 可以被Python Data Model 中的任何可用中缀运算符替换。
      • 这意味着我可以制作自己的运算符,它允许int 与字符串连接? 伙计,python 比我想象的要复杂得多
      • 所以你可以说类似(CompositionA | CompositionB) // CompositionC 的意思,它的意思是“先演奏乐曲A,然后演奏乐曲B,同时同时并行演奏乐曲C。”谈论一段漂亮的代码!
      【解决方案5】:

      当您使用^ 运算符时,会在幕后调用__xor__ 方法。

      a^b 等价于a.__xor__(b)

      此外,a ^= b 等效于 a = a.__ixor__(b)(其中 __xor__ 用作通过使用 ^= 隐式调用 __ixor__ 但不存在时的备用)。

      原则上,__xor__ 所做的完全取决于它的实现。 Python 中的常见用例有:

      • 集合的对称差(所有元素恰好出现在两个集合之一中)

      演示:

      >>> a = {1, 2, 3}
      >>> b = {1, 4, 5}
      >>> a^b
      {2, 3, 4, 5}
      >>> a.symmetric_difference(b)
      {2, 3, 4, 5}
      
      • Bitwise Non-Equal表示两个整数的位

      演示:

      >>> a = 5
      >>> b = 6
      >>> a^b
      3
      

      解释:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2010-09-14
        • 2011-01-24
        • 2010-09-08
        相关资源
        最近更新 更多