python 的运算符分为 算术运算符、比较运算符、赋值运算符、逻辑运算符、位运算符、成员运算符、身份运算符、三目运算符。
算术运算符
算术运算符符合四则混合运算的计算规则
运算符 | 描述 | 示例 | 备注 |
---|---|---|---|
+ | 加 | a + b | |
- | 减 | a - b | |
* | 乘 | a * b | |
/ | 除 | 20 / 4 | 返回值是浮点数 5.0 |
% | 取模,返回除法商的余数 | 10 % 3 | 返回值 1 |
** | 幂次 | 3 ** 4 | 返回值 81 |
// | 返回商的整数部分 | 10 // 3 | 返回值 3 |
由于计算机会将小数部分转换成二进制进行计算,且因为二进制的有穷性,所以小数运算会有误差,例如
>>> 1.1 -1
0.10000000000000009
>>> 5.4-3
2.4000000000000004
>>> round(1.15,1) # 四舍五入保留1位小数
1.1
>>> round(0.5) # 四舍五入到整数位
0
需要精确计算可以使用 decimal
这个模块。
>>> from decimal import Decimal # 从 decimal 模块中引入 Decimal 类
>>> 0.1-0.09
0.010000000000000009
>>> Decimal('0.1')-Decimal('0.09')
Decimal('0.01')
具体的可以看 老Amy的 这篇文章
另需注意的是
- 整除是向下取整的。
>>> 10//3
3
>>> -10//3
-4 # 不取整是 -3.3333 向下则是 -4
- 取模,也就是取余数,是使用整除来进行运算的,所以在负值的取模上也需要注意。
>>> 10 % 3
1 # 10//3=3 3*3=9 10-9=1
>>> -10 % 3
2 # -10//3=-4 -4*3=-12 10--12=2
比较运算符
比较运算符通常用于比较两个值
运算符 | 描述 | 示例 |
---|---|---|
== | 比较两个值是否相等 | a == b |
!= | 比较两个值是否不等 | a != b |
> | 大于 | a > b |
< | 小于 | a < b |
>= | 大于等于 | a >= b |
<= | 小于等于 | a <= b |
需要注意的有:
- 因为是值比较,所以可以跨类型比较,例如使用 1 == True 或 2.0 == 2 ,返回值是 True。
- 因为 python 大小写敏感,所以 1 == true 返回值就是 False 了。
- 字符串不能直接与数值比较,但是可以使用 == 和 != 进行比较。
- 字符串和字符串比较时,使用 ASCII 码的值依次比较。
- python2 中可以使用 <> 作为不等于,而 python3 废除了。
- 可以进行连续比较,例如 3 > 2 > 1 相当于 3 > 2 and 2 > 1
- 使用 () 则优先计算 () 中的内容。例如 (3 > 2) > 1 ,其实是 True > 1
赋值运算符
python 有以下赋值运算符
运算符 | 描述 | 说明 |
---|---|---|
= | 赋值 | 将 = 右侧的值赋值给左侧 |
+= | 加法赋值 | c += a 等效 c = c + a |
-= | 减法赋值 | c -= a 等效 c = c - a |
*= | 乘法赋值 | c *= a 等效 c = c * a |
/= | 除法赋值 | c /= a 等效 c = c / a |
%= | 取余数赋值 | c %= a 等效 c = c % a |
**= | 幂次赋值 | c **= a 等效 c = c ** a |
//= | 取整除赋值 | c //= a 等效 c = c // a |
需要注意的是,python 不支持 a++ 或 a-- 这种自增、自减的赋值运算。
另外 3.8 版本引入了赋值表达式运算符 :=
,也成为 walrus operator(海象运算符),它允许在条件、循环和其他表达式中同时进行赋值和测试。例如:
while (value := input('输入')): # 同时进行了赋值和判断
print(value)
逻辑运算符
python 支持最基本的逻辑运算符
运算符 | 表达式 | 描述 |
---|---|---|
and | a and b | 逻辑与 |
or | a or b | 逻辑或 |
not | not a | 逻辑非 |
逻辑运算符比较简单,和其他语言的使用逻辑是一样的。唯一要注意的是,python 的逻辑运算是基于短路(懒惰)机制,这种机制就像是 and 和 andalso 、or 和 orelse 的差别一样。
如果第一个值的判断结果产生,进而就能影响整个逻辑运算时,就不判断第二个值了。举例:a and b ,a 和 b 均为 True则返回 True ,如果其中有一个是 False 则返回 False 。
这样光判断 a 的值就能够知道整个逻辑运算的结果了:如果 a 是 False ,则无论 b 的值如何,返回结果都是 a (即 False) ;如果 a 是 True ,则返回结果就是 b (即 b 为 True 就返回 True ,b 为 False 就返回 False)。
or 的运算也类似于 and :如果第一个值为 True ,则返回第一个值 ;如果第一个值为 False ,则返回第二个值。
基于这种机制,在 python 可以进行这种逻辑运算:
>>> 10 and '20'
'20'
>>> '10' or 20
'10'
>>> '' and True
''
因为非 0 非空的值均为 True 这一原则,所以逻辑运算可以在不同的类型之间进行,返回的结果也是第一个值或第二个值,而不仅仅是 True 和 False 。需要注意的是,也是因为这个原则,如果期望返回 0 或 False,则不被达成。
再次强调,python 大小写敏感, True 是 bool 型的关键字,而 true 则是自定义的变量名。
位运算符
位运算符的含义就是将值按照二进制方式进行比较,返回比较结果
运算符 | 描述 |
---|---|
& | 按位与:两者都为1则1,否则0 |
| | 按位或:有一个为1则1,否则0 |
^ | 按位异或:两者相同则0,否则1 |
~ | 按位取反:单个值的0变1,1变0 |
举例:
60 的二进制为 0011 1100
13 的二进制为 0000 1101
>>> a, b=60, 13
>>> a & b
12
>>> a | b
61
>>> a ^ b
49
>>> ~a
195
计算原理:
& 按照二进制位进行比较,两个都为1则1,否则0
运算符 | 二进制值 | 十进制值 |
---|---|---|
0011 1100 | 60 | |
& | 0000 1101 | 13 |
= | 0000 1100 | 12 |
| 按照二进制位进行比较,有一个为1则1,否则0
运算符 | 二进制值 | 十进制值 |
---|---|---|
0011 1100 | 60 | |
| | 0000 1101 | 13 |
= | 0011 1101 | 61 |
^ 按照二进制位进行比较,两者相同则0,否则1
运算符 | 二进制值 | 十进制值 |
---|---|---|
0011 1100 | 60 | |
^ | 0000 1101 | 13 |
= | 0011 0001 | 49 |
运算符 | 二进制值 | 十进制值 |
---|---|---|
0011 1100 | 60 | |
~ | 11000011 | 195 |
成员运算符
成员运算符 in 和 not in 是 python 独有的运算符,用于判断对象是否是某个集合的元素之一,非常好用且运行速度非常快。返回结果为布尔值。
身份运算符
身份运算符 is 和 is not 也是 python 独有的运算符,用于判断两个对象的内存地址是否一致。返回结果为布尔值。
对于 is 与 == 是由区别的, is 判断两个变量引用的内存地址是否一致,而 == 判断两个变量的值是否相等。例:
>>> a, b = [1, 2, 3], [1, 2, 3]
>>> a == b
True
>>> a is b
False
可以使用 id()
函数查看变量或对象的内存地址。能够真切的发现 a 和 b 的内容地址是不同的。
另一个例子
>>> a, b = 10, 10
>>> a is b
True
这是因为 a 和 b 两个变量指向的对象(10)是一致的,所以内存地址是一致的。
三目运算符
三目运算符就是三元运算符,只是在 python 中使用的语法不同: True_statements if expression else False_statements
即 真声明 if 表达式 else 假声明
。例:
# 如果 a + b > 2 则返回 a + b ,否则返回 b - a
>>> a, b = 1, 2
>>> a + b if a + b > 2 else b - a
3
相当于
a, b = 1, 2
if a + b > 2:
print(a + b)
else:
print(b - a)
运算符的优先级
下表从高到低的列出了运算符的优先级。优先级高的运算符优先计算或处理,同级别的按照从左往右的顺序计算(赋值运算符除外,按照从右往左的顺序)。
运算符 | 描述 |
---|---|
() | 括号 |
** | 指数、幂次 |
~ | 按位取反 |
+ - | 正、负 |
* / % // | 乘 除 取模 取除整 |
+ - | 加 减 |
& | 按位与 |
^ | | 按位异或 按位或 |
<= < > >= | 小于等于 小于 大于等于 大于 |
== != | 等于 不等于 |
= %= /= //= -= += *= **= | 赋值运算符 |
is is not | 身份运算符 |
in not in | 成员运算符 |
and or not | 逻辑运算符 |