![Python程序设计:人工智能案例实践](https://wfqqreader-1252317822.image.myqcloud.com/cover/423/39980423/b_39980423.jpg)
2.3 算术运算
下表总结了Python中的算术运算符,其中包括一些在代数中没有的符号。
![](https://epubservercos.yuewen.com/9955D6/20818201008362506/epubprivate/OEBPS/Images/049-2.jpg?sign=1738847807-01xQhFjup9vi1Tkp0iL2DXOVsE1uvIHv-0-7fa2b6a2550e02a7a45272748639b1ad)
乘法(*
)
Python将星号(*
)作为乘法运算符,例如:
![](https://epubservercos.yuewen.com/9955D6/20818201008362506/epubprivate/OEBPS/Images/049-3.jpg?sign=1738847807-bvanC0jcIs1UbHMzH8hq7hFmXvH9Yc1Z-0-8ba2f598e4d70392968f65977a07dec1)
求幂运算(**
)
求幂(**
)运算符计算一个数的幂,例如:
![](https://epubservercos.yuewen.com/9955D6/20818201008362506/epubprivate/OEBPS/Images/049-4.jpg?sign=1738847807-DzrIOuQoRIPtqpgclD7kWSmbisLFAPIJ-0-845a113d93db7b679d4d81e6da838b59)
如需计算平方根,可以使用1/2(即0.5)作为指数:
![](https://epubservercos.yuewen.com/9955D6/20818201008362506/epubprivate/OEBPS/Images/049-5.jpg?sign=1738847807-srcI1iCJxX6pjO9CKAAhaQMQVkesuD7R-0-535a09db59a675a0edaf861700260e1e)
除法(/
)和整除(//
)
除法(/
)运算用分子除以分母,结果为带小数点的浮点数,如下所示:
![](https://epubservercos.yuewen.com/9955D6/20818201008362506/epubprivate/OEBPS/Images/049-6.jpg?sign=1738847807-eCw7hilmZECNSQbHYYe5syPNRwWTdv7M-0-4dd8b847c9abca4a34c5e99484af329a)
整除(//
)用分子除以分母,得到不大于结果的最大整数。Python会直接截断(丢弃)小数部分:
![](https://epubservercos.yuewen.com/9955D6/20818201008362506/epubprivate/OEBPS/Images/050-1.jpg?sign=1738847807-VSb22PlChMyDPAcQXD3ykgTAdjAZQqhg-0-8768edad7c7bd338be7221b826dc9678)
使用除法(/
)时,-13除以4的结果为-3.25,如下:
![](https://epubservercos.yuewen.com/9955D6/20818201008362506/epubprivate/OEBPS/Images/050-2.jpg?sign=1738847807-XykiR3c8raQb1x0yjZ517rEt5MKxWKU6-0-b972147a4f236747cd868bef23e2894e)
整除(//
)的结果为不大于-3.25的最大整数,即-4,如下:
![](https://epubservercos.yuewen.com/9955D6/20818201008362506/epubprivate/OEBPS/Images/050-3.jpg?sign=1738847807-DAoETdYexFUAoHHLpfKNY00VzuTj8t81-0-f602319d7f39d41bfb0bc961b4a32ef1)
异常和回溯
Python不允许用“/
”或“//
”除以零,否则将导致异常,表示有问题发生:
![](https://epubservercos.yuewen.com/9955D6/20818201008362506/epubprivate/OEBPS/Images/050-4.jpg?sign=1738847807-Lj3YicBgMWSjwS4ppM8ep9lUcnU79Tcm-0-4fb31e31a232e3e8dc63dcf056b73fa5)
Python使用回溯来报告异常。上面的回溯表示发生了类型为ZeroDivisionError
的异常(大多数异常的名称以Error
结尾)。在交互模式下,下面这行异常信息中的10
表示导致异常的代码段编号
<ipython-input-10-cd759d3fcf39> in <module>()
以---->
开头的行显示导致异常的代码。当产生异常的代码段包含多行代码时,--->
右侧的数字1
表示导致异常的语句是代码段内的第1行。异常信息的最后一行显示异常名,后跟冒号(:
)和更加详细的异常信息:
ZeroDivisionError: division by zero
第9章对异常进行了详细的讨论。
如果在代码中使用了尚未创建的变量,也会发生异常。以下代码段试图将整数7
与未定义的变量z
相加,这将会产生NameError
异常:
![](https://epubservercos.yuewen.com/9955D6/20818201008362506/epubprivate/OEBPS/Images/051-1.jpg?sign=1738847807-2TuBvWhd3WLhPf0H9gYmDalYxjjWZ8ei-0-1e2939dc4199964e7bac1cf0b3771a8f)
取余运算符
取余运算符(%)计算左操作数除以右操作数后得到的余数:
![](https://epubservercos.yuewen.com/9955D6/20818201008362506/epubprivate/OEBPS/Images/051-2.jpg?sign=1738847807-Tyu7ccEyotrD4DZTVdrFr5OkvRPsBwIZ-0-38b43326ee97cbfe8837391f7194314e)
上面的代码段中,17
除以5
的商为3
,余数为2
。取余运算符通常用于整数,但也可以用于其他类型的数字,例如:
![](https://epubservercos.yuewen.com/9955D6/20818201008362506/epubprivate/OEBPS/Images/051-3.jpg?sign=1738847807-l9vSSHUwBSUX8FzvW1gwsDkeKyGj3JdS-0-e14b42eed0b8cf1ac28417dc7dae47a5)
直线形式
在编译器或解释器中一般不能使用形如的代数形式,必须使用Python的运算符以直线形式来表示。上面的表达式可以写为a
/
b或者a//
b(表示整除),这样所有的运算符和操作数都呈水平排列。
用括号表示分组表达式
与在代数中一样,括号将Python的表达式组合在一起。例如,下面的代码先计算5+3
,然后再用10
乘以5+3
的结果,如下:
![](https://epubservercos.yuewen.com/9955D6/20818201008362506/epubprivate/OEBPS/Images/051-5.jpg?sign=1738847807-Si0idlQV4Yju43rKOxeMz9sWUi44JlwU-0-85175bc6b6247c7c4badc125457591a2)
如果没有括号,计算结果是不同的,如下:
![](https://epubservercos.yuewen.com/9955D6/20818201008362506/epubprivate/OEBPS/Images/051-6.jpg?sign=1738847807-QvILCDR3a8pIGVV8e9VkBOxCSaThvJeD-0-1dd2a7f66fa96f0fa6f5f2de9a170f07)
如果去掉括号会得到相同的结果,则括号是多余的(不必要的)。
运算符优先级规则
Python在算术表达式中使用运算符时遵守以下运算符优先级规则(通常与代数中的规则相同):
1. 首先计算括号中的表达式,因此可以使用括号强制表达式按照我们希望的运算顺序进行计算。括号具有最高级别的优先级。在含有嵌套括号的表达式中,例如(a/(b-c)
),优先计算最内层括号中的表达式(即b-c
)的值。
2. 接下来是求幂运算。如果表达式包含多个求幂运算,Python会按照从右到左的顺序进行计算。
3. 再往下计算乘法、除法、整除和模。如果表达式包含多个乘法、除法、整除和模运算,Python按照从左到右的顺序计算。乘法、除法、整除和模运算的优先级相同。
4. 最后计算加法和减法。如果表达式包含多个加法和减法运算,Python会按照从左到右的顺序进行计算。加法和减法也具有相同的优先级。
有关运算符及其优先级的完整列表(从最低到最高的顺序),请参阅https://docs.python.org/3/reference/expressions.html#operator-prece-dence。
运算符的结合性
当提到Python按照从左到右的顺序做运算时,指的是运算的结合性。例如,在下面的表达式中:
a + b + c
加法运算符(+
)从左到右结合,就好像加了括号一样,形如(a+b)+c
。除了从右到左结合的取幂运算符(**
)之外,其他Python运算符的结合性都是从左到右。
冗余括号
为了使表达式更加清晰,可以使用冗余括号对子表达式进行分组。例如,二次多项式
![](https://epubservercos.yuewen.com/9955D6/20818201008362506/epubprivate/OEBPS/Images/052-2.jpg?sign=1738847807-J3pPzRLMHbUrsaudTKDJ5izNpm99Elnp-0-27ff5f43c21b95383101708a30f2020c)
可以用括号括起来,如下所示:
![](https://epubservercos.yuewen.com/9955D6/20818201008362506/epubprivate/OEBPS/Images/052-3.jpg?sign=1738847807-3QEHFyAjTn69CdkyNj7jqJQdWDP2Heya-0-1dcd58a6ccd0d158445603957fa14824)
这样的表达更加清晰。此外,将复杂的表达式分解为由更短、更简单的表达式构成的语句序列,也可以提高程序的清晰度。
操作数的类型
算术运算符既可以连接整数,也可以连接浮点数。如果连接的两个操作数都是整数,计算结果为整数,但除法(/
)运算符除外,因为它的结果总是一个浮点数。如果两个操作数都是浮点数,则结果为浮点数。既有整数也有浮点数的表达式称为混合类型表达式,这种表达式的结果是浮点型。