Menu

Python 运算符:算术、比较、逻辑、成员与身份运算符

全面了解 Python 运算符:算术、比较、逻辑、赋值、成员和身份运算符,每一种都配有示例。

本页包含可运行的编辑器。编辑、运行,立即查看输出。

运算符就是表示操作的符号

运算符是一个符号(或简短的关键字),它告诉 Python 对一个或两个值做某件事:相加、比较、检查一个是否包含另一个。基础数学中的几个你已经认识了;Python 还有另外一些用于逻辑、包含关系和身份判断的运算符。

我们会逐一介绍主要的几类。

算术运算符

标准的数学运算符,再加上几个 Python 特有的:

这个列表中有两点很容易忘:

  • 即使两边都是整数,/ 也返回浮点数。10 / 2 得到 5.0。要做整数除法,请使用 //。
  • % 是取模。n % 2 == 0 是判断 n 是否为偶数最简洁的写法。

Python 遵循标准的数学优先级:** 比 * 和 / 结合得更紧,而 * 和 / 又比 + 和 - 结合得更紧。括号的优先级最高:

只要有一点不确定,就大方地加上括号。它们没有任何代价,还能让意图一目了然。

比较运算符

六种比较,每一种都返回布尔值:

Python 允许链式比较,这在其他语言中不常见,而且很实用:

这读作“age 至少为 18 且小于 65”。它在底层等价于 18 <= age and age < 65,但读起来更像数学写法。

逻辑运算符

用英文单词而不是符号来写:

有两个细节值得了解:

短路求值。and 遇到第一个假值就停下;or 遇到第一个真值就停下。如果左边已经决定了结果,右边根本不会被求值。这让你可以安全地防止出错:

and/or 返回的是值,不一定是 True/False。它们返回决定结果的那个操作数:

你会在实际代码中看到 name = user_input or "anonymous",这就是基于这种行为的默认值写法。

关于这三个运算符的完整规则,包括哪些值算作假值、not、and 和 or 之间的优先级,以及为什么 and 与 & 不同,请参阅 Python and、or、not。

赋值运算符

= 用来赋值。复合形式把运算和赋值合在一起:

复合形式也适用于字符串(s += "more")和列表(lst += [4, 5])。它们并不比完整写法更快,只是更短。

成员运算符:in 和 not in

检查一个值是否出现在容器中:

in 适用于任何可迭代对象:列表、元组、集合、字符串、字典等等。对于大规模查找,在列表上用 in 是 O(n);在集合或字典上用 in 是 O(1)。当你要多次检查成员关系时,这一点就很重要了。

身份运算符:is 和 is not

is 检查两个变量是否指向内存中的同一个对象,而不只是值相等:

你几乎总是需要 ==。is 真正派上用场的地方,是和 None、True、False 做比较:

社区的约定很明确:写 is None,而不是 == None。is True 也一样(不过你很少需要它)。

按位运算符(初读时可以跳过)

Python 还有按位运算符 &、|、^、~、<<、>>,用于操作整数的单个二进制位。它们在密码学、底层网络编程和某些算法中很有用。初次学习时,可以放心地忽略它们。

海象运算符(:=)

Python 3.8 新增了 :=,它在一个表达式中既赋值又返回值。当你想在条件中同时保存并检验一个结果时很有用:

如果没有海象运算符,你就得调用两次 len(numbers),或者多写一行。它不是必需的,在能减少重复的地方使用即可。

运算符优先级速查表

你实际会用到的运算符,按结合紧密程度从高到低排列:

  1. **:幂运算
  2. *、/、//、%:乘法和除法
  3. +、-:加法和减法
  4. <、<=、>、>=、==、!=:比较
  5. not
  6. and
  7. or

拿不准的时候,就加括号。清晰胜过炫技。

常见问题

Python 中主要有哪几类运算符?

算术运算符(+、-、*、/、//、%、**)、比较运算符(==、!=、<、<=、>、>=)、逻辑运算符(and、or、not)、赋值运算符(=、+=、-= 等)、成员运算符(in、not in)和身份运算符(is、is not)。

Python 中 == 和 is 有什么区别?

== 检查两个值是否相等。is 检查两个变量是否指向内存中的同一个对象。对于 None、True 和 False,请使用 is,因为它们是单例。其他情况下,你几乎总是需要 ==。

Python 中 % 运算符有什么作用?

对数字来说,% 是取模运算符,返回除法的余数。17 % 5 等于 2。对字符串来说,它是一种旧式的格式化语法(比如 "hello %s" % name),不过现在基本已经被 f-string 取代了。

Coddy 编程语言插图

和 Coddy 一起学编程

开始