calculation
Table of Contents

运算符

运算符优先级

算数 >  > 身份 > 成员 > 逻辑

算数运算

+

-

*

/

% 模

** 指数

// 整除

In [2]: 1//2                                                                                            
Out[2]: 0

In [3]: 2//1                                                                                            
Out[3]: 2

位运算

\&

|

\~

^

\<< 左移

>> 右移

除以2的整数倍

In [1]: 32 // 4
Out[1]: 8

In [2]: 32 >> 2
Out[2]: 8

~ 按位取反

比较运算符

==

比较变量的取值是否相等,不是内存地址

!=

>

\<

>=

\<=

链式比较

In [8]: 4 > 3 > 2
Out[8]: True

In [9]: 4 > 5 > 2
Out[9]: False

逻辑运算符

优先级

not > and > or 

and

or

not

赋值运算符

=

In [10]: a = min(3, 4)

In [11]: a
Out[11]: 3

成员运算符

in

not in

身份运算符

is

is 比较的是两个变量的身份是否相等,即是否为同一个对象,内存地址是否相等

如果是数字比较,使用==

与None比较时,使用is

对于整型数字来说, a is b 为true的结论,只适用于-5到256范围内的数字

In [1]: a1 = 256                                                                                      

In [2]: a2 = 256                                                                                      

In [3]: b1 = 257                                                                                      

In [4]: b2 = 257                                                                                      

In [5]: id(a1)                                                                                        
Out[5]: 4327773952

In [6]: id(a2)                                                                                        
Out[6]: 4327773952

In [7]: id(b1)                                                                                        
Out[7]: 4359476880

In [8]: id(b2)                                                                                        
Out[8]: 4360330800

In [9]: a1 is a2                                                                                      
Out[9]: True

In [10]: b1 is b2                                                                                     
Out[10]: False

出于对性能优化的考虑,Python内部会对-5到256的整型维持一个数组,起到一个缓存的作用。这
样,每次你试图创建一个-5到256范围内的整型数字时,Python都会从这个数组中返回相对应的引用,而不
是重新开辟一块新的内存空间。

上述例子中的257,Python则会为两个257开辟两块内存区域

is not

== 比较 is

比较操作符'is'的速度效率,通常要优于'=='。因为'is'操作符不能被重载,这样,Python就不需要去寻找,程序中是否有其他地方重载了比较操作符,并去调用。执行比较操作符'is',就仅仅是比较两个变量的ID而已。

但是'=='操作符却不同,执行a == b相当于是去执行a.__eq__(b),而Python大部分的数据类型都会去重载__eq__这个函数,其内部的处理通常会复杂一些。比如,对于列表,__eq__函数会去遍历列表中的元素,比较它们的顺序和值是否相等。

元组

元组是不可变的,但元组可以嵌套,它里面的元素可以是列表类型,列表是可变的,所以如果我们修改了元组中的某个可变元素,那么元组本身也就改变了,之前用'is'或者'=='操作符取得的结果,可能就不适用了。

进制

二进制

前缀加0b

In [5]: 0b10                                                                                          
Out[5]: 2

In [6]: 0b11                                                                                          
Out[6]: 3

八进制

前缀加0o

In [7]: 0o10                                                                                          
Out[7]: 8

In [8]: 0o11                                                                                          
Out[8]: 9

十六进制

前缀加0x

In [14]: 0x10                                                                                         
Out[14]: 16

In [15]: 0x1F                                                                                         
Out[15]: 31