
2.3 运算符与表达式
在程序中,表达式是用来计算求值的,它是由运算符(操作符)和运算数(操作数)组成的式子。运算符是表示进行某种运算的符号;运算数包含常量、变量和函数等。例如,表达式4+5,在这里4和5称为操作数,“+”称为运算符。
下面分别对Python中的运算符和表达式进行介绍。
2.3.1 运算符
Python语言支持的运算符有以下几种类型:算术运算符、比较(即关系)运算符、逻辑运算符、赋值运算符、位运算符、成员运算符、标识运算符。
1.算术运算符
算术运算符用于实现数学运算,如表2-5所示。假设其中变量a=10,变量b=20。
表2-5 算术运算符

注意:
(1)Python语言算术表达式的乘号(*)不能省略。例如,数学表达式b2-4ac相应的程序表达式应该写成:b*b-4*a*c。
(2)Python语言表达式中只能出现字符集允许的字符。例如,数学表达πr2相应的程序表达式应该写成:math.pi*r*r(其中,math.pi是Python已经定义的模块变量)。
例如:

结果为3.141592653589793。
(3)Python语言算术表达式只使用圆括号改变运算的优先顺序(不能使用{}或[])。可以使用多层圆括号,此时左右括号必须配对,运算时从内层括号开始,由内向外依次计算表达式的值。
2.关系运算符
关系运算符用于两个值进行比较,运算结果为True(真)或False(假)。Python中的关系运算符如表2-6所示。假设变量a=10,变量b=20。
表2-6 关系运算符

关系运算符的优先级低于算术运算符。
例如:

3.逻辑运算符
Python中提供了3种逻辑运算符,分别是:

3种逻辑运算符的含义:设a和b是两个参加运算的逻辑量,a and b的意义是,当a、b均为真时,表达式的值为真,否则为假;a or b的含义是,当a、b均为假时,表达式的值为假,否则为真;not a的含义是,当a为假时,表达式的值为真,否则为假。逻辑运算符如表2-7所示。
表2-7 逻辑运算符

例如:

程序运行结果:

注意:
(1)x>1 and x<5是判断某数x是否大于1且小于5的逻辑表达式。
(2)如果逻辑表达式的操作数不是逻辑值True和False时,Python则将非0作为真,0作为假进行运算。
例如:当a=0,b=4时,a and b结果为假(0),a or b结果为真。

说明:Python中的or是从左到右计算表达式,返回第一个为真的值。
Python中逻辑值True作为数值则为1,逻辑值False作为数值则为0。

由于逻辑值True作为数值则为1,所以True+5的结果为6。

由于逻辑值False作为数值则为0,所以False+5的结果为5。
4.赋值运算符
赋值运算符“=”的一般格式为:

表示将其右侧的表达式求出结果,赋给其左侧的变量。例如:

说明:
(1)赋值运算符左边必须是变量;右边可以是常量、变量、函数调用,或者常量、变量、函数调用组成的表达式。例如:

都是合法的赋值表达式。
(2)赋值符号“=”不同于数学的等号,它没有相等的含义。
例如:x=x+1是合法的(数学中不合法),它的含义是取出变量x的值加1,再存放到变量x中。
赋值运算符如表2-8所示。
表2-8 赋值运算符

5.位运算符
位(bit)是计算机中表示信息的最小单位,位运算符作用于位和位操作。Python中位运算符如下:
按位与(&)、按位或(|)、按位异或(^)、按位求反(~)、左移(<<)、右移(>>)。位运算符是对其操作数按其二进制形式逐位进行运算,参加位运算的操作数必须为整数,下面分别进行介绍。假设a=60,b=13;现在以二进制格式表示它们的位运算如下:

(1)按位与(&)。运算符“&”将其两边的操作数的对应位逐一进行逻辑与运算,每一位二进制数(包括符号位)均参加运算。例如:


所以,变量c的值为2。
(2)按位或(|)。运算符“|”将其两边的操作数的对应位逐一进行逻辑或运算,每一位二进制数(包括符号位)均参加运算。例如:


所以,变量c的值为19。
注意:尽管在位运算过程中,按位进行逻辑运算,但位运算表达式的值不是一个逻辑值。
(3)按位异或(^)。运算符“^”将其两边的操作数的对应位逐一进行逻辑异或运算,每一位二进制数(包括符号位)均参加运算。异或运算的定义:若对应位相异,结果为1;若对应位相同,结果为0。
例如:


所以,变量c的值为17。
(4)按位求反(~)。运算符“~”是一元运算符,结果将操作数的对应位逐一取反。
例如:


所以,变量c的值为-124。因为补码形式,带符号二进制数最高位为1,则是负数。
(5)左移(<<)。设a、n是整型量,左移运算一般格式为:a<<n,其意义是,将a按二进制位向左移动n位,移出的高n位舍弃,低位补n个0。
例如a=7,a的二进制形式是0000 0111,做x=a<<3运算后x的值是0011 1000,其十进制数是56。
左移一个二进制位,相当于乘2操作。左移n个二进制位,相当于乘以2n操作。
左移运算有溢出问题,因为整数的最高位是符号位,当左移一位时,若符号位不变,则相当于乘以2操作,但若符号位变化时,就会发生溢出。
(6)右移(>>)。设a、n是整型量,右移运算一般格式为:a>>n,其意义是,将a按二进制位向右移动n位,移出的低n位舍弃,高n位补0或1。若a是有符号的整型数,则高位补符号位;若a是无符号的整型数,则高位补0。
右移一个二进制位,相当于除以2操作,右移n个二进制位相当于除以2n操作。例如:

a=7,做x=a>>1运算后x的值是3。
6.成员运算符
除了前面讨论的运算符,Python成员运算符判断序列中是否有某个成员。成员运算符如表2-9所示。
7.标识运算符
标识运算符用于比较两个对象的内存位置,如表2-10所示。
表2-9 成员运算符

表2-10 标识运算符

8.运算符优先级
在一个表达式中出现多种运算时,将按照预先确定的顺序计算并解析各个部分,这个顺序称为运算符优先级。当表达式包含不止一种运算符时,按照表2-11所示优先级规则进行计算。
表2-11 运算符优先级

2.3.2 表达式
表达式是一个或多个运算的组合。Python语言的表达式与其他语言的表达式没有显著的区别。每个符合Python语言规则的表达式计算后都是一个确定的值。对于常量、变量的运算和对于函数的调用都可以构成表达式。
本书后续章节中介绍的序列、函数、对象都可以成为表达式的一部分。
书写表达式需要注意以下几点:
(1)乘号(*)不能省略。例如,数学表达式b2-4ac相应的程序表达式为b*b-4*a*c。
(2)表达式中只能出现字符集允许的字符。例如,数学表达式πr2相应的程序表达式为math.pi*r*r(其中,pi是math模块已经定义的常量)。
(3)表达式只使用圆括号改变运算的优先顺序(不能使用{}或[])。可以使用多层圆括号,此时左右括号必须配对,运算时从内层括号开始,由内向外依次计算表达式的值。