2.2 Python运算符与表达式
Python是一门面向对象的编程语言,在Python中一切都是对象。对象由数据和行为两部分组成,行为主要通过方法来实现,通过一些特殊方法的重写,可以实现运算符重载。运算符也是表现对象行为的一种形式,不同类的对象支持的运算符有所不同,同一种运算符作用于不同的对象时也可能会表现出不同的行为,这正是“多态”的体现。
在Python中,单个常量或变量可以看作最简单的表达式,使用任意运算符和函数调用连接的式子也属于表达式。除了算术运算符、关系运算符、逻辑运算符及位运算符等常见运算符之外,Python还支持一些特有的运算符,如成员测试运算符、集合运算符、同一性测试运算符等。使用时需注意,Python很多运算符具有多种不同的含义,作用于不同对象时的含义并不完全相同,非常灵活。常用的Python运算符如表2-3所示。
运算符优先级遵循的规则为:算术运算符的优先级最高,其次是位运算符、成员测试运算符、关系运算符、逻辑运算符等,算术运算符遵循“先乘除,后加减”的基本运算原则。虽然Python运算符有一套严格的优先级规则,但是强烈建议在编写复杂表达式时使用圆括号明确说明其中的逻辑来提高代码可读性。记住,圆括号是明确和改变表达式运算顺序的利器,在适当的位置使用圆括号可以使得表达式的含义更加明确。
2.2.1 算术运算符
算术运算符包括加法(+
)、减法(-
)、乘法(*
)、除法(/
)、整除(//
)、求余(%
)和幂运算(**
)。
-
加法运算符(
+
):除了用于算术加法以外,还可以用于列表、元组、字符串的连接,但不支持不同类型的对象之间相加或连接。# 连接两个列表 print([1, 2, 3] + [4, 5, 6]) # 输出: [1, 2, 3, 4, 5, 6] # 连接两个字符串 print('abcd' + '1234') # 输出: 'abcd1234' # True 会被看作 1 print(True + 3) # 输出: 4
-
乘法运算符(
*
):除了表示算术乘法,还可用于列表、元组、字符串这几个序列类型与整数的乘法,表示序列元素的重复,生成新的序列对象。# 列表重复 print([1, 2, 3] * 3) # 输出: [1, 2, 3, 1, 2, 3, 1, 2, 3] # 字符串重复 print('abc' * 3) # 输出: 'abcabcabc'
-
除法运算符(
/
)和整除运算符(//
):print(3 / 2) # 输出: 1.5 (真除法) print(15 // 4) # 输出: 3 (整除)
-
求余运算符(
%
):可以用于整数或实数的求余数运算,也可用于字符串格式化。print(7 % 3) # 输出: 1 print(123.45 % 3.2) # 输出: 1.849999999999996
-
幂运算符(
**
):表示幂乘,等价于内置函数pow()
。print(3 ** 2) # 输出: 9 print(pow(3, 2, 8)) # 输出: 1 (等价于(3**2) % 8)
2.2.2 关系运算符
关系运算符包括<
、<=
、>
、>=
、==
、!=
,它们可以连用,其含义与日常理解一致。
# 等价于1 < 3 and 3 < 5
print(1 < 3 < 5) # 输出: True
# 比较列表的大小
print([1, 2, 3] < [1, 2, 4]) # 输出: True
# 字符串和数字不能比较
print('Hello' > 3) # 会抛出 TypeError
2.2.3 成员测试运算符和同一性测试运算符
成员测试运算符in
用于成员测试,即测试一个对象是否为另一个对象的元素。同一性测试运算符is
用来测试两个对象是否同一个,如果是则返回True
,否则返回False
。
# 成员测试
print(3 in [1, 2, 3]) # 输出: True
print('a' in 'abcdefg') # 输出: True
# 同一性测试
x = [1, 2, 3]
y = x
print(x is y) # 输出: True
2.2.4 位运算符与集合运算符
位运算符只能用于整数,其内部执行过程为:首先将整数转换为二进制数,然后右对齐,按位进行运算,最后再把计算结果转换为十进制数字返回。集合的交集、并集、对称差集等运算借助于位运算符来实现,差集则使用减号运算符实现。
# 位运算
print(3 << 2) # 输出: 12
print(3 & 7) # 输出: 3
print(3 | 8) # 输出: 11
# 集合运算
print({1, 2, 3} | {3, 4, 5}) # 输出: {1, 2, 3, 4, 5}
print({1, 2, 3} & {3, 4, 5}) # 输出: {3}
2.2.5 逻辑运算符
逻辑运算符包括and
、or
、not
。and
和or
具有惰性求值或逻辑短路的特点,而not
一定会返回True
或False
。
# 惰性求值
a = 5
print(3 > 5 and a > 3) # 输出: False
print(3 < 5 or a > 3) # 输出: True
# 返回最后一个计算的表达式的值
print(3 and 5) # 输出: 5
print(3 or 5) # 输出: 3
print(not 3) # 输出: False
2.2.6 矩阵乘法运算符
从Python 3.5开始增加了一个新的矩阵相乘运算符@
,常与扩展库numpy
一起使用。@符号还可以用来表示修饰器的用法。
import numpy as np
x = np.ones(3)
m = np.eye(3) * 3
m[1, 2] = 5
m[2, 0] = 3
print(x @ m) # 矩阵相乘
2.2.7 补充说明
除了表2-3中列出的运算符之外,Python还有赋值运算符和复合赋值运算符,例如+=
、-=
、*=
等。Python不支持++
和--
运算符,并且从Python 3.8开始新增了赋值运算符:=
。
i = 3
print(++i) # 输出: 3 (正正得正,等价于+(+i))
# Python不支持++运算符,语法错误
# print(i++) # SyntaxError
print(--i) # 输出: 3 (负负得正,等价于-( -i))
# Python不支持--运算符,语法错误
# print(i--) # SyntaxError
综上所述,Python提供了丰富而灵活的运算符和表达式,用以实现各种复杂的计算和逻辑判断。在实际编程过程中,合理使用这些运算符可以提高代码的简洁性和可读性。