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]