菜鸟教程《Python 3 教程》笔记(3)
笔记带有个人侧重点,不追求面面俱到。
3 Python 3 运算符
Python 语言支持以下类型的运算符:
- 算术运算符
- 比较(关系)运算符
- 赋值运算符
- 逻辑运算符
- 位运算符
- 成员运算符
- 身份运算符
3.1 赋值运算符
Python 3.8 新增了,海象运算符 :=
,可在表达式内部为变量赋值,目的是避免重复调用,提高运行时间。
示例:
if (n := len(a)) > 10:
print(f"List is too long ({n} elements, expected <= 10)")
上述代码,避免2次调用 len()
,也省去使用中间变量。
3.2 位运算符
#!/usr/bin/python3
a = 60 # 60 = 0011 1100
b = 13 # 13 = 0000 1101
c = 0
# 按位与运算符
c = a & b # 12 = 0000 1100
print ("1 - c 的值为:", c)
# 按位或运算符
c = a | b # 61 = 0011 1101
print ("2 - c 的值为:", c)
# 按位异或运算符
c = a ^ b # 49 = 0011 0001
print ("3 - c 的值为:", c)
# 按位取反运算符
c = ~a # -61 = 1100 0011
print ("4 - c 的值为:", c)
# 左移动运算符
c = a << 2 # 240 = 1111 0000
print ("5 - c 的值为:", c)
# 右移动运算符
c = a >> 2 # 15 = 0000 1111
print ("6 - c 的值为:", c)
3.3 逻辑运算符
运算符 | 逻辑表达式 | 描述 |
---|---|---|
and | x and y | 布尔"与" - 如果 x 为 False,x and y 返回 x 的值,否则返回 y 的计算值。 |
or | x or y | 布尔"或" - 如果 x 是 True,它返回 x 的值,否则它返回 y 的计算值。 |
not | not x | 布尔"非" - 如果 x 为 True,返回 False 。如果 x 为 False,它返回 True。 |
实例:
print(10 and 20) # 20
print(0 and 20) # 0
print(10 or 20) # 10
print(0 or 20) # 20
print(0 or True) # True
print(not 0) # True
print(not True) # False
3.4 身份运算符
is
与 ==
的区别:is
用于判断两个变量引用对象是否为同一个, ==
用于判断引用变量的值(子对象)是否相等。
补充:
is
判断两个对象是否为同一对象,是通过 id 来判断的;当两个基本类型数据(或元组)内容相同时,id 会相同,但并不代表 a 会随 b 的改变而改变。
==
判断两个对象的内容是否相同,是通过调用__eq__()
来判断的。
实例:
>>>a = [1, 2, 3]
>>> b = a
>>> b is a
True
>>> b == a
True
>>> b = a[:]
>>> b is a
False
>>> b == a
True
上述代码,b = a
中 b
是 a
的引用,指向同一个内存地址;b = a[:]
中 b
是 a
的浅拷贝,共用相同的子对象。可以参考:Python中直接赋值、浅拷贝和深拷贝的区别
补充内容:
a = 100
b = 100
print(a is b) # True
print(a == b) # True
上述代码中,a
和 b
指向了同一个内存地址。这是 Python 的特性,变量以内容为基准。这个特性决定了在 Python 中,数字类型的值是不可变的。当 a
的值改变时,是 a
指向了新的内存地址,而不是内存地址中的值改变了。
3.5 运算符优先级
以下表格列出了从最高到最低优先级的所有运算符, 相同单元格内的运算符具有相同优先级。 运算符均指二元运算,除非特别指出。 相同单元格内的运算符从左至右分组(除了幂运算是从右至左分组):
运算符 | 描述 |
---|---|
(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 表达式 |
:= | 赋值表达式 |
注意:
and
的优先级比or
高。