Python 3 教程

Python3 数字(Number)

在 Python 3 中,数字(Number)是不可变数据类型。Python 提供了四种数字类型,涵盖了从基础计数到复杂科学计算的方方面面。

以下是 Python 3 数字类型的全面解析:


1. 整数 (int)

在 Python 3 中,整数类型只有 int,不再有 Python 2 中的 long 类型。

  • 最大特点:Python 3 的 int 支持任意精度,它的大小仅受限于你计算机的可用内存。这意味着你可以计算几百位的超大整数而不会发生溢出。
纯文本
plaintext
# 基本整数
a = 100
b = -50

# 超大整数 (自动处理,不会溢出)
big_num = 2 ** 100  
print(big_num)  # 1267650600228229401496703205376

# 不同进制的表示法
bin_num = 0b1010   # 二进制 (以 0b 开头) -> 十进制 10
oct_num = 0o12     # 八进制 (以 0o 开头) -> 十进制 10
hex_num = 0xA      # 十六进制 (以 0x 开头) -> 十进制 10

# 进制转换函数
print(bin(10))     # '0b1010'
print(oct(10))     # '0o12'
print(hex(10))     # '0xa'

2. 浮点数 (float)

浮点数用于表示带有小数点的数字。在 Python 中,它底层对应 C 语言的双精度浮点数(double)。

纯文本
plaintext
f1 = 3.14
f2 = -0.05
f3 = 1.2e3   # 科学计数法,等同于 1.2 * 10^3 = 1200.0

⚠️ 核心避坑:浮点数精度问题

由于计算机底层使用二进制表示浮点数,某些十进制小数无法被精确的二进制小数表示,从而导致精度丢失。

纯文本
plaintext
print(0.1 + 0.2)          # 输出: 0.30000000000000004 (不是精确的 0.3!)
print(0.1 + 0.2 == 0.3)   # 输出: False

# ✅ 正确比较浮点数的方法:使用 math.isclose()
import math
print(math.isclose(0.1 + 0.2, 0.3))  # 输出: True

# ✅ 需要绝对精确的场景(如金融计算):使用 decimal 模块
from decimal import Decimal
d1 = Decimal('0.1')  # 注意:传入字符串而不是浮点数
d2 = Decimal('0.2')
print(d1 + d2)       # 输出: 0.3

特殊浮点值

纯文本
plaintext
import math
inf_val = float('inf')   # 正无穷大
neg_inf = float('-inf')  # 负无穷大
nan_val = float('nan')   # Not a Number (非数字)

print(math.isinf(inf_val))  # True
print(math.isnan(nan_val))  # True

3. 复数 (complex)

复数由实部和虚部组成,在 Python 中虚数单位用 jJ 表示(而不是数学中的 i,以避免与变量 i 混淆)。

纯文本
plaintext
c1 = 3 + 4j
c2 = complex(3, 4)  # 使用 complex() 函数创建

# 获取实部和虚部
print(c1.real)  # 3.0 (注意返回的是浮点数)
print(c1.imag)  # 4.0

# 获取共轭复数 (实部相同,虚部符号相反)
print(c1.conjugate())  # (3-4j)

# 复数运算
c3 = (1 + 2j) + (3 + 4j)  # (4+6j)
c4 = (1 + 2j) * (3 + 4j)  # (-5+10j)

4. 布尔值 (bool)

布尔值是整数的子类True 等价于 1False 等价于 0

纯文本
plaintext
print(issubclass(bool, int))  # 输出: True (bool 确实是 int 的子类)

print(True + True)   # 输出: 2 (1 + 1)
print(True * 5)      # 输出: 5 (1 * 5)
print(False + 10)    # 输出: 10 (0 + 10)

# 在统计列表中 True 的个数时非常有用
my_list = [True, False, True, True, False]
print(sum(my_list))  # 输出: 3

5. 常用内置数学函数

Python 提供了一些无需导入模块即可使用的内置数学函数:

纯文本
plaintext
x = -3.14159

print(abs(x))       # 3.14159 (绝对值)
print(round(x, 2))  # -3.14 (四舍五入到小数点后 2 位)
print(round(x))     # -3 (四舍五入到整数。注意:Python 3 使用“银行家舍入法”,即四舍六入五成双)

print(max(1, 5, 3)) # 5 (最大值)
print(min(1, 5, 3)) # 1 (最小值)
print(pow(2, 3))    # 8 (2 的 3 次方,等同于 2 ** 3)
print(pow(2, 3, 3)) # 2 (2 的 3 次方,再对 3 取模,即 8 % 3)

# divmod: 同时返回商和余数
quotient, remainder = divmod(10, 3)
print(quotient, remainder)  # 3 1

6. math 模块 (高级数学运算)

对于更复杂的数学运算(如三角函数、对数、阶乘等),需要导入内置的 math 模块。

纯文本
plaintext
import math

# 常用常量
print(math.pi)  # 3.141592653589793
print(math.e)   # 2.718281828459045

# 取整函数
print(math.ceil(3.1))   # 4 (向上取整)
print(math.floor(3.9))  # 3 (向下取整)

# 其他常用函数
print(math.sqrt(16))    # 4.0 (平方根)
print(math.factorial(5))# 120 (阶乘: 5!)
print(math.log(100, 10))# 2.0 (以 10 为底 100 的对数)
print(math.sin(math.pi / 2)) # 1.0 (正弦函数,参数是弧度)

7. 数字的格式化输出 (f-string 进阶)

在打印数字时,使用 f-string 可以轻松实现各种格式化需求:

纯文本
plaintext
num = 1234567.89123

# 1. 千分位分隔符
print(f"{num:,}")           # 1,234,567.89123

# 2. 保留小数位数 (四舍五入)
print(f"{num:.2f}")         # 1234567.89

# 3. 百分比格式
ratio = 0.856
print(f"{ratio:.1%}")       # 85.6%

# 4. 指定宽度和对齐 (常用于打印表格)
for i in range(1, 4):
    # 宽度为 5,右对齐
    print(f"Number: {i:5d} | Square: {i**2:5d}") 
    # 输出:
    # Number:     1 | Square:     1
    # Number:     2 | Square:     4
    # Number:     3 | Square:     9

# 5. 格式化进制
val = 255
print(f"Binary: {val:b}")   # Binary: 11111111
print(f"Hex: {val:x}")      # Hex: ff
print(f"Octal: {val:o}")    # Octal: 377

💡 核心总结与避坑指南

  1. 整除 // 的陷阱//向下取整(向负无穷方向),而不是直接截断小数。
  • 7 // 3 结果是 2
  • -7 // 3 结果是 -3(因为 -2.33 向下取整是 -3),而不是 -2
  1. 浮点数比较:永远不要用 == 来比较两个浮点数,请使用 math.isclose(a, b)
  2. 大数计算:Python 原生支持大整数运算,不需要像 Java 那样使用 BigInteger 类。
  3. 类型转换int() 转换浮点数时是直接截断小数部分(向零取整),int(3.9)3int(-3.9)-3

如果你想了解 Python 中如何进行更高级的数学计算(例如使用 NumPy 进行矩阵运算),或者对 decimal 模块的精度控制有疑问,可以随时告诉我!

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注