2.3 算术运算
下表总结了Python中的算术运算符,其中包括一些在代数中没有的符号。
乘法(*
)
Python将星号(*
)作为乘法运算符,例如:
求幂运算(**
)
求幂(**
)运算符计算一个数的幂,例如:
如需计算平方根,可以使用1/2(即0.5)作为指数:
除法(/
)和整除(//
)
除法(/
)运算用分子除以分母,结果为带小数点的浮点数,如下所示:
整除(//
)用分子除以分母,得到不大于结果的最大整数。Python会直接截断(丢弃)小数部分:
使用除法(/
)时,-13除以4的结果为-3.25,如下:
整除(//
)的结果为不大于-3.25的最大整数,即-4,如下:
异常和回溯
Python不允许用“/
”或“//
”除以零,否则将导致异常,表示有问题发生:
Python使用回溯来报告异常。上面的回溯表示发生了类型为ZeroDivisionError
的异常(大多数异常的名称以Error
结尾)。在交互模式下,下面这行异常信息中的10
表示导致异常的代码段编号
<ipython-input-10-cd759d3fcf39> in <module>()
以---->
开头的行显示导致异常的代码。当产生异常的代码段包含多行代码时,--->
右侧的数字1
表示导致异常的语句是代码段内的第1行。异常信息的最后一行显示异常名,后跟冒号(:
)和更加详细的异常信息:
ZeroDivisionError: division by zero
第9章对异常进行了详细的讨论。
如果在代码中使用了尚未创建的变量,也会发生异常。以下代码段试图将整数7
与未定义的变量z
相加,这将会产生NameError
异常:
取余运算符
取余运算符(%)计算左操作数除以右操作数后得到的余数:
上面的代码段中,17
除以5
的商为3
,余数为2
。取余运算符通常用于整数,但也可以用于其他类型的数字,例如:
直线形式
在编译器或解释器中一般不能使用形如的代数形式,必须使用Python的运算符以直线形式来表示。上面的表达式可以写为a/
b或者a//
b(表示整除),这样所有的运算符和操作数都呈水平排列。
用括号表示分组表达式
与在代数中一样,括号将Python的表达式组合在一起。例如,下面的代码先计算5+3
,然后再用10
乘以5+3
的结果,如下:
如果没有括号,计算结果是不同的,如下:
如果去掉括号会得到相同的结果,则括号是多余的(不必要的)。
运算符优先级规则
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运算符的结合性都是从左到右。
冗余括号
为了使表达式更加清晰,可以使用冗余括号对子表达式进行分组。例如,二次多项式
可以用括号括起来,如下所示:
这样的表达更加清晰。此外,将复杂的表达式分解为由更短、更简单的表达式构成的语句序列,也可以提高程序的清晰度。
操作数的类型
算术运算符既可以连接整数,也可以连接浮点数。如果连接的两个操作数都是整数,计算结果为整数,但除法(/
)运算符除外,因为它的结果总是一个浮点数。如果两个操作数都是浮点数,则结果为浮点数。既有整数也有浮点数的表达式称为混合类型表达式,这种表达式的结果是浮点型。