Python 基本类型

Python 常用标量与文本基础:int 任意精度、float 二进制浮点、bool 是 int 子类、None 单例,以及 str 的不可变 Unicode 文本。

#type / concept #status / growing #tech / dev #resource / python #tech / lang / python

[!info] 关联笔记

Python 基本类型

这个概念为什么出现

业务字段最终要落成数字、真假、空缺与文本。Python 把最常用的“标量”做成对象:

  • int 默认任意精度,少见溢出惊喜
  • float 遵循二进制浮点,有精度坑
  • boolint 的子类(历史与兼容)
  • None 表示“没有值”的单例
  • str 是不可变 Unicode 文本

容器类型(list/dict…)建立在“对象引用”之上,但先把标量钉死。

[!abstract] 一句话理解 Python 基本业务标量以对象形式存在:int/float/bool/None/str 各有身份与规则;boolint 子类,Noneis 判断,字符串不可变。

最小可运行示例

先把示例放进业务场景,再看代码:

场景:健康打卡服务汇总一条用户上报

体态 App 上报:是否完成、年龄、体温、昵称、备注是否缺省。服务端要:

  • bool/int/float/str/None 建模
  • 打印给客服看的一行摘要
  • 演示 True 的整数算术与浮点误差意识
# health_checkin_types.py
# 业务意图:用内置标量表达一次打卡,并生成客服摘要行。
# 教学点:
# - bool 是 int 子类,True == 1;
# - None 表示“备注缺失”,与空字符串不同;
# - float 适合体温展示,但金额等不要用裸 float 累积。

def format_checkin(done: bool, age: int, temp_c: float, nickname: str, note: str | None) -> str:
    # 完成人数统计时常把 bool 当 0/1 累加——这里故意展示该特性。
    done_score = done + 0  # True -> 1, False -> 0
    note_text = note if note is not None else "(no note)"
    return (
        f"user={nickname}; age={age}; temp={temp_c}; "
        f"done={done}({done_score}); note={note_text}"
    )


def main() -> None:
    line = format_checkin(True, 18, 36.6, "gopher", None)
    print(line)
    print("True is int subclass?", issubclass(bool, int))
    # 经典浮点:0.1 + 0.2 不等于 0.3
    print("0.1 + 0.2 == 0.3?", (0.1 + 0.2) == 0.3)


if __name__ == "__main__":
    main()

建议运行:

python health_checkin_types.py

期望输出:

user=gopher; age=18; temp=36.6; done=True(1); note=(no note)
True is int subclass? True
0.1 + 0.2 == 0.3? False

结合场景再看三个关注点

  1. 缺省用 None,不要和 ""/0 混成一种“假”。
  2. bool 能参与算术,但业务代码更推荐显式 int(done) 或分支,避免可读性坑。
  3. 钱、精确小数优先 decimal.Decimal,不要用 float 累加金额。

核心概念与准确模型

类型速查

类型典型用途关键规则
int计数、ID、金额分任意精度(内存允许)
float科学量、温度二进制浮点误差
bool开关、标志True/False;是 int 子类
NoneType缺失单例 None,用 is
str文本不可变 Unicode
bytes原始字节另文展开

真值(预告)

在布尔上下文中,00.0""None、空容器为假;其它通常为真。细规则见后续 None 与真值笔记。

字符串基础

  • 字面量:单引号、双引号、三引号
  • 拼接与格式化:+、f-string
  • 不可变:.replace 返回新字符串

边界情况与反直觉行为

  1. True + True == 2 合法但少在业务中炫技。
  2. 极大 int 运算变慢,不是静默溢出。
  3. float("nan") 与自己也不相等,比较需特殊处理。

常见误区

[!warning] 常见误区:用 float 存货币 错误理解:两位小数用 float 足够。
正确模型:二进制浮点无法精确表示很多十进制小数;金额用整数分或 Decimal。

[!warning] 常见误区:用 == None 错误理解:与普通相等比较一样即可。
正确模型:惯用 is None,避免重载 __eq__ 的对象干扰。

工程实践

  • 对外 JSON 字段类型稳定;None 与缺省字段策略写清。
  • 温度/比例可用 float;账户余额不要。
  • 文本处理先明确 str vs bytes(网络与文件边界)。

本节总结

基本类型是对象模型的“原子材料”。先掌握身份、不可变与浮点边界,再进入容器与类。

自测题

  1. 为什么 note: str | None 比用空字符串表示缺失更清晰?
  2. boolint 子类带来什么好处与坏处?
参考答案
  1. 空字符串可能是合法业务值(用户清空备注);None 表达“未提供”。
  2. 好处:历史兼容、可当 0/1 聚合;坏处:类型意图变模糊,易写出晦涩算术。

延伸阅读与资料来源

资料类型支撑内容
Built-in Types文档内置类型行为
Tutorial – Numbers教程数字入门
创建于 2026/7/15 更新于 2026/7/15