python学习_运算符
一、python中的常用运算符
- 算术运算符
需要注意的是一正一负的整除运算和取余运算
算数运算符的优先级:幂运算(**)>乘除、整除和取余(*、/、//、%)>加减(+、-)
- 赋值运算符
#赋值运算符,运算顺序从右到左 i=3+4 print(i) #结果为7,运算顺序是从右到左,所以先计算右边的,在赋值给左边的i
#链式赋值 a=b=c=20 #将20赋值给变量c、将20赋值给变量b,将20赋值给变量a print(a,id(a)) #20 140723822683376 print(b,id(b)) #20 140723822683376 print(c,id(c)) #20 140723822683376
链式赋值的内存示意图(三个变量都指向20):
#参数赋值 a=20 a+=30 #相当于a=a+30,也就是a+30后赋值给a print(a) #50 a-=10 #相当于a=a-10,也就是a-10后赋值给a print(a) #40 a*=2 #相当于a=a*2,也就是a*2后赋值给a print(a,type(a)) #80 <class 'int'> a/=3 #相当于a=a/2,也就是a/2后赋值给a print(a,type(a)) #26.666666666666668 <class 'float'> a//=2 #相当于a=a//2,也就是a//2后赋值给a print(a,type(a)) #13.0 <class 'float'> a%=3 #相当于a=a%3,也就是a%3后赋值给a print(a,type(a)) #1.0 <class 'float'>
#解包赋值 a,b,c=20,30,40 #相当于将20赋给a,30赋给b,40赋给c 注意:解包赋值左边变量的个数要和右边值的个数相等 print(a,b,c) #20 30 40
解包赋值交换两个变量的值
a,b=10,20 a,b=b,a print(a,b)
- 比较运算符:对变量或者表达式的结果进行大小、真假等比较,它的结果是一个布尔类型
#比较运算符 a,b=10,20 print("a大于b吗?",a>b) #False print("a小于b吗?",a<b) #True print("a大于等于b吗?",a>=b) #False print("a小于等于b吗?",a<=b) #True print("a不等于b吗?",a!=b) #True print("a等于b吗?",a==b) #False '''一个=号叫做赋值运算符,两个==号叫做比较运算符 一个变量由三部分组成:标识ID、类型type、值value 那==比较的是标识还是值呢? 比较的是值value 比较对象的标识使用 is ''' #比较两个对象的标识 n1=10 n2=10 print(n1==n2) #True,说明n1与n2的值相等 print(n1 is n2) #True,说明n1与n2的标识相等,都是指向的内存中同一块内存空间(数值10) list1=[11,22,33,44] list2=[11,22,33,44] print(list1==list2) #True,说明list1和list2两个列表的值相等 print(list1 is list2) #False,list1与list2两个列表的标识不相等 print(id(list1)) #2272722379400 print(id(list2)) #2272722379464 print(list1 is not list2) #True,is not的意思是list1与list2的id不相等,由于两个的id标识确实是不相等所以结果为True
print(n1 is not n2) #False,这里的意思是n1与n2的id不相等,由于n1与n2的id是相等的,所以结果为False
- 布尔运算符(也叫逻辑运算符,是对布尔值之间进行运算)
not是对布尔类型的操作数取反
#布尔运算符 a,b=1,2 print("---------and运算 并且------------") print(a==1 and b==2) #True print(a==1 and b<2) #False print(a!=1 and b==2) #False print(a!=1 and b!=2) #False print("---------or运算 或者------------") print(a==1 or b==2) #True print(a==1 or b<2) #True print(a!=1 or b==2) #True print(a!=1 or b!=2) #True print("---------not运算 对bool类型的操作数取反------------") f=True f2=False print(not f) #False print(not f2) #True print("----------in 与not in-------") s="helloword" print('w' in s) #True print('m' in s) #False print('h' not in s) #False print('k' not in s) #True
注意:当and和or运算符两边的操作数不是bool值或者表达式时,and和or的运算要遵循一个短路逻辑:如4 and 3,结果为3
print(3 and 4) #4,因为3的真值为True,要确定and的运算结果,还需要确定第二个操作数,所以python直接返回第二个操作数4 print(0 and 4) #0,因为0的真值为False,可以直接确定and的运算结果,不需要知道第二个操作数,所以python直接返回0 print(3 or 4) #3,因为3的真值为True,不需要知道第二个操作数,直接可以确定or结果,所以python直接返回3 print(0 or 4) #4,因为0的真值为False,要确定or的运算结果,还需要知道第二个操作数,所以python直接返回第二个操作数4 print("abc" and "edf") #edf,因为abc的真值为True,要确定and的运算结果,还需要确定第二个操作数,所以python直接返回第二个操作数edf print('abc' or 'edf') #abc,因为abc的真值为True,不需要知道第二个操作数,直接可以确定or结果,所以python直接返回abc print('' or 'edf') #edf,因为''的真值为False,要确定or的运算结果,还需要知道第二个操作数,所以python直接返回第二个操作数edf print('' and 'edf') #返回为空,因为''的真值为False,可以直接确定and的运算结果,不需要知道第二个操作数,所以python直接返回空
布尔运算符的优先级:in/not in >not>and>or
- 位运算符(也就是将数据转成二进制来进行的计算就叫位运算)
#位运算 print(4&8) #0,将4和8都转成二进制进行计算,对应位数都为1才会为1 print(4|8) #12,将4和8转成二进制进行计算,对应位数都为0才会为0 print(4<<1) #8,4转成二进制以后左移一位(向左移动一个位置),超出8位后的高位溢出,低位缺失的补0 print(4<<2) #16,4转成二进制以后左移两位 print(4>>1) #2,8转成二进制以后右移一位,高位缺失的补0,低位超出的溢出 print(4>>2) #1,8转成二进制以后右移两位
注:所以,通过上面可知,每左移1位相当于乘以2,每右移1位相当于除以2
位运算符的优先级:>>/<< (移位)> & (与)> | (或)