这些运算符 (**, ^, %, //) 的含义是什么?

82
除了标准的+-*/运算符外,还有什么意思(**^%//)?
>>> 9+float(2) # addition
11.0
>>> 9-float(2) # subtraction
7.0
>>> 9*float(2) # multiplication
18.0
>>> 9/float(2) # division
4.5
>>>
>>> 9**float(2) # This looks like a square, (i.e. power 2) 
81.0
>>> 9**float(3) # So ** is equivalent to `math.pow(x,p)` ?
729.0

^ 运算符怎么样?

>>> 9^int(2) # What is `^` in `x^u` , it only allows `int` for `u`
11
>>> 9^int(3)
10
>>> 9^int(4)
13
>>> 9^int(5)
12
>>> 9^int(6)
15
>>> 9^int(7)
14
>>> 9^int(8)
1
>>> 9^int(9)
0
>>> 9^int(10)
3
>>> 9^int(11)
2
>>> 9^int(12)
5

%x%m中返回一个普通的余数模,但仅当m < x时才是这样,为什么会这样?%做了什么?

>>> 9%float(2)
1.0
>>> 9%float(3)
0.0
>>> 9%float(4)
1.0
>>> 9%float(5)
4.0
>>> 9%float(6)
3.0
>>> 9%float(7)
2.0
>>> 9%float(8)
1.0
>>> 9%float(9)
0.0
>>> 9%float(10)
9.0
>>> 9%float(11)
9.0
>>> 9%float(12)
9.0

//运算符怎么样?它是做什么的?

>>> 9//float(2)
4.0
>>> 9//float(3)
3.0
>>> 9//float(4)
2.0
>>> 9//float(5)
1.0
>>> 9//float(6)
1.0
>>> 9//float(7)
1.0
>>> 9//float(8)
1.0
>>> 9//float(9)
1.0
>>> 9//float(1)
9.0
>>> 9//float(0.5)
18.0

41
我感觉你已经回答了自己的问题。 - squiguy
3
如果你在谷歌上搜索"python operators",很可能第一个链接就是一个不错的操作符列表。 - Hot Licks
如果您有关于所链接文档的具体问题,请引用您不理解的内容并询问相关问题。 - phant0m
所有这些都是算术(**,%,//)和位(^)运算符 - Python 运算符在此有详细讨论 - Hitesh Garg
请参见 https://dev59.com/q2Ah5IYBdhLWcg3wE__v =) - alvas
1
很难确定这里在问什么。这个问题含糊不清、不完整、过于宽泛或是修辞性的,无法在当前形式下得到合理的回答。为了帮助澄清这个问题以便重新开放,需要寻求帮助。尽管如此,该问题已经获得了64个赞和32次收藏(截至撰写本文)。其中一个答案获得了122个赞,另一个获得了10个赞,最后一个获得了36个赞。尽管如此,该问题仍然被关闭。我来这里是有关“//”的问题,并找到了答案。 - zelfde
3个回答

145
  • **: 指数运算
  • ^: 异或运算(按位)
  • %: 取模运算
  • //: 整除运算(舍弃余数)

38
你可以在Python语言参考中找到所有这些运算符,但你需要浏览一下才能找到它们。正如其他答案所说: ** 运算符是指数运算符。 a ** b 表示将 a 的值乘以自身 b 次方。同样的,** 符号也用于函数参数和调用符号中,但其含义不同(传递和接收任意关键字参数)。 ^ 运算符执行二进制异或操作。 a ^ b 将返回一个值,其中仅设置了 ab 中的位,而不是两者都有。这个很简单! % 运算符主要用于找到两个整数的模数。 a % b 返回除以 b 后的余数。与其他一些编程语言(如 C)中的模数运算符不同,在 Python 中,模数运算符的符号将与 b 相同,而不是与 a 相同。相同的运算符也用于“旧”格式的字符串格式化,因此如果 a 是格式化字符串,b 是可以插入到 a 中的值(或值元组),则 a % b 可以返回一个字符串。 // 运算符执行 Python 版本的整数除法。Python 的整数除法与其他一些语言(如 C)提供的整数除法不完全相同,因为它向负无穷大取整,而不是向零取整。与模数运算符一起使用,可以说 a == (a // b)*b + (a % b)。在 Python 2 中,当你用普通除法运算符 / 除两个整数时,向下取整是默认行为。由于这可能出乎意料(特别是当你对作为函数参数传递的数字类型不挑剔时),Python 3 已经改变了这种行为,使“真”(浮点)除法成为否则将被四舍五入的除法的规范,并且只有在明确请求时才进行“地板”除法。(您还可以通过将 from __future__ import division 放在文件顶部来在 Python 2 中获得新行为。我强烈建议这样做!)

关于“%”:不仅符号不同,绝对值也不同! - phant0m
1
感谢您提供这些准确的描述,特别是关于模数和整数除法运算符。 - WestCoastProjects

10
你是正确的,** 是幂函数。 ^ 是按位异或。 % 确实是模运算,但请注意,对于正数,只要 m > x,就有 x % m = x。这遵循模的定义。(此外,Python 指定 x % m 具有 m 的符号。) // 是一种除法运算,通过丢弃余数返回整数。这是大多数编程语言中使用 / 的标准除法形式。然而,Python 3 改变了 / 的行为,即使参数是整数,也执行浮点除法。在 Python 2.6 和 Python 3 中引入了 // 运算符,以提供一个整数除法运算符,它将在 Python 2 和 Python 3 之间保持一致。这意味着:
| context                                | `/` behavior   | `//` behavior |
---------------------------------------------------------------------------
| floating-point arguments, Python 2 & 3 | float division | int divison   |
---------------------------------------------------------------------------
| integer arguments, python 2            | int division   | int division  |
---------------------------------------------------------------------------
| integer arguments, python 3            | float division | int division  |

更多细节请参见此问题:Python 2.7和3.3中的除法


1
值得注意的是,x % m 总是返回与 m 相同符号的结果。 - hyper-neutrino
@HyperNeutrino 谢谢。我最初只对解释OP所问的特定情况感兴趣,但由于这个答案已经变得稍微更加通用,我已经添加了一个相关注释。 - Kyle Strand
@HyperNeutrino ...在你的评论中,“x%m始终会给出具有m符号的结果”,请详细说明“m的符号”。这是什么样子的?我很难理解。谢谢! - Jeremy
@Jeremy 如果 m 是正数,答案将是正数。例如,5 % 32,但 -5 % 31,而不是 -2。对于 m 为负数的情况也是如此。这与某些语言(如我所知道的 Java)的处理方式不同。 - hyper-neutrino
@HyperNeutrino ...哦! "符号" 正数(+)或负数(-)。谢谢! - Jeremy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接