2.3 运算符与表达式

编写的大多数语句都包含了表达式(Expressions)。一个表达式的简单例子是2+3。表达式可以拆分成运算符(Operators)与操作数(Operands)。

运算符是进行某些操作,并且可以用诸如+等符号或特殊关键词加以表达的功能。运算符需要一些数据来进行操作,这些数据就被称作操作数。在上面的例子中,2和3就是操作数。

2.3.1 运算符

运算符

接下来将简要介绍各类运算符及它们的用法。

为了更好地理解各类运算符的作用,强烈建议在Python的命令行解释器中输入以下范例中的表达式内容,并观察输出结果。例如,要想测试表达式2+3,可以在交互式Python解释器的提示符后输入如下代码。

>>> 2 + 3 
5 
>>> 3 * 5 
15 
>>> 

下面是Python语言支持的运算符。

(1)+(加号):两个对象相加。

例如,3+5输出8,'a'+'b'输出'ab'。

(2)-(减号)

从一个数中减去另一个数,如果第一个操作数不存在,则假定为零。

例如,-5.2将输出一个负数,50-24输出26。

(3)*(乘号)

给出两个数的乘积,或返回字符串重复指定次数后的结果。

例如,2*3输出6,'la'*3输出'lalala'。

(4)**(乘方,幂运算)

返回x的y次方。

例如,3**4输出81(即3*3*3*3)。

(5)/(除号,结果为实数)

x除以y

例如,13/3输出4.333333333333333。

(6)//(整除,结果为整数)

x除以y并对结果向下取整至最接近的整数。

例如,13//3输出4,-13//3输出-5。

(7)%(取模,求余数的运算)

%返回除法运算后的余数。

例如,13%3输出1,-25.5%2.25输出1.5。

(8)<<(按位左移)

<<将数字的位向左移动指定的位数(每个数字在内存中以二进制数表示,即0和1)。

例如,2<<2输出8,2用二进制数表示为10。向左移2位会得到1000这一结果,表示十进制中的8。

(9)>>(按位右移)

>>将数字的位向右移动指定的位数。

例如,11>>1输出5。11在二进制中表示为1011,右移一位后输出101这一结果,表示十进制中的5。

(10)&(按位与)

&对数字进行按位与操作。

例如,5&3输出1。按位与是针对二进制数的操作,是指比较两个二进制数的每一位,如果两个相应的二进位都为1,则此位为1,否则为0。在本例中,5的二进制表达为101,3的二进制表达为11(为补全位数进行按位操作写作011),则按位与操作后的结果为001,对应的十进制数为1。

(11)|(按位或)

|对数字进行按位或操作。

例如,5|3输出7。按位或是针对二进制数的操作,是指比较两个二进制数的每一位,如果两个相应的二进位有一个为1,则此位为1,否则为0。在本例中,101与011进行按位或操作后的结果为111,对应的十进制数为7。

(12)^(按位异或)

^对数字进行按位异或操作。

例如,5^3输出6。按位异或是针对二进制数的操作,是指比较两个二进制数的每一位,如果两个相应的二进位不同,则此位为1,相同为0。在本例中,101与011进行按位异或操作的结果为110,对应的十进制数为6。

(13)~(按位取反)

~表示x的按位取反结果为-(x+1)。

例如,~5输出-6。按位取反也称作“按位取非”“求非”或“取反”,沈洁元译本译作“按位翻转”,是针对二进制数的操作,是指对两个二进制数的每一二进位都进行取反操作,0换成1,1换成0。受篇幅与学识所限,本例具体原理不在此处赘述,读者只需按照给出的公式记忆即可。

(14)<(小于)

<返回x是否小于y。所有比较运算符的返回结果均为True或False。请注意这些名称中的大写字母。

例如,5<3输出False,3<6输出True。

比较可以任意组成链接,例如,3<5<7返回True。

(15)>(大于)

>返回x是否大于y。

例如,5>3返回True。如果两个操作数均为数字,它们首先将会被转换至一种共同的类型,否则它将总是返回False。

(16)<=(小于等于)

<=返回x是否小于或等于y。

例如,x=3;y=6;x<=y返回True。

(17)>=(大于等于)

>=返回x是否大于或等于y。

例如,x=4;y=3;x>=3返回True。

(18)==(等于)

==比较两个对象是否相等。例如:

x=2;y=2;x==y返回True。

x='str';y='stR';x==y返回False。

x='str';y='str';x==y返回True。

(19)!=(不等于)

!=比较两个对象是否不相等。

x=2;y=3;x!=y返回True。

(20)not(逻辑“非”)

not表示如果x是Ture,则返回False;如果x是False,则返回True。

例如,x=Ture;not x返回False。

(21)and(逻辑“与”)

and表示如果x是False,则x and y返回False,否则返回y的计算值。

例如,当x是False时,x=False;y=True;x and y将返回False。在这一情境中,Python将不会计算y,因为它已经了解and表达式的左侧是False,这意味着整个表达式都将是False而不会是别的值。这种情况称作短路计算(Short-circuit Evaluation)

(22)or(逻辑“或”)

or表示如果x是True,则返回True,否则返回y的计算值。

例如,x=Ture;y=False;x or y将返回Ture。在这里短路计算同样适用。

2.3.2 运算符的优先级

如果有一个诸如2+3*4的表达式,是优先完成加法运算还是优先完成乘法运算呢?基础数学知识会告诉我们应该先完成乘法运算。这意味着乘法运算符的优先级要高于加法运算符。

下面给出Python中从最低优先级到最高优先级的优先级列表。这意味着,在给定的表达式中,Python将优先计算列表中位置靠后的那些优先级较高的运算符与表达式。

为了保持完整,本书从Python参考手册中引用了表2-2中的内容。在日常工作中,强烈建议使用圆括号操作符来对运算符与操作数进行分组,以更加明确地指定优先级,这也能使程序更加可读。

表2-2 运算的优先级(从低到高排序)

到目前为止,表2-2中还没有遇到的运算符将会在后面的章节中解释。

在表2-2中位列同一行的运算符具有相同优先级。例如,+和-具有相同的优先级。

2.3.3 改变运算顺序

为了使表达式更加易读,可以使用括号。例如,2+(3*4)要比2+3*4更加容易理解,因为后者还要求了解运算符的优先级。当然使用括号同样也要适度(而不要过度),同时亦应不要像(2+(3*4))这般冗余。

使用括号还有一个额外的优点——它能帮助我们改变运算的顺序。例如,如果希望在表达式中计算乘法之前先计算加法,那么可以将表达式写作(2+3)*4。

2.3.4 表达式

表达式(Expressions)简单来说就是一个算式,它将常量、运算符、括号、变量等以能求得结果的有意义内容组合一起,可以用以下程序来理解表达式的作用。

# 例 2.2 利用表达式求解算式的结果 
length = 5 
breadth = 2 
area = length * breadth 
print('Area is', area) 
print('Perimeter is', 2 * (length + breadth)) 

输出:

Area is 10 
Perimeter is 14 

矩形的长度(Length)与宽度(Breadth)存储在以各自名称命名的变量中。在程序中可以使用它们并借助表达式来计算矩形的面积(Area)与周长(Perimeter)。接着,将表达式length*breadth的结果存储在变量area中并将其通过使用print函数打印出来。在程序的最后一条语句中,程序直接在print函数中使用了表达式2*(length+breadth)的值。

同时,需要注意到Python是如何漂亮地打印出输出结果的。尽管我们没有特别地在Area is和变量area之间指定空格,但Python会自动补充,因此程序运行后就能得到整洁的输出结果,同时程序也因为这样的处理方式而变得更加易读。这便是Python让程序员的工作变得更加便捷美好的一个范例。

2.3.5 eval()函数

如果将一个表达式放在了一串字符中,例如:

>>>exp="100/2*3" 

那么如何才能让Python求出这个字符串中的表达式的值呢?这里推荐一个非常神奇的函数——eval()函数,它的功能就是计算一串字符串中的合法Python表达式的值,比如在上述语句之后,继续输入以下语句。

>>>eval(exp) 

执行上述程序后,将会在屏幕上得到这串字符中算式的值,即:

150.0