1. 算术运算符
- 整除(//): 向下取接近商的整数
a = 5
b = -5
c = 2
print(a//c, b//c)
2 -3
- 除法(/):
Python3: Python3中的除法(/)返回浮点型
a = 5
b = 3
print(a/b)
1.6666666666666667
Python2: Python2中的除法返回类型与除数和被除数类型一致
a = 5
b = 5.0
c = 3
print a/c, b/c
1 1.66666666667
- 取模(%):返回除法的余数, 结果的符号与被除数一致
原理:x%y
等于 x-n*y
对于某个整数 n ,使得结果具有与 x 相同的符号且小于 abs(y)
print(8 % 7)
print(-8 % 7)
print(8 % -7)
print(-8 % -7)
1
6
-6
-1
2. 比较运算符
- == 与 is 的区别
a = 5
b = 5
print(a == b, a is b)
a = [1, 2]
b = [1, 2]
print(a == b, a is b)
True True
True False
== 判断的是两个对象的内容是否相同
is 判断的是两个对象的内存地址是否相同,即两个变量指向的是同一个对象
使用函数id(object)查看对象的地址
a = 5
b = 5
print(a == b, a is b)
print(id(a), id(b))
a = [1, 2]
b = [1, 2]
print(a == b, a is b)
print(id(a), id(b))
True True
140716394127888 140716394127888
True False
3039645684104 3039645684616
- 不等于(<>)在Python3中已弃用,只用 (!=)
3. 位运算符
a = 8, b = -8, c = 5, d = -5
转换为二进制
a = 00001000
b = 11111000 (负数的二进制为其绝对值的补码,补码=~原码 + 1)
c = 00000101
d = 11111011
- 与(&):参与运算的两个值,如果两个相应位都为1,则该位的结果为1,否则为0
a = 8
b = -8
c = 5
d = -5
print(a&b, a&c, a&d, b&c, b&d, c&d)
8 0 8 0 -8 1
使用场景
1). 判断一个数的奇偶性
原理:任意一个奇数同1相与都等于1,任意一个偶数同1相与都等于0
def isOddNum(x):
return True if (x & 1) else False
2). 计算一个数的二进制中有多少个1
原理:x&(x-1)结果是将x最低位的1置为0
x = 00001100
x - 1 = 00001011
x&(x-1) = 00001000
def count1nums(x):
count = 0
while x:
x = x & (x-1)
count = count + 1
return count
- 异或(^):两数对应的二进位相异时,结果为1
a = 8
b = -8
c = 5
d = -5
print(a^b, a^c, a^d, b^c, b^d, c^d)
-16 13 -13 -3 3 -2
使用场景
1). 查找列表中独一无二的数
一个列表中有且仅有一个数是唯一的,其余数都出现2次,求该唯一数
原理:任意数与自身异或运算,结果为0;任意数与0异或,结果为自身;位运算满足交换结合律
例如:[1,2,3,2,1] 1^2^3^2^1 = (1^1)^(2^2)^3 = 0^0^3 = 3
from functools import reduce
def singleNumber(nums) -> int:
return reduce(lambda x, y: x ^ y, nums)
4. 运算符优先级
运算符 | 描述 |
** | 指数 (最高优先级) |
~ 、+、 - | 按位翻转, 一元加号和减号 (最后两个的方法名为 +@ 和 -@) |
*、 / 、% 、// | 乘,除,求余数和取整除 |
+ 、- | 加法减法 |
>> 、<< | 右移,左移运算符 |
& | 位 'AND' |
^、 | | 位运算符 |
<= 、< 、> 、>= | 比较运算符 |
== 、!= | 等于运算符 |
= 、%=、 /= 、//=、 -= 、+= 、*= 、**= | 赋值运算符 |
is 、is not | 身份运算符 |
in 、not in | 成员运算符 |
not 、and 、or | 逻辑运算符 |
- 位移运算符比算术运算符优先级低,在边界判断时需要注意。
[-2**31, 2**31 - 1] = [-2<<30, (2<<30) - 1]