运算符
约 1773 字大约 6 分钟
2025-04-03
比较运算符主要有六个:
- 比较运算符
- 算术运算符
- 赋值运算符
- 逻辑运算符
- 1把 1 < x < 10 写成连串比较,再翻译成 1 < x and x < 10,确认 Python 支持链式比较。
- 2跑一遍 1 and 3、0 and 8、9 and 4,验证 and/or 返回的是“最后决定结果的那个操作数”,而不是布尔值。
- 3对小整数(如 a = 1; b = 1)和大整数(如 10**20)分别比较 is,理解小整数池。
- 4试 a is 1 会拿到一个 SyntaxWarning,记住 is 用来比对象身份,不用来比字面量。
- 5用 in 判断元素是否在列表/字符串中,比写 for 循环找一遍优雅得多。
比较运算符
比较运算符主要有六个:
>:大于<:小于>=:大于等于<=:小于等于==:等于!=:不等于
比较运算返回的值为 True 或 False。
算术运算符
Python 中的算术运算符有七个:
+:加和-:相减*:相乘/:相除//:整除 | 地板除(向下取整)**:幂运算%:取余(模)
算术运算主要用于数字的计算。字符串也可以用 + 和 * 进行拼接。
赋值运算符
赋值运算符为 =。在 Python 中,为了输入简便,还从其中算术运算符中衍生出了七种赋值运算符:+=,-=, *=, /=, //=, **=, %=。它们的用法和含义如下:
a = 10
b = 2
b += 1 # b = b + 1
a -= 1 # a = a - 1
a *= 2 # a = a * 2
a /= 2 # a = a / 2
a //= 2 # a = a // 2
a **= 2 # a = a ** 2
a %= 2 # a = a % 2逻辑运算符
逻辑运算符有三个:与(and,并且)、或(or)、非(not,不是)。
逻辑运算的优先级是 () > not > and > or,查找顺序为从左向右。例如:
3>2 and 4>2 or True and not False and True
# 先运算比较
True and True or True and not False and True
# 再运算 not
True and True or True and True and True
# 运算 and
True or True
# 最后运算 or
True当数字之间进行逻辑运算时,有这样一套规则:
and 数字进行逻辑运算时:
两边都不为 0 和 False 时,选择 and 后边的内容
两边都为假时,选择 and 前的内容
一真一假选择假
or 数字进行逻辑运算时:
两边都不为 0 和 False 时,选择 or 前边的内容
两边都为假时,选择 or 后边的内容
一真一假选择真官方给出的运算规则是这个样子的:
| 操作 | 返回值 |
|---|---|
| x or y | 如果 x 为假,返回 y,否则返回 x |
| x and y | 如果 x 为假,返回 x,否则返回 y |
| not x | 如果 x 为假,返回 True,否则返回 False |
可以通过下面的示例来找到这些规律:
python playground
print(1 and 3)
print(0 and 8)
print(9 and 4)
print(False and 5)成员运算符
在 Python 中,成员运算符有两个:
a in b:用于判断a是否在b中a not in b:用于判断a是否不在b中
具体使用示例:
python playground
name = 'alice'
msg = 'lic'
if name in msg:
print('msg is in name')
else:
print('msg is not in name')标识号比较运算符
与成员运算符类似,标识号比较运算符也有两个:
a is b:用于判断a和b是否是同一个对象a is not b:用于判断a和b是否不是同一个对象
is 运算用来表示两个对象是否指向同一个内存地址。一个对象的内存地址可使用 id() 函数来查看。需要注意的是,is 一般只会用来比较变量而不会用来比较字面量,如果真这么做了虽然不会报错,但是会有警告
python playground
a = '张三'
b = '张三'
c = a
print(id(a)) # 4305017376
print(id(b)) # 4305017696
print(id(c)) # 4305017376
print(a is b) # False
print(a is c) # True
print(a is not b) # True
print(a == b) # True
print(a is 1) # False 同时有警告 SyntaxWarning: "is" with 'int' literal这里有个知识点,当 a 和 b 为相同的比较小的数字(这个范围可能和 Python 版本有关,例如 Python3.13 版本是大于等于 -5 小于等于 256)时,他们的内存地址是相同的。而当他们是比较大的数字时,即便数值一样,也会存储在不同的内存地址。这个特性是 Python 暂存机制的一种,小数据池机制。暂存机制会在Python 垃圾回收机制中详细讨论
python playground
# 当 a 和 b 相等且是小数字时,他们的内存地址相同,a is b 为 True
a = 1
b = 1
print(id(a)) # 4320471696
print(id(b)) # 4320471696
print(a is b) # True
# 当 a 和 b 相等但是大数字时,他们的内存地址不同,a is b 为 False,但是 a == b 仍为 True
a = 1000000000000000000000000000
b = 1000000000000000000000000000
print(id(a)) # 4305107872
print(id(b)) # 4305108352
print(a is b) # False
print(a == b) # True运算符优先级
来源:https://docs.python.org/zh-cn/3.13/reference/expressions.html#operator-precedence
下表对 Python 中运算符的优先顺序进行了总结,从最高优先级(最先绑定)到最低优先级(最后绑定)。相同单元格内的运算符具有相同优先级。除非语法显式地指明,否则运算符均为双目运算符。相同单元格内的运算符从左至右组合的(只有幂运算符是从右至左组合的)。
请注意比较、成员检测和标识号检测均为相同优先级,并具有如 比较运算 一节所描述的从左至右串连特性。
| 运算符 | 描述 |
|---|---|
(expressions...),[expressions...], {key: value...}, {expressions...} | 绑定或加圆括号的表达式,列表显示,字典显示,集合显示 |
x[index], x[index:index], x(arguments...), x.attribute | 抽取,切片,调用,属性引用 |
await x | await 表达式 |
** | 乘方 |
+x, -x, ~x | 正,负,按位非 NOT |
*, @, /, //, % | 乘,矩阵乘,除,整除,取余 |
+, - | 加和减 |
<<, >> | 移位 |
& | 按位与 AND |
^ | 按位异或 XOR |
| | 按位或 OR |
in, not in, is, is not, <, <=, >, >=, !=, == | 比较运算,包括成员检测和标识号检测 |
not x | 布尔逻辑非 NOT |
and | 布尔逻辑与 AND |
or | 布尔逻辑或 OR |
if -- else | 条件表达式 |
lambda | lambda 表达式 |
:= | 赋值表达式 |
- / 永远返回 float,需要整数用 //;** 是幂运算,% 是取余。
- Python 的 and/or 是短路并返回操作数本身(非布尔),写 a or default 是常见的默认值技巧。
- == 比值,is 比对象身份;判 None 用 is,比较字面量不要用 is。
- 优先级口诀:算术 > 比较 > not > and > or;不确定时用括号比死记表更可靠。
版权所有
版权归属:Shuo Liu
