PYTHON LESSON 025
考点精讲:字符编码进阶营
吃透 ASCII 编码的三个高频考法:大小写相差 32、字符比较比的是编码、用 % 26 实现绕回位移。
00 · 学习目标
这一课要解决什么?
学完后,你应该能够
- chr(ord(ch) - 32) 小写转大写
- 字符比大小,比的是 ASCII 编码
- (编码 - 起点 + 位移) % 26 + 起点 实现绕回
01 · 核心概念
ASCII 编码的进阶玩法:大小写转换、字符比较与绕回加密
ASCII 编码的进阶玩法:大小写转换、字符比较与绕回加密:ASCII 表不是乱排的:大写字母从 A=65 开始连号,小写字母从 a=97 开始连号,同一个字母的小写比大写正好大 32。记住这个规律,大小写转换就是一道减法题。考试常直接问“'d' 的编码是多少”,知道 a=97 就能一路数过去。
GESP Python 2 级 · ASCII 编码GESP Python 2 级 · 数据类型转换本页给出完整标准 ASCII 0–127;Unicode 有十多万个已分配字符,不适合平铺成一张儿童课程长表,应按码点和字符数据库检索。
02 · 语法与规则
先记住这 3 条,再开始写程序
chr(ord(ch) - 32) 小写转大写先准确读出这条写法的结构与作用。
字符比大小,比的是 ASCII 编码换一组最小数据,手工推演一次结果。
(编码 - 起点 + 位移) % 26 + 起点 实现绕回再用边界值或反例确认它的适用条件。
03 · 完整实例
代码、运行结果和解释放在一起看
# ASCII 进阶训练营
ch = "g"
print(ch, "的大写是", chr(ord(ch) - 32))
# 字符可以直接比大小,比的就是编码
print("'a' < 'b' 吗?", "a" < "b")
print("'A' < 'a' 吗?", "A" < "a")
# 绕回凯撒:Z 往后移 2 位,绕回开头变成 B
ch = "Z"
shift = 2
code = (ord(ch) - ord("A") + shift) % 26 + ord("A")
print(ch, "后移", shift, "位变成", chr(code))
# 数字字符不等于数字
print("字符 '7' 的编码是", ord("7"))
print("编码 55 是字符", chr(55))
print("'7' + '8' 得到", "7" + "8")
print("7 + 8 得到", 7 + 8)g 的大写是 G 'a' < 'b' 吗? True 'A' < 'a' 吗? True Z 后移 2 位变成 B 字符 '7' 的编码是 55 编码 55 是字符 7 '7' + '8' 得到 78 7 + 8 得到 15
直接运行即可,不需要输入。Z 后移 2 位会“绕回”到字母表开头,所以变成 B。
04 · 逐步理解
每一步只解决一个问题
- 01
编码表里的邻居关系
ASCII 表不是乱排的:大写字母从 A=65 开始连号,小写字母从 a=97 开始连号,同一个字母的小写比大写正好大 32。记住这个规律,大小写转换就是一道减法题。考试常直接问“'d' 的编码是多少”,知道 a=97 就能一路数过去。
print(ord("a") - ord("A")) - 02
小写转大写的万能公式
把小写 ch 变成大写:先 ord(ch) 查出编码,减去 32,再 chr() 变回字符。反过来大写转小写就加 32。这个“ord 进、chr 出”的组合拳是二级考试的经典题型,一定要默写得出。
print(chr(ord("g") - 32)) - 03
字符也能比大小
两个字符用 < 比较时,Python 比的是它们的编码。所以 'a' < 'b' 是 True,'A' < 'a' 也是 True(65 < 97)。排序单词、判断字符落在哪个区间(比如是不是大写字母)都靠这一招。
print("A" <= "M" <= "Z") - 04
绕回加密:% 26 的魔法
Z 后移 2 位会“越界”,怎么办?先把编码减去 ord("A"),让 A 变成 0、Z 变成 25;加上位移后对 26 取余,超出的部分自动绕回开头;最后再加回 ord("A")。这就是考卷里“凯撒密码绕回”问题的标准解法。
code = (ord(ch) - ord("A") + shift) % 26 + ord("A") - 05
数字字符不是数字
字符 '7' 的编码是 55,它和数字 7 完全是两回事:"7" + "8" 是字符串拼接得 "78",7 + 8 是加法得 15。考试里最爱在这里挖坑,看到引号就要警觉:有引号是文字,没引号才是数。
print("7" + "8", 7 + 8) - 06
三个必须背下来的编码
二级考试记不住整张表没关系,背三个锚点就够:'0' 是 48、'A' 是 65、'a' 是 97。任何字符的编码都能从锚点数出来,比如 'C' = 65 + 2 = 67。考场上这能帮你省下大把时间。
05 · 练习与检验
自己写出来,才算真正学会
- 1运行程序,观察小写 g 怎么变成大写 G
- 2把 ch 换成自己名字的拼音首字母再运行
- 3把 shift 改成 5,看看 Z 绕回后变成谁
- 4说清 “7”、7 和 “7”+“8” 三者的区别
06 · 完整知识
继续理解定义、规则和适用边界
第一次学习先完成上面的六个步骤;需要查定义、核对规则、分析误区或理解“为什么”时,再展开对应知识章。
编码与文本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,跨平台读写要让文本模式正确处理。
COMPLETE LOOKUP · 0–127
标准 ASCII 完整对照表
十进制、十六进制和二进制表示的是同一个编号。控制字符没有普通可见字形,用缩写和中文功能名表示。
| 十进制 | 十六进制 | 7 位二进制 | 缩写 | 字符 | 含义 | 分类 |
|---|---|---|---|---|---|---|
0 | 0x00 | 0000000 | NUL | — | 空字符 | 控制字符 |
1 | 0x01 | 0000001 | SOH | — | 标题开始 | 控制字符 |
2 | 0x02 | 0000010 | STX | — | 正文开始 | 控制字符 |
3 | 0x03 | 0000011 | ETX | — | 正文结束 | 控制字符 |
4 | 0x04 | 0000100 | EOT | — | 传输结束 | 控制字符 |
5 | 0x05 | 0000101 | ENQ | — | 询问 | 控制字符 |
6 | 0x06 | 0000110 | ACK | — | 确认 | 控制字符 |
7 | 0x07 | 0000111 | BEL | — | 响铃 | 控制字符 |
8 | 0x08 | 0001000 | BS | — | 退格 | 控制字符 |
9 | 0x09 | 0001001 | HT | — | 水平制表 | 控制字符 |
10 | 0x0A | 0001010 | LF | — | 换行 | 控制字符 |
11 | 0x0B | 0001011 | VT | — | 垂直制表 | 控制字符 |
12 | 0x0C | 0001100 | FF | — | 换页 | 控制字符 |
13 | 0x0D | 0001101 | CR | — | 回车 | 控制字符 |
14 | 0x0E | 0001110 | SO | — | 移出 | 控制字符 |
15 | 0x0F | 0001111 | SI | — | 移入 | 控制字符 |
16 | 0x10 | 0010000 | DLE | — | 数据链路转义 | 控制字符 |
17 | 0x11 | 0010001 | DC1 | — | 设备控制 1 | 控制字符 |
18 | 0x12 | 0010010 | DC2 | — | 设备控制 2 | 控制字符 |
19 | 0x13 | 0010011 | DC3 | — | 设备控制 3 | 控制字符 |
20 | 0x14 | 0010100 | DC4 | — | 设备控制 4 | 控制字符 |
21 | 0x15 | 0010101 | NAK | — | 否定确认 | 控制字符 |
22 | 0x16 | 0010110 | SYN | — | 同步空闲 | 控制字符 |
23 | 0x17 | 0010111 | ETB | — | 传输块结束 | 控制字符 |
24 | 0x18 | 0011000 | CAN | — | 取消 | 控制字符 |
25 | 0x19 | 0011001 | EM | — | 介质结束 | 控制字符 |
26 | 0x1A | 0011010 | SUB | — | 替换 | 控制字符 |
27 | 0x1B | 0011011 | ESC | — | 转义 | 控制字符 |
28 | 0x1C | 0011100 | FS | — | 文件分隔 | 控制字符 |
29 | 0x1D | 0011101 | GS | — | 组分隔 | 控制字符 |
30 | 0x1E | 0011110 | RS | — | 记录分隔 | 控制字符 |
31 | 0x1F | 0011111 | US | — | 单元分隔 | 控制字符 |
32 | 0x20 | 0100000 | SP | ␠ | 空格 | 空白字符 |
33 | 0x21 | 0100001 | — | ! | 可打印标点或符号 | 可打印字符 |
34 | 0x22 | 0100010 | — | " | 可打印标点或符号 | 可打印字符 |
35 | 0x23 | 0100011 | — | # | 可打印标点或符号 | 可打印字符 |
36 | 0x24 | 0100100 | — | $ | 可打印标点或符号 | 可打印字符 |
37 | 0x25 | 0100101 | — | % | 可打印标点或符号 | 可打印字符 |
38 | 0x26 | 0100110 | — | & | 可打印标点或符号 | 可打印字符 |
39 | 0x27 | 0100111 | — | ' | 可打印标点或符号 | 可打印字符 |
40 | 0x28 | 0101000 | — | ( | 可打印标点或符号 | 可打印字符 |
41 | 0x29 | 0101001 | — | ) | 可打印标点或符号 | 可打印字符 |
42 | 0x2A | 0101010 | — | * | 可打印标点或符号 | 可打印字符 |
43 | 0x2B | 0101011 | — | + | 可打印标点或符号 | 可打印字符 |
44 | 0x2C | 0101100 | — | , | 可打印标点或符号 | 可打印字符 |
45 | 0x2D | 0101101 | — | - | 可打印标点或符号 | 可打印字符 |
46 | 0x2E | 0101110 | — | . | 可打印标点或符号 | 可打印字符 |
47 | 0x2F | 0101111 | — | / | 可打印标点或符号 | 可打印字符 |
48 | 0x30 | 0110000 | — | 0 | 数字 0 | 可打印字符 |
49 | 0x31 | 0110001 | — | 1 | 数字 1 | 可打印字符 |
50 | 0x32 | 0110010 | — | 2 | 数字 2 | 可打印字符 |
51 | 0x33 | 0110011 | — | 3 | 数字 3 | 可打印字符 |
52 | 0x34 | 0110100 | — | 4 | 数字 4 | 可打印字符 |
53 | 0x35 | 0110101 | — | 5 | 数字 5 | 可打印字符 |
54 | 0x36 | 0110110 | — | 6 | 数字 6 | 可打印字符 |
55 | 0x37 | 0110111 | — | 7 | 数字 7 | 可打印字符 |
56 | 0x38 | 0111000 | — | 8 | 数字 8 | 可打印字符 |
57 | 0x39 | 0111001 | — | 9 | 数字 9 | 可打印字符 |
58 | 0x3A | 0111010 | — | : | 可打印标点或符号 | 可打印字符 |
59 | 0x3B | 0111011 | — | ; | 可打印标点或符号 | 可打印字符 |
60 | 0x3C | 0111100 | — | < | 可打印标点或符号 | 可打印字符 |
61 | 0x3D | 0111101 | — | = | 可打印标点或符号 | 可打印字符 |
62 | 0x3E | 0111110 | — | > | 可打印标点或符号 | 可打印字符 |
63 | 0x3F | 0111111 | — | ? | 可打印标点或符号 | 可打印字符 |
64 | 0x40 | 1000000 | — | @ | 可打印标点或符号 | 可打印字符 |
65 | 0x41 | 1000001 | — | A | 大写字母 A | 可打印字符 |
66 | 0x42 | 1000010 | — | B | 大写字母 B | 可打印字符 |
67 | 0x43 | 1000011 | — | C | 大写字母 C | 可打印字符 |
68 | 0x44 | 1000100 | — | D | 大写字母 D | 可打印字符 |
69 | 0x45 | 1000101 | — | E | 大写字母 E | 可打印字符 |
70 | 0x46 | 1000110 | — | F | 大写字母 F | 可打印字符 |
71 | 0x47 | 1000111 | — | G | 大写字母 G | 可打印字符 |
72 | 0x48 | 1001000 | — | H | 大写字母 H | 可打印字符 |
73 | 0x49 | 1001001 | — | I | 大写字母 I | 可打印字符 |
74 | 0x4A | 1001010 | — | J | 大写字母 J | 可打印字符 |
75 | 0x4B | 1001011 | — | K | 大写字母 K | 可打印字符 |
76 | 0x4C | 1001100 | — | L | 大写字母 L | 可打印字符 |
77 | 0x4D | 1001101 | — | M | 大写字母 M | 可打印字符 |
78 | 0x4E | 1001110 | — | N | 大写字母 N | 可打印字符 |
79 | 0x4F | 1001111 | — | O | 大写字母 O | 可打印字符 |
80 | 0x50 | 1010000 | — | P | 大写字母 P | 可打印字符 |
81 | 0x51 | 1010001 | — | Q | 大写字母 Q | 可打印字符 |
82 | 0x52 | 1010010 | — | R | 大写字母 R | 可打印字符 |
83 | 0x53 | 1010011 | — | S | 大写字母 S | 可打印字符 |
84 | 0x54 | 1010100 | — | T | 大写字母 T | 可打印字符 |
85 | 0x55 | 1010101 | — | U | 大写字母 U | 可打印字符 |
86 | 0x56 | 1010110 | — | V | 大写字母 V | 可打印字符 |
87 | 0x57 | 1010111 | — | W | 大写字母 W | 可打印字符 |
88 | 0x58 | 1011000 | — | X | 大写字母 X | 可打印字符 |
89 | 0x59 | 1011001 | — | Y | 大写字母 Y | 可打印字符 |
90 | 0x5A | 1011010 | — | Z | 大写字母 Z | 可打印字符 |
91 | 0x5B | 1011011 | — | [ | 可打印标点或符号 | 可打印字符 |
92 | 0x5C | 1011100 | — | \ | 可打印标点或符号 | 可打印字符 |
93 | 0x5D | 1011101 | — | ] | 可打印标点或符号 | 可打印字符 |
94 | 0x5E | 1011110 | — | ^ | 可打印标点或符号 | 可打印字符 |
95 | 0x5F | 1011111 | — | _ | 可打印标点或符号 | 可打印字符 |
96 | 0x60 | 1100000 | — | ` | 可打印标点或符号 | 可打印字符 |
97 | 0x61 | 1100001 | — | a | 小写字母 a | 可打印字符 |
98 | 0x62 | 1100010 | — | b | 小写字母 b | 可打印字符 |
99 | 0x63 | 1100011 | — | c | 小写字母 c | 可打印字符 |
100 | 0x64 | 1100100 | — | d | 小写字母 d | 可打印字符 |
101 | 0x65 | 1100101 | — | e | 小写字母 e | 可打印字符 |
102 | 0x66 | 1100110 | — | f | 小写字母 f | 可打印字符 |
103 | 0x67 | 1100111 | — | g | 小写字母 g | 可打印字符 |
104 | 0x68 | 1101000 | — | h | 小写字母 h | 可打印字符 |
105 | 0x69 | 1101001 | — | i | 小写字母 i | 可打印字符 |
106 | 0x6A | 1101010 | — | j | 小写字母 j | 可打印字符 |
107 | 0x6B | 1101011 | — | k | 小写字母 k | 可打印字符 |
108 | 0x6C | 1101100 | — | l | 小写字母 l | 可打印字符 |
109 | 0x6D | 1101101 | — | m | 小写字母 m | 可打印字符 |
110 | 0x6E | 1101110 | — | n | 小写字母 n | 可打印字符 |
111 | 0x6F | 1101111 | — | o | 小写字母 o | 可打印字符 |
112 | 0x70 | 1110000 | — | p | 小写字母 p | 可打印字符 |
113 | 0x71 | 1110001 | — | q | 小写字母 q | 可打印字符 |
114 | 0x72 | 1110010 | — | r | 小写字母 r | 可打印字符 |
115 | 0x73 | 1110011 | — | s | 小写字母 s | 可打印字符 |
116 | 0x74 | 1110100 | — | t | 小写字母 t | 可打印字符 |
117 | 0x75 | 1110101 | — | u | 小写字母 u | 可打印字符 |
118 | 0x76 | 1110110 | — | v | 小写字母 v | 可打印字符 |
119 | 0x77 | 1110111 | — | w | 小写字母 w | 可打印字符 |
120 | 0x78 | 1111000 | — | x | 小写字母 x | 可打印字符 |
121 | 0x79 | 1111001 | — | y | 小写字母 y | 可打印字符 |
122 | 0x7A | 1111010 | — | z | 小写字母 z | 可打印字符 |
123 | 0x7B | 1111011 | — | { | 可打印标点或符号 | 可打印字符 |
124 | 0x7C | 1111100 | — | | | 可打印标点或符号 | 可打印字符 |
125 | 0x7D | 1111101 | — | } | 可打印标点或符号 | 可打印字符 |
126 | 0x7E | 1111110 | — | ~ | 可打印标点或符号 | 可打印字符 |
127 | 0x7F | 1111111 | DEL | — | 删除 | 控制字符 |
常见误区
- 把 ASCII 说成所有字符的统一编号
- 认为 ord() 只能处理 ASCII
- 把字符个数等同于 UTF-8 字节数
- 把某个代码页的 128–255 当成统一的扩展 ASCII
适用边界
- 本页给出完整标准 ASCII 0–127;Unicode 有十多万个已分配字符,不适合平铺成一张儿童课程长表,应按码点和字符数据库检索。
- “扩展 ASCII”没有唯一标准,128–255 的解释必须同时注明代码页;字符显示还依赖字体,有合法码点也不等于当前字体一定有对应字形。
算法方法算法、复杂度与解题验证把题意转成输入、状态、规则与输出,用正确性和复杂度共同评价解法。+
正式定义
算法是解决一类问题的有限、明确步骤。正确性说明算法对所有满足前置条件的输入都得到规定结果;时间和空间复杂度描述输入规模增长时资源使用的增长量级。
必须掌握
- 先明确输入规模 n、数据范围、目标和允许误差,再选择数据结构与算法。
- O(1)、O(log n)、O(n)、O(n log n)、O(n²)、O(2ⁿ) 表示增长量级,不是精确运行秒数。
- 顺序代码复杂度取较大项,嵌套循环常相乘,二分每步把范围缩小一半。
- 正确性可用循环不变量、数学归纳、交换论证、反证或状态定义来说明。
- 样例只验证少量输入;必须自己设计边界、极端、重复、有序/逆序和无解数据。
- 优化前先得到正确基线并测量瓶颈,不为小数据盲目增加复杂实现。
常见误区
- 只看样例通过就宣称正确
- 不看数据范围使用 O(n²)
- 二分区间开闭混用
- 把 O(n) 当成永远比 O(log n) 慢固定倍数
适用边界
- 复杂度隐藏常数与硬件差异,但仍是比较规模增长的核心工具。
- 考场策略、课程完成度和算法能力是不同证据,任何单项都不能保证考级通过。
Python 基础程序执行、输入输出、变量与数据类型从一条语句怎样执行开始,系统掌握 print、input、变量、对象、类型与显式转换。+
正式定义
Python 程序由语句和表达式组成,通常按从上到下的顺序执行。变量名通过赋值绑定到对象;对象有类型和值。input() 始终返回 str,是否转换成 int 或 float 必须由题意决定。
必须掌握
- print(*objects, sep=' ', end='\n') 可以控制对象之间的分隔符和末尾字符。
- input(prompt) 读取一行并去掉行末换行符,返回值一定是字符串。
- 赋值符号 = 建立或更新名字与对象的绑定;== 才是相等比较。
- 核心标量类型包括 int、float、bool、str 和 NoneType;bool 是 int 的子类,但语义上应当用于真假判断。
- int、float、str、bool 可做显式类型转换;转换可能失败,不能把任意文本直接当数字。
- 注释以 # 开始;规范的变量名应表达含义,不能使用关键字。
常见误区
- 把 input() 的结果直接与整数相加
- 混淆 = 与 ==
- 用 float 表示必须精确的十进制金额却不考虑误差
- 变量名覆盖 print、list 等内置名称
适用边界
- 课程先讲同步的文本输入输出;文件、网络、图形界面和异步输入分别在对应章节说明。
- Python 的变量没有固定类型,但对象有类型;这不等于程序可以随意混用类型。
编码与文本字符串、转义、切片与格式化从不可变字符序列到检索、拆分、拼接、格式化和常用判断方法。+
正式定义
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 码点序列长度。
完成检查