1.3.3 运算符与表达式
Python是纯面向对象的编程语言,在Python中一切都是对象。而熟悉面向对象编程的读者应该知道,对象由数据和行为两部分组成,而行为主要通过方法来实现,通过一些特殊方法的重写,可以实现运算符重载。从这个角度来讲,运算符也是表现对象行为的一种形式,不同类的对象支持的运算符会有区别,而同一种运算符作用不同的对象时也可能表现出不同的行为和结果。
除了算数运算符、关系运算符、逻辑运算符、以及位运算符等常见运算符之外,Python还支持一些特有的运算符,例如成员测试运算符、集合运算符等。使用时需要注意,Python很多运算符具有多种不同的含义,作用于不同操作数的含义并不相同,非常灵活。
运算符优先级遵循的规则为:
算术运算符 > 位运算符/集合运算符 > 关系运算符 > 逻辑运算符;
算术运算符之间遵循“先加减,后乘除”的基本原则;
虽然Python运算符有一套严格的优先级规则,但是强烈建议在编写复杂的表达式时尽量使用圆括号来明确说明其中的逻辑来提高代码可读性。记住,圆括号是明确和改变表达式运算顺序的利器。
常用Python运算符如下表所示:
运算符示例 | 功能说明 |
x + y | 算术加法,列表、元组、字符串合并 |
x - y | 算术减法,集合差集 |
x * y | 乘法,序列重复 |
x / y | 算术除法 |
x // y | 求整商,除法结果只保留整数部分 |
- x | 相反数 |
x % y | 求余数,字符串格式化 |
x ** y | 幂运算 |
x < y;x <= y;x > y;x >= y | 大小比较,集合的包含关系比较 |
x == y;x!=y | |
x or y | 逻辑或(只有x为假才会计算y) |
x and y | 逻辑与(只有x为真才会计算y) |
not x | 逻辑非 |
x in y ; x not in y | 成员测试运算符 |
x is y ; x is not y | 对象实体同一性测试(地址) |
!、^、&、<<、>>、~ | 位运算符 |
&、|、^ | 集合交集、并集、对称差集 |
@ | 矩阵相乘运算符 |
练习篇:
(1)+运算符除了用于算术加法,还可以用于列表、元组和字符串的合并或连接,生成新对象,例如:
1 >>> 3 + 3 #整数和整数相加,结果为整数
2 6
3 >>> 3 + (3 + 4j) #整数和复数相加,结果为复数
4 (6+4j)
5 >>>
6 >>> 3 +3.0 #整数和浮点数相加,结果为浮点数
7 6.0
8 >>>
9 >>> [1,2,3] + [4,5,6] #连接两个列表
10 [1, 2, 3, 4, 5, 6]
11 >>>
12 >>> (1,2,3) + (4,) #连接两个元组
13 (1, 2, 3, 4)
14 >>>
15 >>> 'abcdef' + '1234' #连接两个字符串
16 'abcdef1234'
17 >>>
(2):集合运算符用法
1 >>> {1,2,3,4,5,6} - {3} #差集
2 {1, 2, 4, 5, 6}
3 >>>
4 >>> {1,2,3,4,5} | {6} #并集
5 {1, 2, 3, 4, 5, 6}
6 >>>
7 >>> {1,2,3,4,5} & {3} #交集
8 {3}
9 >>>
10 >>> {1,2,3,4,5,6} ^ {5,6,7,8} #对称差集
11 {1, 2, 3, 4, 7, 8}
12 >>>
13 >>> #所谓对称差集,就是不同时在两个集合的所有元素的集合
(3)* 运算符除了表示算术乘法,还可用于序列与整数的乘法,表示序列元素的重复,生成新的序列对象
1 >>> [1,2,3] * 3
2 [1, 2, 3, 1, 2, 3, 1, 2, 3]
3 >>>
4 >>> (1,2,3) * 3
5 (1, 2, 3, 1, 2, 3, 1, 2, 3)
6 >>>
7 >>> 'abc' * 3
8 'abcabcabc'
9 >>>
(4)由于Python列表中存储的是地址而不是元素值,当包含子列表的列表进行元素重复的时候,情况会复杂一些
1 >>> x = [[1]] *3
2 >>>
3 >>> id(x[0]) == id(x[1]) == id(x[2])
4 True
5 >>>
6 >>> x[0].append(2)
7 >>> x
8 [[1, 2], [1, 2], [1, 2]]
9 >>>
10 >>> id(x[0]) == id(x[1]) == id(x[2])
11 True
12 >>>
(5)运算符/和//在Python中分别表示算术除法和求整商,例如:
1 >>> 3 / 2
2 1.5
3 >>>
4 >>> 15 // 4
5 3
6 >>>
小提示:
1 >>> # % 运算符可以用于整数或实数的求余数,还可以用于字符串格式化,例如:
2 >>>
3 >>> 123.45 % 3.2
4 1.849999999999996
5 >>>
6 >>> 789 % 23
7 7
8 >>>
9 >>> '%c,%d'%(65,65)
10 'A,65'
11 >>>
(6)Python关系运算符最大的特定是可以连用,并且其含义与我们日常的理解完全不一致。当然使用关系运算符的一个最重要的前提是,操作数之间必须可比较大小。
1 >>> 1 < 3 < 5 #等价于 1 < 3 and 3 < 5
2 True
3 >>> 3 < 5 > 2
4 True
5 >>> 1 > 6 < 8
6 False
7 >>>
8 >>> 'Hello' > 'hello' #字符串比较大小
9 False
10 >>> 'Hello' < 'hello'
11 True
12 >>> #因为 H 的ASCII编码小于 h 的
13 >>>
14 >>> [1,2,3] < [1,2,4] #列表比较大小
15 True
16 >>>
17 >>> 'Hello' > 3 #字符串和数字不能比较大小
18 Traceback (most recent call last):
19 File "<pyshell#97>", line 1, in <module>
20 'Hello' > 3
21 TypeError: unorderable types: str() > int()
22 >>>
(7)成员测试运算符 in 用于成员测试,测试一个对象是否是另一个对象的成员
1 >>> 3 in [1,2,3] #测试 3 是否为列表 [1,2,3] 的成员
2 True
3 >>> 5 in range(1,10,1) #range()是用来生成指定范围数字的内置函数
4 True
5 >>> 'abc' in 'abcdefghi'
6 True
7 >>> for i in (3,5,7): #循环,成员遍历
8 print(i,end='\t')
9
10
11 3 5 7
12 >>>
(8)在Python中,单个任何类型的对象或常数属于合法表达式,使用上表中运算符连接的变量、和常量以及函数调用的任意组合也属于合法的表达式
拓展知识:
复合赋值运算符。Python支持类似于 +=、-=、/=、*=、&=、|=等复合赋值运算符,表示在自身的基础上进行运算。例如:表达式 x += 3 等价于 x = x + 3,其他复合运算符功能类似。
1 >>> a = 3
2 >>>
3 >>> a += 1
4 >>> a
5 4
6 >>> a *= 2
7 >>> a
8 8
9 >>> a -= 2
10 >>> a
11 6
12 >>> a /= 3
13 >>> a
14 2.0
15 >>>