Python 运算符

本文主要介绍 Python 语言支持的运算符,包括算术运算符、比较运算符、赋值运算符、逻辑运算符、位运算符、成员运算符以及身份运算符。

算术运算符

Python 运算符

整数算术

整数是不带小数部分的数字,如 12、-89 和 0。Python 支持4种基本算术运算:+(加)、-(减)、*(乘)、/(除)。Python 还使用 **% 来分别表示乘方和求余,此外还有一个整除运算符 //,其工作原理类似于 /,但结果总是整数(使用去尾法而非四舍五入)。

基本算数运算符

名称 运算符 示例
加法 + 3 + 4 结果为7
减法 - 5 - 3 结果为2
乘法 * 2 * 3 结果为6
除法 / 3 / 2 结果为1.5
整除 // 3 // 2 结果为1
求余 % 25 % 3 结果为1
乘方 ** 3 ** 3 结果为27

上表总结了 Python 的基本算术运算符,并按优先级从低到高的顺序将它们编组。Python 算术运算的规则与常规算术运算相同,可以使用圆括号改变计算顺序。

与其他大多数编程语言不同,Python 对整数的长度没有限制,你可以执行数十位甚至数百位数、千位的整数运算。比如:

>>> 27 **100
136891479058588375991326027382088315966463695625337436471480190078368997177499076593800206155688941388250484440597994042813512732765695774566001

浮点数算术

在 Python 中,浮点数就是带小数点的数字,比如 2.7、-3.14 和 12.88 都是浮点数。所有适用于整数的算术运算都可用于浮点数,包括 %(求余) 和 //(整除)。

>>> 3.8 + -43.2
-39.400000000000006
>>> 12.6 * 0.5
6.3
>>> 12.6 + 0.01
12.61
>>> 365.0 / 12
30.416666666666668
>>> 8.8 ** -5.4
7.939507629591553e-06
>>> 5.6 // 2
2.0
>>> 5.6 % 3.2
2.3999999999999995

需要注意的是,近似误差很常见,因此显示的通常不是准确值。

浮点数字面量

对于非常大或非常小的浮点数,通常用科学记数法(scientific notation)表示。比如上面的 e-06 表示将它前面的数字乘以 10^-6^,如果有需要,也可以直接使用科学记数法。

>>> 2.3e02
230.0

Python 的浮点数在使用小数点方面非常灵活,以下用法都是没问题的:

>>> 3.
3.0
>>> 3.0
3.0
>>> .5
0.5
>>> 0.5
0.5

通常 5.0 比 5. 更清晰,因为后者可能令人迷惑,它看起来像句子结尾。区分 5 和 5.0 很重要,因为前者是整数,后者是浮点数,它们的内部表示大相径庭。

溢出

与整数不同,浮点数存在上限和下限,超出上限或下限将导致溢出错误。溢出错误意味着计算结果太大或太小,Python 无法将其表示为浮点数。比如计算 500 ** 1000 是没问题的,但是换成 500.0 就会溢出:

>>> 500.0 ** 1000
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
OverflowError: (34, 'Numerical result out of range')

面对溢出错误,Python 可能沉默不语,即继续执行错误的计算,而不告诉你出了问题。一般而言,避免溢出错误的职责由程序员承担。

精度有限

无论在哪种计算机上,浮点数的精度都是一个无法解决的难题。在计算机中,数字用二进制(基数为2)表示,但并非所有浮点数都可以用二进制精确地表示。即便在最简单的情况下,也可能出现问题,比如:

>>> 1 - 2 / 3
0.33333333333333337

结果应该是小数点后有无穷个3,但这里只包含17位。另外,最后一位也不对(应该是3而不是7)。

这些细微的误差通常不是问题,对大多数程序来说,小数点后面包含17位足够了。然而,当你执行大量计算时,小误差会累积出大误差。例如,计算新设计的桥梁承受的压力时,必须考虑细微的浮点数误差,避免它们累积出大误差。

一般而言,应优先考虑使用整数而不是浮点数,因为它们更精确且绝不会溢出。

比较运算符

Python 运算符

赋值运算符

Python 运算符

注意:Python 不支持 ++-- 这种自增、自减运算符。

逻辑运算符

Python 运算符

注意:Python 没有 &&||,取而代之的是 andornot

位运算符

Python 运算符

提示:内建函数 bin() 可以得到二进制编码值。

成员运算符

Python 运算符

身份运算符

Python 运算符

提示:内建函数 id() 可以获取对象内存地址。

Leave a Reply