2.5 运算符和优先级
在Python语言中,支持的运算符包括算术运算符、比较运算符、赋值运算符、逻辑运算符、位运算符、身份运算符和成员运算符。
2.5.1 算术运算符
Python语言中常见的算术运算符如表2-1所示。
表2-1 算术运算符
【案例2-1】使用算术运算符(代码2.1.py)。
x = 4 y = 5 z = 1 #加法运算 a = x + y print ("a的值为:", a) #减法运算 a =x - y print ("a的值为:", a) #乘法运算 a = x * y print ("a的值为:", a) #除法运算 a = x / y print ("a的值为:", a) #取模运算 a= x % y print ("a的值为:", a) #修改变量x、y、z x = 10 y = 12 z = x**y print ("z的值为:", z) #整除运算 X = 15 y = 3 z = x//y print ("z的值为:", z)
保存并运行程序,结果如下:
A的值为: 9 a的值为: -1 a的值为: 20 a的值为: 0.8 a的值为: 4 z的值为: 1000000000000 z的值为: 5
在本案例中,首先定义变量x、y、z并赋值,然后进行算术运算,接着修改变量的值,再次进行整除运算。
2.5.2 比较运算符
Python语言支持的比较运算符如表2-2所示。
表2-2 比较运算符
【案例2-2】使用比较运算符(代码2.2.py)。
x = 15 y = 6 # 判断变量x和y是否相等 if ( x == y ): print ("x等于y") else: print ("x不等于y") # 判断变量x和y是否不相等 if ( x ! = y ): print ("x不等于y") else: print ("x等于y") # 判断变量x是否小于y if ( x < y ): print ("x小于y") else: print ("x大于等于y") # 判断变量x是否大于y if ( x > y ): print (" x大于y") else: print (" x小于等于y") # 修改变量x和y的值 x = 6 y = 18 # 判断变量x是否小于等于y if ( x <= y ): print (" x小于等于y") else: print (" x大于 y") # 判断变量x是否大于等于y if ( y >= x): print (" y大于等于x") else: print (" y小于x")
保存并运行程序,结果如下:
x不等于y x不等于y x大于等于y x大于y x小于等于y y大于等于y
在本案例中,首先定义变量x、y并赋值,然后使用if判断语句,并结合比较运算符判断两个变量的大小关系。
2.5.3 赋值运算符
赋值运算符表示将右边变量的值赋给左边变量,常见的赋值运算符的含义如表2-3所示。
表2-3 赋值运算符
【案例2-3】使用赋值运算符(代码2.3.py)。
x = 24 y = 8 z = 6 #简单的赋值运算 z = x + y print ("z的值为:", z) #加法赋值运算 z += x print ("z的值为:", z) #乘法赋值运算 z *= x print ("z的值为:", z) #除法赋值运算 z /= x print ("z的值为:", z) #取模赋值运算 z = 12 z %= x print ("z的值为:", z) #幂赋值运算 x=3 z **= x print ("z的值为:", z) #取整除赋值运算 z //= x print ("z的值为:", z)
保存并运行程序,结果如下:
z的值为:32 z的值为:56 z的值为:1344 z的值为:56.0 z的值为:12 z的值为:1728 z的值为:576
在本案例中,首先定义变量x、y和z并简单赋值,然后使用各种赋值方式对变量进行赋值操作。
2.5.4 逻辑运算符
Python支持的逻辑运算符如表2-4所示。
表2-4 逻辑运算符
【案例2-4】使用逻辑运算符(代码2.4.py)。
a = 10 b = 15 #布尔“与”运算 if ( a and b ): print ("变量a和b都为true") else: print ("变量a和b有一个不为true") #布尔“或”运算 if ( a or b ): print ("变量a和b都为true,或其中一个变量为true") else: print ("变量a和b都不为true") # 修改变量a的值 a = 0 if ( a and b ): print ("变量a和b都为true") else: print ("变量a和b有一个不为true") if ( a or b ): print ("变量a和b都为true,或其中一个变量为true") else: print ("变量a和b都不为true") # 布尔“非”运算 if not( a and b ): print ("变量a和b都为false,或其中一个变量为false") else: print ("变量a和b都为true")
保存并运行程序,结果如下:
变量a和b都为true 变量a和b都为true,或其中一个变量为true 变量a和b有一个不为true 变量a和b都为true,或其中一个变量为true 变量a和b都为false,或其中一个变量为false
在本案例中,首先定义变量a和b并简单赋值,然后对变量进行各种逻辑运算操作。
2.5.5 位运算符
在Python中,按位运算是把数字转换为二进制来进行计算。Python支持的位运算符如表2-5所示。
表2-5 位运算符
【案例2-5】使用位运算符(代码2.5.py)。
a = 12 # 12 =00001100 b = 6 # 6= 00000110 c = 0 #按位与运算 c = a & b # 4 = 00000100 print ("c的值为:", c) #按位或运算 c = a | b # 14 = 00001110 print ("c的值为:", c) #按位异或运算 c = a ^ b # 10 = 00001010 print ("c的值为:", c) #按位取反运算 c = ~a # -13 = 10001101 print ("c的值为:", c) #左移动运算 c = a << 2 # 48 = 00110000 print ("c的值为:", c) #右移动运算 c = a >> 2 # 3 = 00000011 print ("c的值为:", c)
保存并运行程序,结果如下:
c的值为: 4 c的值为: 14 c的值为: 10 c的值为: -13 c的值为: 48 c的值为: 3
在本案例中,首先定义变量a、b和c并简单赋值,然后对变量进行各种位运算操作。读者特别需要注意按位取反运算的操作结果。
2.5.6 身份运算符
Python支持的身份运算符为is和not is。其中is是判断两个标识符是不是引用自同一个对象;is not是判断两个标识符是不是引用自不同对象。
【案例2-6】使用身份运算符(代码2.7.py)。
a =’张笑笑’ b = ’刘萍’ #使用is身份运算符 if ( a is b): print ("a和b有相同的标识") else: print ("a和b没有相同的标识") #使用is not身份运算符 if ( a is not b ): print ("a和b没有相同的标识") else: print ("a和b有相同的标识") # 修改变量a的值 a = ’刘萍’ if ( a is b): print ("修改后的a和b有相同的标识") else: print ("修改后的a和b仍然没有相同的标识")
保存并运行程序,结果如下:
a和b没有相同的标识 a和b没有相同的标识 修改后的a和b有相同的标识
在本案例中,首先定义变量a和b并简单赋值,然后判断a和b是否具有相同的标识,接着修改变量a的值,修改后的a和b有相同的标识。
2.5.7 成员运算符
Python还支持成员运算符,测试实例中包含了一系列成员,包括字符串、列表或元组。成员运算符包括in和not in, x in y表示如果x在y序列中返回true; x not in y表示如果x不在y序列中返回true。
【案例2-7】使用成员运算符(代码2.6.py)。
a =’张笑笑’ b = ’刘萍’ students = [’王平’, ’张小平’, ’李晓莉’, ’张雁峰’, ’韩恩丽’ ]; # 使用in成员运算符 if ( a in students ): print ("变量a在给定的列表students中") else: print ("变量a不在给定的列表students中") # 使用not in成员运算符 if ( b not in students ): print ("变量b不在给定的列表students中") else: print ("变量b在给定的列表students中") # 修改变量a的值 a = ’张小平’ if ( a in students ): print ("变量a在给定的列表students中") else: print ("变量a不在给定的列表students中")
保存并运行程序,结果如下:
变量a不在给定的列表students中 变量b不在给定的列表students中 变量a在给定的列表students中
在本案例中,首先定义变量a和b并简单赋值,然后定义了一个列表变量students,接着开始判断变量a和b是否属于列表students的成员,修改变量a的值后,变量a属于列表students的成员。
2.5.8 运算符的优先级
Python运算符以处理的先后排列如下。
(1)(), [], {}。
(2)'object'。
(3)object[i], object[1:r], object.attribute, function()。
(4)(.)符号用来存取对象的属性与方法。下列案例调用对象t的append()方法,在对象t的结尾加上一个字符"t":
>>> t = ["P", "a", "r", "r", "o"] >>> t.append("t") >>> t ['P', 'a', 'r', 'r', 'o', 't']
(5)+x, -x, ~x。
(6)x**y:x的y次方。
(7)x * y, x / y, x % y:x乘y, x除以y, x除以y的余数。
(8)x + y, x - y:x加上y, x减y。
(9)x << y, x >> y:x左移y位,x右移y位。例如:
>>> x = 4 >>> x << 2 16
(10)x & y:按位与运算符。
(11)x ^ y:按位异或运算符。
(12)x | y:按位或运算符。
(13)<, <=, >, >=, ==, !=, <>, is, is not, in, not in。in与not in运算符应用在列表(list)上。is运算符检查两个变量是否属于相同的对象。is not运算符则是检查两个变量是否不属于相同的对象。! =与<>运算符是相同功能的运算符,都是测试两个变量是否不相等。Python建议使用!=运算符,而不要使用<>运算符。
(14)not。
(15)and。
(16)or, lambda args:expression。
使用运算符时须注意下列事项。
(1)将除法应用在整数时,其结果会是一个浮点数。例如8/4会等于2.0,而不是2。余数运算会将x / y所得的余数返回来,例如7%4 =3。
(2)如果将两个浮点数相除取余数,其返回值也会是一个浮点数,其计算方式是x - int(x/ y)* y。例如:
>>>7.0 % 4.0 3.0
(3)比较运算符可以连在一起处理,例如a<b<c<d, Python会将这个式子解释成a<b and b<c and c<d。像x<y>z也是有效的表达式。
(4)如果运算符(operator)两端的运算数(operand)数据类型不相同,Python会将其中一个运算数的数据类型,转换成跟另一个运算数一样的数据类型。转换方式为:若有一个运算数是复数,另一个运算数也会被转换成复数;若有一个运算数是浮点数,另一个运算数也会被转换成浮点数。
(5)Python有一个特殊的运算符:lambda。利用lambda运算符能够以表达式的方式创建一个匿名函数。lambda运算符的语法如下:
lambda args : expression
args是以逗号(,)隔开的参数列表(list),而expression则是对这些参数进行运算的表达式。
例如:
>>>a=lambda x, y:x + y >>>print (a(3,4)) 7
x与y是a()函数的参数,a()函数的表达式是x+y。lambda运算符后只允许有一个表达式。要达到相同的功能,也可以使用函数来定义a,如下所示:
>>> def a(x, y): #定义一个函数 return x + y #返回参数的和 >>> print (a(3,4)) 7
【案例2-8】比较运算符的优先级(代码2.8.py)。
a = 10 b = 6 c = 4 d = 2 e = 0 e = (a + b) * c / d #(16 *4 ) / 2 print ("(a + b) * c / d运算结果为:", e) e = ((a + b) * c) / d # (16 *4 ) /2 print ("((a + b) * c) / d运算结果为:", e) e = (a + b) * (c / d); # (16) * (4/2) print ("(a + b) * (c / d) 运算结果为:", e) e = a + (b * c) / d; # 10 + (24/2) print ("a + (b * c) / d运算结果为:", e)
保存并运行程序,结果如下:
(a + b) * c / d运算结果为:32.0 ((a + b) * c) / d运算结果为:32.0 (a + b) * (c / d) 运算结果为:32.0 a + (b * c) / d运算结果为:22.0
在本案例中,首先定义变量a、b、c、d、e并简单赋值,然后通过各种类型的运算符混合计算,用户可以分辨出这些运算符的优先级。