教程建议 35 分钟学习等级 3/8

PYTHON LESSON 033

进制转换器

理解进位制的原理,学会用 bin/oct/hex 和 int(x, base) 在进制之间自由转换。

00 · 学习目标

这一课要解决什么?

先想一想计算机里的 26 和人眼里的 26,为什么长得完全不一样?
完成任务万能进制转换器
学习顺序定义 → 语法 → 最小实例 → 独立练习

学完后,你应该能够

  • bin() / oct() / hex() 转成二/八/十六进制
  • int("11010", 2) 从指定进制读回十进制
  • 0b / 0o / 0x 是进制的“身份前缀”

01 · 核心概念

二/八/十六进制与数据编码

二/八/十六进制与数据编码:十进制逢十进一,每位用 0~9;二进制逢二进一,每位只用 0 和 1——这正是计算机电路“开/关”的天然语言。八进制用 0~7,十六进制用 0~9 加 A~F(A 表示 10,F 表示 15)。

考级对应GESP Python 3 级 · 进制转换GESP Python 3 级 · 数据编码
学习边界

浮点数遵循 IEEE 754 的实现细节,不使用本章的普通整数进制模型直接推导。

02 · 语法与规则

先记住这 3 条,再开始写程序

01bin() / oct() / hex() 转成二/八/十六进制

先准确读出这条写法的结构与作用。

02int("11010", 2) 从指定进制读回十进制

换一组最小数据,手工推演一次结果。

030b / 0o / 0x 是进制的“身份前缀”

再用边界值或反例确认它的适用条件。

03 · 完整实例

代码、运行结果和解释放在一起看

number-base-converter.pyPYTHON 3.12
# 进制转换器:计算机的数字语言
n = 26

print("十进制:", n)
print("二进制:", bin(n))
print("八进制:", oct(n))
print("十六进制:", hex(n))

# 反过来:把各种进制读回十进制
print("二进制 11010 是十进制的", int("11010", 2))
print("十六进制 1a 是十进制的", int("1a", 16))

# 手工验证:26 = 16 + 8 + 2,所以二进制是 11010
print("验证:16 + 8 + 2 =", 16 + 8 + 2)
运行结果OUTPUT
十进制: 26
二进制: 0b11010
八进制: 0o32
十六进制: 0x1a
二进制 11010 是十进制的 26
十六进制 1a 是十进制的 26
验证:16 + 8 + 2 = 26

bin/oct/hex 的结果都是带前缀的字符串;int(x, base) 的第二个参数是进制。

在新标签运行和修改这个实例已装入本课代码 · 可自定义输入 · 可提交判题

04 · 逐步理解

每一步只解决一个问题

  1. 01

    什么是进位制

    十进制逢十进一,每位用 0~9;二进制逢二进一,每位只用 0 和 1——这正是计算机电路“开/关”的天然语言。八进制用 0~7,十六进制用 0~9 加 A~F(A 表示 10,F 表示 15)。

  2. 02

    位权:每个位置值多少钱

    二进制 11010 从右往左的位权是 1、2、4、8、16:1×16 + 1×8 + 0×4 + 1×2 + 0×1 = 26。任何进制转十进制都是“每位数字 × 位权再相加”,学会这一招,手算也不慌。

    PYTHON
    print(1 * 16 + 1 * 8 + 0 * 4 + 1 * 2 + 0 * 1)
  3. 03

    bin / oct / hex 一键转换

    Python 内置三个转换函数:bin(26) 得 '0b11010',oct(26) 得 '0o32',hex(26) 得 '0x1a'。注意结果是字符串,开头的 0b、0o、0x 是“身份牌”,说明这是哪种进制。

    PYTHON
    print(bin(26), oct(26), hex(26))
  4. 04

    int 的第二项技能

    int(x, base) 能把 base 进制的字符串读回十进制:int("11010", 2) 得 26,int("1a", 16) 也得 26。一个函数搞定所有进制的“回家”问题。

    PYTHON
    print(int("11010", 2))
    print(int("ff", 16))
  5. 05

    负数的编码:原码、反码与补码

    计算机存负数时,先写出它绝对值的二进制(原码),把 0 和 1 全部翻转(反码),再加 1(补码)。补码的妙处是:加减法可以用同一套电路完成。这是三级考试的常识考点,记住“取反加一”四个字即可。

  6. 06

    做个进制小测验

    先心算:十进制 10 的二进制是什么?八进制 10 又是十进制的几?再用程序验证答案。注意区分“八进制的 10”(等于 8)和“十进制的 10”——进制不同,面貌全非。

    PYTHON
    print(bin(10), int("10", 8))

05 · 练习与检验

自己写出来,才算真正学会

本课实作步骤
  1. 1运行程序,观察 26 的四种形态
  2. 2把自己的年龄转成二进制
  3. 3用 int() 验证二进制 1010 是不是 10
  4. 4试试 int("ff", 16) 等于多少
打开本课编程实验室编辑、运行、测试、判题都在一个页面完成

06 · 完整知识

继续理解定义、规则和适用边界

第一次学习先完成上面的六个步骤;需要查定义、核对规则、分析误区或理解“为什么”时,再展开对应知识章。

计算机基础进制、整数表示与位运算从位权理解二、八、十六进制,准确使用补码模型、移位、掩码和 Python 大整数。

正式定义

b 进制数按位权 b⁰、b¹…表示数值。进制只是同一个整数的书写方式;位运算直接处理整数的二进制位。Python 整数精度只受可用内存限制,负数位运算按无限长二进制补码语义定义。

必须掌握

  • bin/oct/hex 生成带前缀字符串,int(text, base) 按指定进制解析;0b、0o、0x 是整数字面量前缀。
  • 手工转十进制用位权展开,十进制转其他进制可连续除基取余并逆序。
  • & 取共同为 1 的位,| 合并置位,^ 标记不同位,~x 等于 -x-1。
  • x << k 相当于 x * 2**k;对非负整数 x >> k 相当于 x // 2**k。
  • 掩码可检测、设置、清除或翻转特定位;位编号通常从最低位 0 开始。
  • 固定字长语言的溢出和 Python 大整数行为不同,题目必须明确字长和有无符号。

常见误区

  • 把进制字符串当成不同数值类型
  • 忘记位编号从 0 开始
  • 照搬固定 32 位溢出结论到 Python
  • 对负数右移套用无符号模型

适用边界

  • 浮点数遵循 IEEE 754 的实现细节,不使用本章的普通整数进制模型直接推导。
  • 字符编码把字符映射到整数,但编码知识与整数进制书写是两个不同层次。
打开本章完整示例与独立阅读页 →
编码与文本字符串、转义、切片与格式化从不可变字符序列到检索、拆分、拼接、格式化和常用判断方法。

正式定义

str 是不可变的 Unicode 字符序列。下标访问单个字符,切片生成新字符串;任何看似“修改字符串”的方法都会返回新对象。

必须掌握

  • 下标从 0 开始,负下标从末尾开始;切片 s[start:stop:step] 不包含 stop,step 不能为 0。
  • 转义序列用于在字面量中表示换行、制表、引号、反斜杠或码点;原始字符串仍有末尾反斜杠限制。
  • find 找不到返回 -1,index 找不到抛 ValueError;count 统计不重叠出现次数。
  • split 把字符串拆成列表,join 用一个字符串连接可迭代对象中的字符串,strip 只删除两端字符。
  • f-string 的格式说明可控制宽度、对齐、精度、进制和百分比;格式化不改变原值。
  • isalpha/isdigit 等按 Unicode 定义,不只识别英文字母和 ASCII 数字。

常见误区

  • 尝试 s[0] = 'A' 原地修改字符串
  • 把 strip('ab') 误解为删除完整子串 'ab'
  • find 返回 -1 后直接拿去当有效下标
  • 把字节长度与字符长度混为一谈

适用边界

  • 正则表达式不在低等级字符串必修范围,但复杂模式匹配时应使用 re,而不是堆叠大量 split/find。
  • 面向用户的字符计数还可能涉及组合字符和字素簇,len 统计的是 Unicode 码点序列长度。
打开本章完整示例与独立阅读页 →
编码与文本ASCII、Unicode 与字符编码完整表完整查阅标准 ASCII 0–127,并理解 Unicode、编码方案与 Python 字符串之间的关系。

正式定义

标准 ASCII 是 7 位字符编码,只定义十进制 0–127:0–31 与 127 是控制字符,32 是空格,33–126 是可打印字符。Unicode 为字符分配码点,UTF-8/UTF-16 是把码点编码成字节的方案;Unicode 的前 128 个码点与 ASCII 一致。

必须掌握

  • 数字字符 '0'–'9' 是 48–57,大写字母 'A'–'Z' 是 65–90,小写字母 'a'–'z' 是 97–122。
  • ord(ch) 返回单个 Unicode 字符的码点;chr(n) 返回对应码点的字符,它们不限于 ASCII。
  • 字符串比较按 Unicode 码点逐项进行;大小写转换应优先使用 lower()/upper(),不要把“相差 32”推广到所有文字。
  • str 是字符序列,bytes 是 0–255 的字节序列;encode() 从文字得到字节,decode() 从字节恢复文字。
  • 所谓“扩展 ASCII”没有唯一标准,128–255 的含义取决于代码页,不能当成标准 ASCII 表的一部分。
  • 换行符 LF 是 10,回车符 CR 是 13;Windows 文本常见 CRLF,跨平台读写要让文本模式正确处理。

常见误区

  • 把 ASCII 说成所有字符的统一编号
  • 认为 ord() 只能处理 ASCII
  • 把字符个数等同于 UTF-8 字节数
  • 把某个代码页的 128–255 当成统一的扩展 ASCII

适用边界

  • 本页给出完整标准 ASCII 0–127;Unicode 有十多万个已分配字符,不适合平铺成一张儿童课程长表,应按码点和字符数据库检索。
  • “扩展 ASCII”没有唯一标准,128–255 的解释必须同时注明代码页;字符显示还依赖字体,有合法码点也不等于当前字体一定有对应字形。
打开本章完整示例与独立阅读页 →
工程能力异常、文件、测试与调试读懂报错、缩小问题、设计测试,并安全地打开、读取和关闭文本文件。

正式定义

异常是在运行期间表示错误或特殊情况的对象。调试是用可复现输入和证据定位实际行为与预期行为差异的过程;文件对象连接程序与持久化字节数据。

必须掌握

  • 先读 traceback 最后一行的异常类型与消息,再从最靠近自己代码的栈帧向上追踪。
  • try 只包可能失败的最小代码;except 捕获具体异常;else 处理成功路径;finally 做必需清理。
  • raise 主动报告不满足的前置条件;assert 用于开发期内部假设,不用于校验不可信用户输入。
  • with open(...) as file 会在退出代码块时可靠关闭文件。文本模式必须明确编码,本站统一推荐 encoding='utf-8'。
  • 测试至少包含正常值、边界值、空数据、极端值和反例;每个测试只应有明确目的。
  • 定位错误时一次只改一个假设,保留能稳定复现问题的最小输入。

常见误区

  • 使用 except: 吞掉所有错误
  • 只测题目样例就认为程序正确
  • 文本文件不写 encoding
  • 修复报错表象却不验证根因

适用边界

  • 在线判题的学生代码由独立 Worker 执行;文件系统、网络和资源权限必须受平台限制。
  • 二进制文件、JSON/CSV 和数据库各有专门格式与错误处理方式,不能按普通文本随意拆分。
打开本章完整示例与独立阅读页 →

完成检查

确认自己会解释、会编写、会验证