Skip to content

Python 3 - 数字

数字是用于存储数值的基本数据类型。Python 的数字类型是不可变的(immutable),这意味着操作产生新数值时,实际上会在内存中创建一个新的数字对象。

数字对象通过简单地将数字字面量赋值给变量来创建:

count = 10 # Integer
price = 99.95 # Floating-point
complex_num = 3 + 4j # Complex number

你可以使用 del 语句删除对数字对象的引用(如果没有其他引用,则使其符合垃圾回收条件):

del price
del count, complex_num # Delete multiple variables

Python 3 支持三种不同的数值类型:

  • int (整型): 表示没有小数点的整数(正、负或零)。Python 3 中的整型具有任意精度,这意味着它们的大小可以增长到容纳任何数值,仅受可用内存限制。与 Python 2 不同,Python 3 没有单独的 long 类型。
  • float (浮点数): 表示实数,包括带小数点的数。它们也可以使用 e 或 E 表示科学记数法(例如,2.5e2 表示 2.5 x 102 = 250.0)。浮点数通常使用 IEEE 754 标准进行双精度表示,这有时会导致微小的精度误差。
  • complex (复数): 表示形式为 a + bj 的数字,其中 a(实部)和 b(虚部)是浮点数,j(或 J)表示 -1 的平方根。虚部是可选的(例如,5j)。虽然在普通编程中不太常见,但在科学和工程领域至关重要。

整数也可以用二进制 (0b)、八进制 (0o) 和十六进制 (0x) 格式表示:

binary_val = 0b1011 # Binary for 11
octal_val = 0o17 # Octal for 15
hex_val = 0xFF # Hexadecimal for 255
print(f"Binary 0b1011 is {binary_val}")
print(f"Octal 0o17 is {octal_val}")
print(f"Hex 0xFF is {hex_val}")
整型浮点数复数
100.03.14j
10015.2045.j
-786-21.99.322e-36j
03.23e+180.876j
99999999999999999-90.-0.6545+0J
0o20 # Octal 16-3.254e100(3+0j)
0x1A # Hex 267.02e-124.53e-7j

复数的组成部分可以通过属性访问:z = 3+4j; z.real 得到 3.0,z.imag 得到 4.0。

Python 在操作过程中会自动在类型之间转换数字(例如,int + float 的结果是 float)。然而,你经常需要使用内置函数显式地在类型之间进行转换:

  • int(x): 将 x 转换为整型。对于浮点数,它向零截断。对于字符串,字符串必须表示一个整数(可选地指定基数,如 int('101', 2) 用于二进制)。
  • float(x): 将 x 转换为浮点数。适用于整数和兼容的字符串。
  • complex(real [,imag]): 创建一个复数。real 可以是整型、浮点数或字符串。如果提供了 imag,则它必须是数值类型。
  • str(x): 将任何对象 x(包括数字)转换为其字符串表示形式。
#!/usr/bin/env python3
num_int = 10
num_float = 3.14
num_str_int = "100"
num_str_float = "-4.5"
print(f"float({num_int}) = {float(num_int)}")
print(f"int({num_float}) = {int(num_float)}") # Truncates
print(f"int({num_str_int}) = {int(num_str_int)}")
print(f"float({num_str_float}) = {float(num_str_float)}")
print(f"complex({num_int}) = {complex(num_int)}")
print(f"complex({num_int}, {num_float}) = {complex(num_int, num_float)}")
# Conversion errors
# int("hello") # ValueError
# int("10.5") # ValueError

Python 的 math 模块提供了访问各种数学函数的功能。你需要先 import math。

函数描述
abs(x) (内置)返回 x 的绝对值(与零的距离)。
math.ceil(x)返回 x 的上限(大于或等于 x 的最小整数)。
math.copysign(x, y)返回带有 y 符号的 x。
math.exp(x)返回 e 的 x 次方 (ex)。
math.fabs(x)返回 x 的绝对值,结果为浮点数。
math.floor(x)返回 x 的下限(小于或等于 x 的最大整数)。
math.fmod(x, y)返回 x/y 的浮点数余数。通常比 % 更适合浮点数。
math.log(x, [base])返回 x 以给定 base 为底的对数。如果省略 base,默认为自然对数(底数 e)。
math.log10(x)返回 x 以 10 为底的对数。
math.log2(x)返回 x 以 2 为底的对数。
max(a, b, ...) (内置)返回其参数中的最大值。
min(a, b, ...) (内置)返回其参数中的最小值。
math.modf(x)返回 x 的小数部分和整数部分,结果为一个元组 (frac, int)。两者与 x 具有相同的符号。整数部分以浮点数返回。
pow(x, y) (内置)返回 x 的 y 次方 (x**y)。对于整数,比 math.pow 更高效。
math.pow(x, y)返回 x 的 y 次方,结果为浮点数。
round(x [, n]) (内置)x 四舍五入到小数点后 n 位。如果省略 n,则四舍五入到最接近的整数。在平局时使用“四舍五入到偶数”策略(例如,round(2.5) 是 2,round(3.5) 是 4)。
math.sqrt(x)返回 x 的平方根(对于 x >= 0)。
math.trunc(x)返回 x 的截断整数值(移除小数部分)。

random 模块提供了生成伪随机数的函数,在模拟、游戏、测试等方面非常有用。需要 import random。

函数描述
random.choice(seq)从非空序列(列表、元组、字符串)中返回一个随机元素。
random.choices(population, k=1)从 population 中有放回地选择 k 个元素,返回一个列表。
random.randrange(start, stop [, step])从 range(start, stop, step) 中随机选择一个元素。等同于 choice(range(start, stop, step)) 但更高效。
random.randint(a, b)返回一个随机整数 N,满足 a <= N <= b。
random.random()返回一个在 [0.0, 1.0) 范围内的随机浮点数 r(包含 0.0,不包含 1.0)。
random.seed([a])初始化随机数生成器。使用相同的种子 a 可以获得可重现的随机数序列。如果未提供种子,则自动调用系统源。
random.shuffle(lst)原地随机打乱列表 lst 中元素的顺序。返回 None。
random.uniform(a, b)返回一个随机浮点数 r,满足 a <= r <= b 或 b <= r <= a。
random.sample(population, k)从 population 序列或集合中无放回地选择 k 个唯一元素,返回一个列表。

math 模块还包括标准的三角函数。角度通常以弧度为单位。

函数描述
math.acos(x)返回 x 的反余弦(弧度)。
math.asin(x)返回 x 的反正弦(弧度)。
math.atan(x)返回 x 的反正切(弧度)。
math.atan2(y, x)返回 atan(y / x)(弧度),考虑 x 和 y 的符号以确定正确的象限。
math.cos(x)返回 x 弧度的余弦。
math.hypot(x, y)返回欧几里得范数,即 sqrt(x*x + y*y)(直角三角形斜边长)。
math.sin(x)返回 x 弧度的正弦。
math.tan(x)返回 x 弧度的正切。
math.degrees(x)将角度 x 从弧度转换为度。
math.radians(x)将角度 x 从度转换为弧度。

math 模块定义了重要的数学常量:

常量描述
math.pi数学常数 pi(约 3.14159…)
math.e数学常数 e(约 2.71828…)
math.tau数学常数 tau (2 * pi,约 6.28318…)
math.inf浮点正无穷大。
math.nan浮点数 ‘非数字’ (Not a Number)。