PYTHON LESSON 017
字符的秘密编号
理解 ASCII 编码的思想,学会用 ord() 和 chr() 在字符与编码之间自由转换。
00 · 学习目标
这一课要解决什么?
学完后,你应该能够
- ord(字符) 查出字符的 ASCII 码
- chr(编码) 把编码变回字符
- ord(ch) + n 给字符“位移”
01 · 核心概念
ASCII 编码、ord() 与 chr()
ASCII 编码、ord() 与 chr():内存里存的全是 0 和 1,字母、汉字、表情符号都必须先编上号才能存进去。给每个字符分配一个唯一编号的方案就叫“编码”,其中最经典的一张表叫 ASCII 码表:A 是 65,a 是 97,数字 0 是 48。
GESP Python 2 级 · ASCII 编码GESP Python 2 级 · 基本数据类型本页给出完整标准 ASCII 0–127;Unicode 有十多万个已分配字符,不适合平铺成一张儿童课程长表,应按码点和字符数据库检索。
02 · 语法与规则
先记住这 3 条,再开始写程序
ord(字符) 查出字符的 ASCII 码先准确读出这条写法的结构与作用。
chr(编码) 把编码变回字符换一组最小数据,手工推演一次结果。
ord(ch) + n 给字符“位移”再用边界值或反例确认它的适用条件。
03 · 完整实例
代码、运行结果和解释放在一起看
# ASCII 密码小侦探
print("A 的 ASCII 码是", ord("A"))
print("a 的 ASCII 码是", ord("a"))
print("ASCII 码 72 和 105 是", chr(72), "和", chr(105))
# 凯撒密码:把字母往后移 3 位
ch = "K"
secret = chr(ord(ch) + 3)
print(ch, "加密后变成", secret)
# 用字符拼一面小旗
print("*" * 10)
print("*" + "我爱Python" + "*")
print("*" * 10)A 的 ASCII 码是 65 a 的 ASCII 码是 97 ASCII 码 72 和 105 是 H 和 i K 加密后变成 N ********** *我爱Python* **********
ord 与 chr 是一对互逆的转换:ord(chr(65)) 还是 65。
04 · 逐步理解
每一步只解决一个问题
- 01
计算机只认识数字
内存里存的全是 0 和 1,字母、汉字、表情符号都必须先编上号才能存进去。给每个字符分配一个唯一编号的方案就叫“编码”,其中最经典的一张表叫 ASCII 码表:A 是 65,a 是 97,数字 0 是 48。
print(ord("A")) - 02
ord:查编码
ord 是 ordinal(序号)的缩写,给它一个字符,它告诉你这个字符的编号。注意必须加引号——ord 要的是“字符”,不是变量名。
print(ord("a")) print(ord("0")) - 03
chr:变回字符
chr 和 ord 正好相反:给它一个编号,它变回对应的字符。知道 72 是 H、105 是 i,你就能用数字拼出单词——这就是最早的“密码游戏”。
print(chr(72), chr(105)) - 04
相邻字母编号相邻
ASCII 表有个好用的规律:字母按顺序编号,B 比 A 大 1,b 比 a 大 1;小写字母比对应大写字母大 32。所以“大写转小写”就是 ord(ch) + 32。
print(ord("B") - ord("A")) print(ord("a") - ord("A")) - 05
发明凯撒密码
古罗马的凯撒大帝把每个字母往后移 3 位来传递军令:A 变 D、K 变 N。用 ord 把字母变数字、加 3、再用 chr 变回来,一行代码就完成了一次加密。
secret = chr(ord("K") + 3) - 06
升级你的密码
把偏移量从 3 改成 5、7,加密结果立刻不同。想一想:如果加密 Z,加 3 之后超出了字母范围会怎样?这就是课后挑战题要解决的“绕回”问题。
05 · 练习与检验
自己写出来,才算真正学会
- 1运行程序,查出 A 和 a 的编码
- 2用 chr() 把自己的名字首字母拼出来
- 3给另一个字母做凯撒加密
- 4想想:小写字母的编码有什么规律
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 的解释必须同时注明代码页;字符显示还依赖字体,有合法码点也不等于当前字体一定有对应字形。
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 码点序列长度。
计算机基础进制、整数表示与位运算从位权理解二、八、十六进制,准确使用补码模型、移位、掩码和 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 的实现细节,不使用本章的普通整数进制模型直接推导。
- 字符编码把字符映射到整数,但编码知识与整数进制书写是两个不同层次。
完成检查