- Python 提供核心数值类型(int、float、complex、bool)以及强大的辅助函数,如 math、cmath、decimal 和 random,用于日常计算。
- numbers 模块定义了抽象基类,因此许多内置的、NumPy 的和自定义的数值类型都可以统一地视为 Number 实例。
- 舍入模式、特殊值(NaN、无穷大)以及通过 decimal 进行的精确十进制运算对于稳健的科学和金融代码至关重要。
- 更广泛的 Python 数值生态系统,特别是 NumPy,通过固定宽度整数和高性能数组扩展了核心类型,以进行大量计算。

无论你是编写简单的脚本、处理科学数据还是设计算法原型,处理数字都是大多数 Python 程序的核心。理解 Python 如何表示和操作数值是编写可靠、高效且符合预期行为的代码的第一步。
人们谈到“数值型Python”时,通常指的是两件事。一方面,有内置的数字类型和标准库工具,例如 math, cmath, decimal, random 和 numbers另一方面,还有围绕数值计算的更广泛的生态系统,例如 NumPy 等库,它们通过额外的数值类型和向量化运算扩展了语言的功能。本指南将带您详细了解这些基础知识,从基本类型到高级抽象。
Python 中的核心数值类型
Python 定义了几个内置的数值类型,涵盖了大多数日常需求:整数用于表示整数值,浮点数用于表示带小数的实数,复数用于表示包含实部和虚部的值,以及一种特殊的布尔类型,它类似于一个非常小的整数类型。所有这些类型都能与 Python 的算术运算符无缝集成。
整数(int) 表示整数,正数或负数,不带小数点在标准 Python 中,整数的大小没有固定上限;只要内存足够,整数就可以增长。例如: 1, -5 or 20234567890123456789 都是有效的 int 例如,你可以通过以下方式确认这一点: type(1) or type(-5)这将返回 <class 'int'>.
浮点数(float) 用于带有小数部分的实数它们用小数点表示,例如: 2.0, -7.823457 or 0.5或者用科学计数法表示,例如 1e8 (这意味着 100,000,000 亿)。当您执行除法等运算时,即使是整数之间的运算,Python 也经常将结果提升为整数。 float; 例如, 9 / 2 产量 4.5和 type(4.5) is <class 'float'>.
复数(complex将实部和虚部结合起来写成带尾随 j 对于虚数单位。一个类似这样的值 2 + 3j 它有2个实部和3个虚部。你可以直接构造它们(例如)。 3.14j)并使用诸如以下属性检查它们: .real 和 .imag或者打电话 .conjugate() 得到复共轭物。这些方法在工程、信号处理和科学计算领域尤其常用。
布尔值(bool)从技术上讲也是数值型的因为 True 和 False 在算术表达式中,它们的行为类似于整数 1 和 0。例如: True + 2 评估为 3。 在内部, bool 是的子类 int这就是为什么布尔值可以无缝集成到计算和比较中的原因。
Python 允许你在表达式中自由混合使用这些数值类型。必要时升级为更通用的类型。添加一个 int 到 float 产生一个 float将浮点数与复数结合会产生复杂的结果:例如这样的表达式 1 + 1.0, 2.0 + (3 + 5j) or 6 / (5 + 8j) 所有工作都无需额外仪式。

算术运算符和除法行为
有了数值之后,就可以使用常用的算术运算符来对它们进行运算。: 添加 (+),减法(-),乘法(*), 分配 (/),楼层分隔(//),指数(**)和模(%Python 会将这些规则应用于整数、浮点数和复数,并根据需要执行类型提升。
分割是Python设计中非常注重细节的一个方面。。 运用 / 当两个参数均为数值型时,即使它们都是整数,也总是返回浮点数结果。 9 / 2 结果 4.5,不 4这会促使你默认地以实数除法来思考,这通常是你在科学或金融计算中想要的。
如果需要进行舍弃小数部分的整数除法,可以使用向下取整运算符。 //。 例如, 9 // 2 产生 4和 -9 // 2 产量 -5因为结果向下取整(向负无穷方向取整)。此外, divmod(a, b) 一次性给出商和余数,返回一个反映商和余数的对。 (a // b, a % b).
在幕后,Python 精心协调不同数值类型之间的交互方式。标准库中一个常见的内部模式是“运算符回退”的概念:函数首先尝试使用特定类型的实现(例如,对于有理数),如果其中一个操作数是常规类型,则回退到内置运算符。 int, float or complex这使得自定义数值类型能够使用特殊方法与 Python 的算术系统进行交互,例如 __add__ 和 __radd__.
用于有理算术的库代码,例如 Fraction 类型,清晰地说明了这种策略当添加两个 Fraction 例如,它会通过交叉相乘分子和分母来计算一个新的分数。如果你添加一个 Fraction 转换为普通整数或实例 numbers.Rational它使用精确的理性算法。如果另一个操作数是a float or complex它将转换为更广泛的类型并委托给常规运算符,从而保持行为的一致性和直观性。
内置数值函数
除了原始运算符之外,Python 还提供了一系列内置函数来处理数字。这些函数无需导入任何库即可直接使用,并且适用于标准数值类型,以及任何实现了相应特殊方法的自定义对象。
abs(x) 返回其参数的绝对值将负数变为正数,正数保持不变。如果您传入一个定义对象。 __abs__()Python 会将任务委托给该方法。对于复数, abs() 返回模(复平面上到原点的距离)。
round(x, ndigits) 给出四舍五入到指定小数位数的值。 如果 ndigits 被省略或 None它返回最接近的整数。与教科书中的“向上取整”规则不同,Python 内置的 `________` 函数不会返回整数。 round 对于平局,采用“四舍五入到均等”策略,以减少重复计算中的统计偏差。
转换函数 int() 和 float() 利用其他对象构造数字呼叫 int(x) 对浮点数进行运算时会舍弃小数部分(例如, int(1.9) is 1), float(x) 从整数、字符串或兼容对象生成浮点数表示。从浮点数转换为整数时,不会进行舍入;小数部分会被截断。
其他内置函数则用于表示和聚合角色。. 功能如下 hex() 和 oct() 返回以十六进制或八进制表示的整数字符串,并带有适当的前缀(0x 和 0o聚合辅助工具,例如 max() 和 min() 扫描可迭代对象或一系列参数以查找最大值或最小值,而 pow() 和 ** 运算符计算幂,并可选择性地接受第三个参数进行模幂运算。
高级数值工具:math、cmath 和 decimal
对于更复杂的计算,Python 提供了专门的标准库模块。 而不是使核心语言臃肿。对于数值计算而言,最重要的功能是: math, cmath 和 decimal每个方案都针对特定问题子集。
此 math 本模块侧重于实值浮点数学。导入后 import math您将获得工程、物理和日常分析中常用的函数和常量,所有这些都以高效的 C 代码实现,并可在……上运行。 float 值。
math 包括数论和表示工具 如 math.ceil() 向上取整到最接近的整数, math.floor() 向下取整时, math.modf() 将浮点数拆分为小数部分和整数部分,以及 math.frexp() / math.ldexp() 用于处理内部二进制表示。它还提供诸如幂运算和对数运算之类的例程。 math.exp(), math.log(), math.log10(), math.pow() 和 math.sqrt()以及三角函数和双曲函数,例如 math.sin(), math.cos(), math.tan(), math.asin(), math.acos(), math.atan(), math.atan2(), math.sinh(), math.cosh() 和 math.tanh().
为了方便, math 导出基本常数,例如 math.pi 和 math.e当你计算面积、角度或指数增长,并且希望在整个代码库中获得一致且精确的值时,这些功能就非常有用。
当你需要处理复数时, cmath 模在复平面中扮演着相同的角色。它的 API 镜像 math 但它使用复杂的参数并返回复杂的结果,因此您可以计算复杂的指数、对数和三角函数,而无需手动将数字分解为实部和虚部。
此 decimal 该模块针对的是另一个痛点:精确的十进制算术标准二进制浮点数无法精确表示许多小数位,因此诸如此类的计算会受到影响。 0.1 + 0.2 结果略有偏差。 decimal.Decimal 它通过使用任意精度的十进制算术来规避这个问题,使其成为金融应用以及任何需要严格控制舍入行为的场合的理想选择。
默认情况下,Python 的浮点运算遵循 IEEE-754 标准,并使用二进制表示法。当一个值恰好位于两个可表示数字的中间时,应用“四舍五入到偶数”规则,这意味着一半的偶数向下取整,一半向上取整。这可以避免大规模计算中的系统性偏差。如果您需要商业用途的“向上取整到偶数”语义,可以进行配置。 decimal 使用的背景 ROUND_HALF_UP总是使 5 的值远离零。
实际处理数值类型
探索数字的交互行为是培养直觉的绝佳方法。启动 Python 解释器,创建整数、浮点数和复数的组合,然后尝试对它们进行基本运算。加法和乘法很简单,但尝试除法、向下取整、四舍五入和类型转换尤其有启发意义,观察结果类型的变化。
为了满足 API 的预期或简化逻辑,有时需要在数值类型之间进行转换。如果你有一个浮点数,并且只想提取它的整数部分,可以将其赋值给一个变量,例如: my_float = 1.9 然后打电话 my_int = int(my_float)。 印刷 my_int 给 1和 type(my_int) 证实它是一个 int请注意,小数部分将被舍弃,而不是四舍五入。
反向操作——提升为更通用的类型——通常是隐式发生的。当你将一个整数和一个浮点数相加时,Python 会直接返回一个浮点数,因为实数系统包含了整数。同样的提升也发生在将一个浮点数和一个复数相加时:浮点数被视为虚部为零,结果为复数。
复数包含一些内置的便利功能,使它们用起来感觉很自然。您可以直接查看 a.real 和 a.imag 要获取组件,请调用 a.conjugate() 将虚部的符号取反,并将它们传递给函数。 cmath 无需手动转换。即使您很少使用它们,了解它们的存在及其工作原理也有助于您在遇到科学计算代码时获得帮助。
处理浮点数据时,准确性和精确度始终至关重要。标准 Python 的有效精度 float 大约是 15 位小数;超过 15 位,第 16 位数字可能不可靠。对于许多任务来说,这完全可以接受,但如果您需要精确的十进制运算或更可预测的舍入结果,那么 decimal 该模块可以提供您所需的控制功能,但会牺牲一些性能。
随机数和特殊数值
在Python数值工作流程中,生成随机数是另一个常见的任务。无论您是构建简单的游戏、运行蒙特卡洛模拟,还是编写测试用例来检验边界条件,标准库都能满足您的需求。 random 该模块为此类场景提供了基础知识。
random.randint(a, b) 生成一个介于 0 到 10 之间的伪随机整数。 a 和 b, 包括的这使得模拟掷骰子或在列表中选择随机索引变得容易。对于浮点值,可以使用类似这样的函数。 random.random() 以及相关的辅助函数会生成 [0.0, 1.0] 等范围内的均匀随机数,以便根据您的特定分布进行缩放或转换。
Python 还公开了一些数值,这些数值代表不寻常的或“极端情况”的数量。其中之一是 NaN(“非数字”),例如可以通过调用以下函数获得: float('nan').NaN 表示未定义或无法表示的结果,例如零除以零的结果,或者从输入数据中解析损坏的数字字段的结果。
除了 NaN 之外,Python 还支持正无穷大和负无穷大。用……构建 float('inf') 和 float('-inf')这些值在初始化用于搜索最小值或最大值的算法的变量时,或者在数值方法中对无界范围进行建模时,可用作哨兵值。
处理 NaN 值需要格外小心,因为它们的行为与普通数字不同。涉及 NaN 的比较结果始终为假(即使 nan == nan),并且对 NaN 进行算术运算时,NaN 往往会传递到结果中。虽然本指南不会深入探讨 NaN 的语义,但了解其特性有助于更有效地调试数据管道和数值算法。
使用 numbers 模块抽象数字层次结构
随着代码变得越来越复杂,您可能需要一种灵活的方法来识别“数值”。 无需手动检查每一种具体类型(例如 int, float, complex 以及 NumPy 标量)。这就是…… numbers 引入该模块,提供数值类型的抽象层次结构。
此 numbers 该模块定义了描述数值行为的抽象基类(ABC)。,如 Number, Complex, Real, Rational 和 Integral这些类不应该被直接实例化。相反,具体的数值类型会继承它们,以表明它们实现了所需的操作和属性。
最通用的ABC是 numbers.Number代表“任何数值类型”如果您想测试一个变量是否应该被视为数值型变量(例如在调试期间或编写小型实用程序脚本时),您可以结合使用以下方法: isinstance 以这套ABC为例。例如: isinstance(x, Number) 回报 True 适用于内置数值类型和许多外部数值类型,例如各种 NumPy 标量。
一个实际的例子是将 NumPy 类型与 Python 的内置函数结合起来使用。如果你导入 NumPy 作为 np 然后遍历类似这样的值 1, 1., -0.2, 1e8, np.int64(1), np.int0(10), np.int16(2), np.float64(10), np.complex64(10) 和 np.int32(89), isinstance(value, Number) 对于每个对象,你会发现它们都被归类为数值型。这样就省去了为每个特定类编写冗长的类型检查代码。
值得一提的是 isinstance 过度使用本身就被认为是一种代码“异味”。过度依赖显式类型检查可能会暴露面向对象程序中更深层次的设计问题。也就是说,对于快速调试、探索性脚本或小型实用程序,检查类型检查是必要的。 numbers.Number 是一个强大而实用的工具,可以验证你的变量是否真的像数字一样运作。
扩展的数值生态系统:NumPy 和自定义类型
尽管 Python 核心库只提供了一小部分通用数值类型,但更广泛的生态系统极大地扩展了你的选择。特别是 NumPy,它引入了更多专为高效处理大型数组和矩阵而设计的数值类型。
NumPy 定义了固定宽度整数类型,例如 numpy.int64, numpy.int32, numpy.int16 以及诸如 numpy.int0这些类型类似于 Fortran 和 C 等低级数值语言中的类型,在这些语言中,了解数字的确切存储大小和行为对于性能和互操作性至关重要。
除了整数之外,NumPy 还提供如下类型: numpy.float64 和 numpy.complex64以及许多其他类型,它们可以与数组和通用函数 (ufunc) 完美集成。这些类型通常会注册为相应 ABC 的实例。 numbers 模块,这就是为什么要检查它 numbers.Number 如前所述,工作方式如下。
Python 的设计初衷是保持核心数值模型的简洁性和易用性。它并没有强迫每个用户管理数十种不同的数值类型,而是专注于三种基本数值类型(加上布尔值),同时又方便专业库根据需要扩展这些类型。像仿真软件公司构建的工程环境,自然会大量依赖这些扩展类型和库。
如果你按照以下模式构建自己的数值类: numbers 和 fractions 帮助你融入生态系统通过继承适当的 ABC 类并实现所需的特殊方法(__add__, __radd__, __mul__等等),您的自定义类型可以与 Python 的运算符、内置数值函数和其他数值库自然地交互。
总而言之,Python 的数值计算部分结合了清晰的核心类型系统、强大的标准库模块以及丰富的库生态系统(例如 NumPy),从而创建了一个可以轻松应对从简单算术到高级工程计算的环境。一旦你理解了整数、浮点数、复数、特殊值、舍入规则和抽象数值类之间的相互关系,你就能更自信地理解你的代码,避免难以察觉的错误,并为遇到的每个数值任务选择合适的工具。