Python程序设计:人工智能案例实践
上QQ阅读APP看书,第一时间看更新

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。取余运算符通常用于整数,但也可以用于其他类型的数字,例如:

直线形式

在编译器或解释器中一般不能使用形如000的代数形式,必须使用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运算符的结合性都是从左到右。

冗余括号

为了使表达式更加清晰,可以使用冗余括号对子表达式进行分组。例如,二次多项式

可以用括号括起来,如下所示:

这样的表达更加清晰。此外,将复杂的表达式分解为由更短、更简单的表达式构成的语句序列,也可以提高程序的清晰度。

操作数的类型

算术运算符既可以连接整数,也可以连接浮点数。如果连接的两个操作数都是整数,计算结果为整数,但除法(/)运算符除外,因为它的结果总是一个浮点数。如果两个操作数都是浮点数,则结果为浮点数。既有整数也有浮点数的表达式称为混合类型表达式,这种表达式的结果是浮点型。