Files

6.5 KiB
Raw Permalink Blame History

doc_type, full_text
doc_type full_text
short sources/03_Numbers.md

03_Numbers 总结

本文是 Practical Python 第 1.3 节,围绕 Python 中的数字计算展开,介绍数字类型、常见算术与比较运算、类型转换,并通过按揭贷款程序练习巩固循环、累计和数值计算。

核心内容

Python 的四类数字

Python 主要有四种数字相关类型:

  • 布尔值 bool
  • 整数 int
  • 浮点数 float
  • 复数 complex

本节重点讲解前三类。

布尔值 bool

布尔值只有两个取值:

a = True
b = False

在数值上下文中,True 会被当作 1,False 会被当作 0:

c = 4 + True   # 5
d = False
if d == 0:
    print('d is False')

但文档特别提醒:虽然布尔值可以像整数一样参与计算,但不推荐写这种代码,因为可读性较差。相关主题可整理为 Python布尔值 和 Python数字类型。

整数 int

Python 整数支持任意大小的有符号值,并支持多种进制写法:

a = 37
b = -299392993727716627377128481812241231
c = 0x7fa8      # 十六进制
d = 0o253       # 八进制
e = 0b10001111  # 二进制

常见整数运算包括:

  • 加减乘除:+、-、*、/
  • 整除://
  • 取模:%
  • 幂运算:**
  • 位运算:<<、>>、&、|、^、~
  • 绝对值:abs(x)

需要注意:普通除法 / 总是产生浮点数;整除 // 会执行向下取整除法。相关主题可归入 Python运算符 和 Python整数。

浮点数 float

浮点数可以使用小数或科学计数法表示:

a = 37.45
b = 4e5        # 400000.0
c = -1.345e-10

Python 浮点数使用底层 CPU 的双精度 IEEE 754 表示方式,与 C 语言中的 double 类似:

  • 大约 17 位精度
  • 指数范围约为 -308 到 308

浮点数是不精确的

文档强调,浮点数表示十进制小数时可能不精确:

>>> a = 2.1 + 4.2
>>> a == 6.3
False
>>> a
6.300000000000001

这不是 Python 特有的问题,而是底层浮点硬件表示方式导致的。这个主题适合扩展为 concepts/浮点数精度。

浮点数支持的常见运算与整数类似,但不包括位运算:

  • +、-、*、/
  • //
  • %
  • **
  • abs(x)

更多数学函数位于 math 模块中:

import math
math.sqrt(x)
math.sin(x)
math.cos(x)
math.tan(x)
math.log(x)

相关主题可链接到 Python标准库math模块。

数字比较与布尔表达式

数字支持常见关系运算符:

x < y
x <= y
x > y
x >= y
x == y
x != y

可以使用逻辑运算符组合复杂条件:

  • and
  • or
  • not

示例:

if b >= a and b <= c:
    print('b is between a and c')

if not (b < a or b > c):
    print('b is still between a and c')

这部分与 Python条件判断、布尔表达式 和 Python比较运算 相关。

数字类型转换

可以使用类型名进行转换:

a = int(x)
b = float(x)

示例:

>>> a = 3.14159
>>> int(a)
3
>>> b = '3.14159'
>>> float(b)
3.14159

int() 会将浮点数截断为整数;float() 可以将包含合法数字格式的字符串转换为浮点数。相关主题可整理为 Python类型转换。

练习:按揭贷款计算

本节练习围绕 mortgage.py 展开,通过一个 30 年固定利率按揭贷款案例练习数值计算。

初始条件:

  • 本金:500000.0
  • 年利率:0.05
  • 月供:2684.11
  • 每月按 rate / 12 计息

基础程序:

principal = 500000.0
rate = 0.05
payment = 2684.11
total_paid = 0.0

while principal > 0:
    principal = principal * (1+rate/12) - payment
    total_paid = total_paid + payment

print('Total paid', total_paid)

运行结果应为总支付金额 966,279.6。

这个例子体现了 Python循环、累计计算 和 金融计算。

Exercise 1.8:额外还款

假设 Dave 在前 12 个月每月额外还款 $1000,需要修改程序:

  • 计算新的总支付金额
  • 计算还清贷款所需月份数

期望结果:

  • 总支付:929,965.62
  • 月数:342

Exercise 1.9:通用额外还款计算器

进一步将额外还款参数化:

extra_payment_start_month = 61
extra_payment_end_month = 108
extra_payment = 1000

程序需要根据这些变量决定哪些月份额外还款。问题是:如果 Dave 在还款五年后开始,连续四年每月额外还 $1000,最终需要支付多少?

这体现了将硬编码逻辑改造成可配置程序的思想,可链接到 参数化程序设计。

Exercise 1.10:输出还款表

要求程序输出每个月的:

  • 月份
  • 累计支付金额
  • 剩余本金

示例输出:

1 2684.11 499399.22
2 5368.22 498795.94
...
310 880074.1 -1871.53
Total paid 880074.1
Months 310

这个练习强化了循环中的状态更新与格式化输出,可关联 表格输出 和 Python循环。

Exercise 1.11:修正最后一个月的多付问题

在贷款最后一个月,固定月供可能超过剩余本金加当月利息,导致程序显示负本金。练习要求修正这个“最后一月多付”的问题,使总支付金额更准确。

这一点与金融计算中的边界条件处理相关,可归入 边界条件。

Exercise 1.12:bool("False") 的谜题

文档最后提出问题:

>>> bool("False")
True

虽然字符串内容是 "False",但它是一个非空字符串,因此转换为布尔值时结果为 True。这说明 bool() 判断的是对象的真值,而不是解析字符串的语义内容。

相关主题可整理为 Python真值测试 和 Python类型转换。

关键收获

  • Python 数字类型包括布尔值、整数、浮点数和复数。
  • bool 在数值上对应 1 和 0,但不应滥用于算术表达式。
  • Python 整数支持任意精度和多种进制表示。
  • / 产生浮点数,// 表示整除。
  • 浮点数基于 IEEE 754,不能精确表示所有十进制小数。
  • 数字可以使用关系运算符比较,并可用 and、or、not 组合条件。
  • int()、float()、bool() 等类型名可用于类型转换,但不同类型转换规则不同。
  • 按揭贷款练习展示了循环、累计变量、条件逻辑、参数化和边界条件处理。