Python数据运算中的运算符详解
Python数据运算中的运算符详解
在我们实际问题中,离不开数据的运算,Python为我们提供了丰富的运算符号使用,包括一般的四则运算符、比较运算符、位运算符、逻辑运算符和赋值运算符。
下面将分类对各种运算符及使用进行学习,或有漏缺,敬请谅解。
据说,在python有变量赋值运算时,之所以有把运算符号放在’='号的左边的写法,是因为可以提高执行力和优先级,例如:
i += 1 # i = i + 1
m **= 3 # m = m ** 3
也不知道真的是这样吗……咱是小白。
算术运算符
包含四则运算符和其他运算
序号 | 运算符号 | 描述 | 示例:a、b为任意两个数字 |
---|---|---|---|
1 | + | 加法运算 | a + b |
2 | - | 减法运算 | a - b |
3 | * | 乘法运算 | a * b |
4 | / | 除法运算 | a / b |
5 | % | 取模:即两数整除之后的余数 | a % b |
6 | ** | 幂运算,类似于a[^b]的运算,a为底数b为指数 | a ** b |
7 | // | 取整:两数相除后取运算结果的整数部分,也可以说是取小于商的最大整数(后边的说法对于负数取整尤其易于理解) | a // b |
输入代码,观看运行情况:
# 分别指定两个变量名为a和b,并赋予不同的数值
a = 5
b = 3
# 输出上算术运算符号使用后的结果
print('a + b=',a + b)
print('a - b=',a - b)
print('a * b=',a * b)
print('a / b=',a / b)
print('a % b=',a % b)
print('a ** b=',a ** b)
print('a // b=',a // b)
# 当浮点数参与运算会发生什么情况?
print('让其中的一个数变成小数后')
a = float(a)
# 输出带有小数的运算情况
print('a + b=',a + b)
print('a - b=',a - b)
print('a * b=',a * b)
print('a / b=',a / b)
print('a % b=',a % b)
print('a ** b=',a ** b)
print('a // b=',a // b)
运行结果:
a + b= 8
a - b= 2
a * b= 15
a / b= 1.6666666666666667
a % b= 2
a ** b= 125
a // b= 1
让其中的一个数变成小数后
a + b= 8.0
a - b= 2.0
a * b= 15.0
a / b= 1.6666666666666667
a % b= 2.0
a ** b= 125.0
a // b= 1.0
这是我们会发现,
- 一旦运算中有浮点型数据参与,那么返回的结果也会是浮点型数
- 小数运算中,一般运算结果的位数是有限的,程序会自己作一些处理,这会导致在某些特别要求精度的计算中,计算结果可能出现误差
# 让7去除以3看看
print('7/3=',7 / 3)
7/3= 2.3333333333333335 #最后一个数字是5与我们想象的四舍五入不大一样
比较运算符
通过不等号’大于’、‘小于’、‘大于或等于’……等,对符号两边的数值或者表达式结果进行比较,也可以是变量,最终返回真假值,可看作是一个命题的逻辑判断或布尔运算
序号 | 运算符号 | 描述 | 示例,有两个任意数a和b |
---|---|---|---|
1 | == | 等于,于普通概念的等号一样 | a == b |
2 | != | 不等于 | a != b |
3 | > | 大于 | a > b |
4 | < | 小于 | a < b |
5 | >= | 大于或等于 | a >= b |
6 | <= | 小于或等于 | a <= b |
输入代码运行
# 分别指定两个变量名为a和b,并赋予不同的数值
a = 7
b = 3
# 输出比较运算符号使用后的结果
print('a == b:',a == b)
print('a != b:',a != b)
print('a > b:',a > b)
print('a < b:',a < b)
print('a >= b:',a >= b)
print('a <= b:',a <= b)
# 当浮点数参与运算会发生什么情况?
print('让其中的一个数变成小数后')
c = 7.0
# 输出带有小数的运算情况
print(a == c)
运行情况:
a == b: False
a != b: True
a > b: True
a < b: False
a >= b: True
a <= b: False
让其中的一个数变成小数后
True
- 可见在做逻辑命题判断,为真时返回True,为假时返回False;
- 数字为浮点型数据时不影响其数值大小,7 == 7.0 为True
赋值运算符
Python中,变量无须定义,可以直接使用,即在使用时,可以直接把基本赋值运算符“=”右边的值赋给左边的变量,也可以进行某些运算后再赋值给左边的变量。
Python中的赋值运算符有两种形式:
-
基本的赋值运算符,即单个“=”,其把右边的值或运算结果赋给左边的变量;
-
复合的赋值运算符,即由算术运算符和“=”组合成的赋值运算符,其兼有运算和赋值的功能,如+=,相当于左边的操作数加上右边的操作数后,再赋值给左边的操作数。
序号 | 运算符 | 描述以x为变量 | 示例 |
---|---|---|---|
1 | = | 让x的值为2 | x = 2 |
2 | += | 让x值为x + 2 | x += 2 |
3 | -= | 让x值为x - 2 | x -= 2 |
4 | *= | 让x值为x * 2 | x *= 2 |
5 | /= | 让x值为x / 2 | x /= 2 |
6 | %= | 让x值为x % 2 | x %= 2 |
7 | **= | 让x值为x ** 2 | x **= 2 |
8 | //= | 让x值为x // 2 | x //= 2 |
输入代码运行
x = 2
print(x) # x的值为2
x += 2
print(x) # x的值为4
x -= 2
print(x) # x的值为2
x *= 2
print(x) # x的值为4
x /= 2
print(x) # x的值为2.0
x %= 2
print(x) # x的值为0.0
# 重新赋值x=2,之所以重新赋值x是因为之前的x值运算后为0,而0参与后边运算都为0不容易看出运行结果
x = 2
x **= 2
print(x) # x的值为4
x //= 2
print(x) # x的值为2
运行结果:
2
4
2
4
2.0
0.0
4
2
- 负数在取整时,需要注意取到的不是小数点左边的负整数值,而是距离计算结果最近的左边那个负整数,比如 -13/3=-4.3333……,这时候对-4.33333……取整得到的数不是-4而是-5。(我们取的整数是比商小的最大整数)
-13//3 #执行
-5 #返回-5
- 赋值运算是把右边值赋予左边变量,所以顺序是从右到左的。
逻辑运算符
逻辑运算符是进行逻辑判断时使用的符号,一般我们说由逻辑运算符构成的语句是一句联合语句,如果设定两个单命题分别为p和q的话,那么有三种语式:
- p and q
- p or q
- not p 或 not q
p、q可以是数值和字符串,也可以是表达式和函数
序号 | 运算符号 | 描述 |
---|---|---|
1 | and | p and q,如果p和q都为真时,返回True,其他情况返回False。 |
2 | or | p and q,如果p和q都为假时,返回False,其他情况返回True。 |
3 | not | not p 或 not q,返回p或q的反向值,即原命题为真,返回False,原命题为假,返回True。 |
示例运行及返回值列表
序号 | 指令 | 前后判断值 | 逻辑判断结果 | 返回值 | |
---|---|---|---|---|---|
1 | print(2 < 3 and 3 < 5) | 真真 | True | True | 表达式 and 表达式 |
7 | print(2 < 3 and 5) | 真真 | True | 5 | 表达式 and 非零 |
8 | print(5 and 2 < 3 ) | 真真 | True | True | 非零 and 表达式 |
11 | print(3 and 5) | 真真 | True | 5 | 非零 and 非零 |
12 | print(5 and 3) | 真真 | True | 3 | 非零 and 非零 |
15 | print('abc' and '我的天') | 真真 | True | 我的天 | 字符 and 字符 |
16 | print('我的天' and 'abc') | 真真 | True | abc | 字符 and 字符 |
6 | print(3 > 5 and 0) | 假假 | False | False | 表达式 and 0 |
5 | print(0 and 3 > 5) | 假假 | False | 0 | 0 and 表达式 |
3 | print(5 and 3 > 5) | 真假 | False | False | 非零 and 表达式 |
2 | print(2 < 3 and 3 > 5) | 真假 | False | False | 表达式 and 表达式 |
9 | print(2 < 3 and 0) | 真假 | False | 0 | 表达式 and 0 |
13 | print(5 and 0) | 真假 | False | 0 | 非零 and 0 |
18 | print('abc' and '') | 真假 | False | 空 | 字符 and 空 |
4 | print(3 > 5 and 5) | 假真 | False | False | 表达式 and 非零 |
17 | print('' and 'abc') | 假真 | False | 空 | 空 and 字符 |
14 | print(0 and 5) | 假真 | False | 0 | 0 and 非零 |
10 | print(0 and 2 < 3 ) | 假真 | False | 0 | 0 and 表达式 |
通过上述对比,大概可以知道,在and联句中,有四种组成判断,同样的or也是,具体的取值情况如下:
and的取值
- 真真:返回and右侧值
- 假假:返回and左侧值
- 真假:返回其中的假值
- 假真:返回其中的假值
看似复杂,其实是python在逻辑用语判断时,采用了一个称为“短路问题”的原理,大概如下图:
or的取值
- 假假:返回or右侧值
- 真真:返回or左侧值
- 真假:返回其中的真值
- 假真:返回其中的真值
or也存在短路问题:
not的取值
not中,只有一种情况,即返回与原值相反的布尔值
特别强调在and、or和not的使用中一定要注意
- True:代表真,代表所有非空字符串,代表所有非零数
- False:代表假,代表空字符串,代表数值0
- True和False的本质是数字0和1,所以可以把两者当作数值进行计算
位运算符
主要是一些二级制的计算符号,在一些基础网络配置和计算中经常会用到,也比较简单
序号 | 运算符 | 描述 |
---|---|---|
1 | & 与运算 | 二进制计算中,参加运算的两个二进制数,对位比较,只有1对1得1,其他为0 |
2 | | 或运算 | 二进制计算中,参加运算的两个二进制数,对位比较,只有0对0得0,其他为1 |
3 | ^ 异或运算 | 二进制计算中,参加运算的两个二进制数,对应的两个二进制位不同时,结果为1,否则为0 |
41 | ~ 取反运算 | 该运算是单操作数运算符,即其只需要一个操作数参与运算。运算时,二进制数上的每位取反,即1变为0, 0变为1 |
5 | << 左移运算 | 其形式为:m<<n。按位左移运算,m对应的二进制数的每位向左移动n位,后面补0,简单说也就是说,一个整数左移n位相当于这个数 m × 22 |
6 | >> 右移运算 | 其形式为:m >> n。即m对应的二进制数每位向右移动n位,移出的二进制数字去掉,最左边空出的变为0。即每向右移动1位,相当于原数除以2,只保留整数部分;移动n位,相当于原数除以23,只保留整数部分。 |
代码示例:(略)
运算符的优先级
这是一个比较烦人的问题,一般遵循的规律我还没学到,只是大概了解,基本上用到时按习惯先看看结果是否符合,不符合在通过()进行调整
以下列出的运算符优先级:从高到低
序号 | 运算符 | 描述 |
---|---|---|
1 | ** | 幂运算(优先级最高) |
2 | ~ | 按位取反 |
3 | * , / , %, // | 乘、除、取余、取整 |
4 | + , - | 加、减 |
5 | >> , << | 右移、左移 |
6 | & | 按位与 |
7 | ^ ,| | 按位异或、按位或 |
8 | < , > , <= , >= | 小于、大于、小于或等于、大于或等于 |
9 | == , != | 等于、不等于 |
10 | = , += , -= , *= , /= , **= , %= , //= | 赋值运算符 |
11 | is , is not | 是、不是 |
12 | in , not in | 在、不在 |
13 | not , and , or | 逻辑运算符 |
标准运算符替代函数
关于此内容,可以参考:
operator — 标准运算符替代函数 — Python 3.11.4 文档
取反码运算,涉及到数字在计算机中的存储形式,在计算机中,最高位为符号位,符号位为0时表示正数,符号位为1时表示负数。
数字在计算机中是以补码的形式进行存储的,整数的补码与原码相同,负数的补码是在原码的基础上除符号位外,按位取反后,再加1.
比如:当我们计算~10的值时
先把10转为二进制编码:01010
然后取反运算:10101
这时由于最高位数为1,这代表该数是个负数,因为负数在计算机中以补码形式存储,
要得到原码(先减1,再按位反)为:11011
最后得到结果:-11
<<:按位左移运算符
其形式为:m<<n
按位左移运算,m对应的二进制数的每位向左移动n位,后面补0.
如10的二进制数 1010 向左移动两位后为:10 1000,其对应的十进制数为:40.
5的二进制数:0101,向左移动两位后为:1 0100,其对应的十进制数为:20
>>:按位右移运算符
其形式为:m >> n
即m对应的二进制数每位向右移动n位,移出的二进制数字去掉,最左边空出的变为0.
后取反运算:10101
这时由于最高位数为1,这代表该数是个负数,因为负数在计算机中以补码形式存储,
要得到原码(先减1,再按位反)为:11011
最后得到结果:-11
<<:按位左移运算符
其形式为:m<<n
按位左移运算,m对应的二进制数的每位向左移动n位,后面补0.
如10的二进制数 1010 向左移动两位后为:10 1000,其对应的十进制数为:40.
5的二进制数:0101,向左移动两位后为:1 0100,其对应的十进制数为:20
>>:按位右移运算符
其形式为:m >> n
即m对应的二进制数每位向右移动n位,移出的二进制数字去掉,最左边空出的变为0.
10的二进制 1010 向右移动1位为:0101,即变为十进制的5;再移动1位变为0010,变为2,再移动1位变为0001,变为1,再移动就一直为0了。