一、算术运算符
- 加:+
- 减:-
- 乘:*
- 除:/除尽 或 //取商
- 模:%
- 幂:**
表达式两边可以是整型,浮点型,变量,字符串等,代码如下:
print (1+2) #int相加,结果为3
print (4+3.1) #int+float,结果为7.1
print ('ab'+'c') #str+str,结果为abc
print (1-2) #-1
print (2*3) #6
print (10/3) #除尽,结果为3.333
print (10//3) #取商,结果为3
print (10%3) #10除3余1,结果为1
print (-10%3) #-10除3商-4,余2,结果为2
print (10%-3) #10除-3商-4,余-2,结果为-2
print (1.25%0.5) #商2,余0.25,结果为0.25
print (2**3) #2的3次方,结果为8
print ((-2)**3) #-2的三次方,结果为-8
print (-2**3) #2的三次方取反,结果为-8
print (16/2**3) #16除8,结果是2,由此可以看出幂的优先级最高
负数除法:
python对于负数做除法来说,采用的是向下取整的方式,如例子中,10除以-3,按照数学里的算法,结果是:商-3余1。但是python的运算结果是:商-4余-2,就是因为向下取整是商取最接近负无穷大的值,也就是-4。
print (10//-3) #-4
print (-10//3) #-4
print (-10//-3) #3
print (15//-6) #-3
二、赋值运算符
- =:等于
- +=:加等于
- -=:减等于
- *= :乘等于
- /=:除等于
- //=:整除等于
- %=:模等于
- **=:幂等于
上边这些运算符,我们以+=来讲解一下,例如:
a+=1 等价于 a=a+1
也就是a先加1,然后再赋值给a,代码如下:
a=3
a+=1
print ('%d' % a) #结果为4
a-=1
print (a) #3
a*=2
print (a) #6
a//=3
print (a) #2
a**=3
print (a) #8
a%=3
print (a) #2
python还支持链式赋值和系列解包赋值,如下代码:
a=b=c=5 #链式赋值
print (a,b,c) #结果都是5
x,y=1,2 #系列解包赋值
print (x,y) #1,2
三、关系运算符
- 大于:>
- 小于:<
- 恒等于:==
- 不等于:!=
- 大于等于:>=
- 小于等于:<=
python中的关系运算符跟数学中一样的,只不过python是用布尔值表示结果的真与假,真用True,假用False。代码如下:
print (3>2) #True
print (3<2) #False
print (3==2) #False
print (3==3) #True
print (3!=2) #True
print (3!=3) #False
print (3>=2) #True
print (3>=3) #True
print (3<=2) #False
print (3<=3) #True
print (4>3>2) #True
print (2<3<1) #False
四、逻辑运算符
- 与运算:and
- 或运算:or
- 非运算:not
逻辑运算符有3个,这三个运算符的结果也是布尔值,即True和False,真为True,假为False。那具体是怎么算的呢,我们通过举例的方式来了解一下。
与运算:与运算的计算方式跟开关串联所得结果是一样的,我们看下图:
把1看做真,0看做假。通过上边的例子我们可以知道,开关全部闭合时,有电流通过,结果才为1,其余情况结果均为0。
所以,与运算有个口诀:真真为真,其余全假
代码如下:
print (3>2 and 3<5) #1 and 1,结果为1,即True
print (3>2 and 3>5) #1 and 0,结果为0,即为False
print (3<2 and 3<5) #0 and 1,结果为0,即为False
print (3<2 and 3>5) #0 and 0,结果为0,即为False
或运算:这个运算方式跟开关并联的结果是一样的,我们看例子:
通过上边电源开关的例子,我们了解到只要有开关闭合,则有电流通过,也就是只要有1,结果就是1。
所以,或运算的口诀是:有真为真,其余全假
代码如下:
print (3>2 or 3<5) #1 or 1,结果为1,即True
print (3>2 or 3>5) #1 or 0,结果为1,即为True
print (3<2 or 3<5) #0 or 1,结果为1,即为True
print (3<2 or 3>5) #0 or 0,结果为0,即为False
非运算:这个运算结果是取反
口诀是:非真为假,非假为真
代码如下:
print (not(3>2)) #3>2为True,取反,结果为False
print (not(1)) #1默认为True,取反,结果为False
print (not(0)) #0默认为False,取反,结果为True
print (not(3<2)) #3>2为False,取反,结果为True
上边是我们讲的3种逻辑运算符,但是,有两点需要非常注意的地方,那就是逻辑与跟逻辑或具有短路特性。
短路与:and运算符一旦发现某一个表达式为False,就不运算后边的表达式了,因为已经知道整个表达式的结果为False。代码如下:
print (3<2 and 3/0) #结果为False
#and右边的表达式3/0,不合法,因为0不能做除数
#如果把这个表达式放在and左边,第一个做运算的话,会直接报错
#但是,放在and右边,没报错,还把结果运行出来了
#说明,根本没运行and右边的表达式,这即为短路与
短路或:or运算符一旦发现某一个表达式为True,就不运算后边的表达式了,因为已经知道整个表达式的结果为True。代码如下:
print (3>2 or 3/0) #结果为True
#or左边的表达式为真,则右边的即使不合法,也不会被运行
#这即为短路或
五、位运算符
位运算符有4个,分别是:
- 位与运算:&
- 位或运算:|
- 位异或运算:^
- 位取反运算:~
位与运算:是把十进制数选换成二进制后,按位进行与运算,如下:
十进制10:0000 0000 0000 1010
十进制12:0000 0000 0000 1100
位与运算:0000 0000 0000 1000
代码如下:
print (10&12) #结果是十进制8
位或运算:是把十进制数选换成二进制后,按位进行或运算,如下:
十进制10:0000 0000 0000 1010
十进制12:0000 0000 0000 1100
位或运算:0000 0000 0000 1110
代码如下:
print (10|12) #结果是十进制14
位异或运算:是把十进制数选换成二进制后,按位进行异或运算,相同的为0,不同的为1,如下:
十进制10: 0000 0000 0000 1010
十进制12: 0000 0000 0000 1100
位异或运算: 0000 0000 0000 0110
代码如下:
print (10^12) #结果是十进制6
位取反运算:是0的地方变成1,是1的地方变成0,如下:
十进制10:0000 0000 0000 1010
按位取反:1111 1111 1111 0101
代码如下:
print (~10) #结果是-11
位移运算:是把十进制数选换成二进制后,按位左移或者右移,空位用0(负数用1补)补齐,如下:
十进制3:0000 0011
左移2位:0000 1100
代码如下:
print (3<<2) #结果是12
十进制8:0000 1000
右移2位:0000 0010
代码如下:
print (8>>2) #结果是2
十进制-8:1111 1111 1111 1111 1111 1111 1111 1000
右移2位: 1111 1111 1111 1111 1111 1111 1111 1110
代码如下:
print (-8>>2) #结果是-2
备注:二进制中最高位是1的话,表示负数,是0表示正数,负数想要转换成十进制,需要参考补码的算法,如下:
负数-8的补码:
- 取8的原码是:0000 1000
- 8的原码取反:1111 0111
- 再加1 :1111 1000
上边第3步得到的结果就是-8的二进制。同样反推,想知道1011 0011这个二进制的十进制数,我们反着来一遍:
- 二进制:1011 0011
- 先减一:1011 0010
- 再取反:0100 1101
- 转十进制:77
- 加负号:-77
最终结果是-77,我们用python验证一下即可。
print (bin(-77)) #结果为-0b1001101