- Python程序设计基础教程(慕课版)
- 薛景 陈景强 朱旻如 龚乐君
- 2516字
- 2020-06-24 22:59:03
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