--- doc_type: short full_text: sources/03_Numbers.md --- # 03_Numbers 总结 本文是 Practical Python 第 1.3 节,围绕 Python 中的数字计算展开,介绍数字类型、常见算术与比较运算、类型转换,并通过按揭贷款程序练习巩固循环、累计和数值计算。 ## 核心内容 ### Python 的四类数字 Python 主要有四种数字相关类型: - 布尔值 `bool` - 整数 `int` - 浮点数 `float` - 复数 `complex` 本节重点讲解前三类。 ## 布尔值 `bool` 布尔值只有两个取值: ```python a = True b = False ``` 在数值上下文中,`True` 会被当作 `1`,`False` 会被当作 `0`: ```python c = 4 + True # 5 d = False if d == 0: print('d is False') ``` 但文档特别提醒:虽然布尔值可以像整数一样参与计算,但不推荐写这种代码,因为可读性较差。相关主题可整理为 Python布尔值 和 Python数字类型。 ## 整数 `int` Python 整数支持任意大小的有符号值,并支持多种进制写法: ```python a = 37 b = -299392993727716627377128481812241231 c = 0x7fa8 # 十六进制 d = 0o253 # 八进制 e = 0b10001111 # 二进制 ``` 常见整数运算包括: - 加减乘除:`+`、`-`、`*`、`/` - 整除:`//` - 取模:`%` - 幂运算:`**` - 位运算:`<<`、`>>`、`&`、`|`、`^`、`~` - 绝对值:`abs(x)` 需要注意:普通除法 `/` 总是产生浮点数;整除 `//` 会执行向下取整除法。相关主题可归入 Python运算符 和 Python整数。 ## 浮点数 `float` 浮点数可以使用小数或科学计数法表示: ```python a = 37.45 b = 4e5 # 400000.0 c = -1.345e-10 ``` Python 浮点数使用底层 CPU 的双精度 IEEE 754 表示方式,与 C 语言中的 `double` 类似: - 大约 17 位精度 - 指数范围约为 `-308` 到 `308` ### 浮点数是不精确的 文档强调,浮点数表示十进制小数时可能不精确: ```python >>> a = 2.1 + 4.2 >>> a == 6.3 False >>> a 6.300000000000001 ``` 这不是 Python 特有的问题,而是底层浮点硬件表示方式导致的。这个主题适合扩展为 [[concepts/浮点数精度]]。 浮点数支持的常见运算与整数类似,但不包括位运算: - `+`、`-`、`*`、`/` - `//` - `%` - `**` - `abs(x)` 更多数学函数位于 `math` 模块中: ```python import math math.sqrt(x) math.sin(x) math.cos(x) math.tan(x) math.log(x) ``` 相关主题可链接到 Python标准库math模块。 ## 数字比较与布尔表达式 数字支持常见关系运算符: ```python x < y x <= y x > y x >= y x == y x != y ``` 可以使用逻辑运算符组合复杂条件: - `and` - `or` - `not` 示例: ```python 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比较运算 相关。 ## 数字类型转换 可以使用类型名进行转换: ```python a = int(x) b = float(x) ``` 示例: ```python >>> 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` 计息 基础程序: ```python 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:通用额外还款计算器 进一步将额外还款参数化: ```python extra_payment_start_month = 61 extra_payment_end_month = 108 extra_payment = 1000 ``` 程序需要根据这些变量决定哪些月份额外还款。问题是:如果 Dave 在还款五年后开始,连续四年每月额外还 `$1000`,最终需要支付多少? 这体现了将硬编码逻辑改造成可配置程序的思想,可链接到 参数化程序设计。 ### Exercise 1.10:输出还款表 要求程序输出每个月的: - 月份 - 累计支付金额 - 剩余本金 示例输出: ```text 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")` 的谜题 文档最后提出问题: ```python >>> bool("False") True ``` 虽然字符串内容是 `"False"`,但它是一个非空字符串,因此转换为布尔值时结果为 `True`。这说明 `bool()` 判断的是对象的真值,而不是解析字符串的语义内容。 相关主题可整理为 Python真值测试 和 Python类型转换。 ## 关键收获 - Python 数字类型包括布尔值、整数、浮点数和复数。 - `bool` 在数值上对应 `1` 和 `0`,但不应滥用于算术表达式。 - Python 整数支持任意精度和多种进制表示。 - `/` 产生浮点数,`//` 表示整除。 - 浮点数基于 IEEE 754,不能精确表示所有十进制小数。 - 数字可以使用关系运算符比较,并可用 `and`、`or`、`not` 组合条件。 - `int()`、`float()`、`bool()` 等类型名可用于类型转换,但不同类型转换规则不同。 - 按揭贷款练习展示了循环、累计变量、条件逻辑、参数化和边界条件处理。 ## Related Concepts - [[concepts/Python-运算符与表达式]] - [[concepts/变量与数据类型]] - [[concepts/Python-控制流与缩进]] - [[concepts/Python-交互式解释器]] - [[concepts/Python-输入输出]] - [[concepts/模块与-import]] - [[concepts/课程练习工作流]]