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 没有 &&
、||
、!
,取而代之的是 and
、or
、not
。
位运算符
提示:内建函数 bin()
可以得到二进制编码值。
成员运算符
身份运算符
提示:内建函数 id()
可以获取对象内存地址。