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

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 条,再开始写程序

01ord(字符) 查出字符的 ASCII 码

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

02chr(编码) 把编码变回字符

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

03ord(ch) + n 给字符“位移”

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

03 · 完整实例

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

ascii-secret-code.pyPYTHON 3.12
# 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)
运行结果OUTPUT
A 的 ASCII 码是 65
a 的 ASCII 码是 97
ASCII 码 72 和 105 是 H 和 i
K 加密后变成 N
**********
*我爱Python*
**********

ord 与 chr 是一对互逆的转换:ord(chr(65)) 还是 65。

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

04 · 逐步理解

每一步只解决一个问题

  1. 01

    计算机只认识数字

    内存里存的全是 0 和 1,字母、汉字、表情符号都必须先编上号才能存进去。给每个字符分配一个唯一编号的方案就叫“编码”,其中最经典的一张表叫 ASCII 码表:A 是 65,a 是 97,数字 0 是 48。

    PYTHON
    print(ord("A"))
  2. 02

    ord:查编码

    ord 是 ordinal(序号)的缩写,给它一个字符,它告诉你这个字符的编号。注意必须加引号——ord 要的是“字符”,不是变量名。

    PYTHON
    print(ord("a"))
    print(ord("0"))
  3. 03

    chr:变回字符

    chr 和 ord 正好相反:给它一个编号,它变回对应的字符。知道 72 是 H、105 是 i,你就能用数字拼出单词——这就是最早的“密码游戏”。

    PYTHON
    print(chr(72), chr(105))
  4. 04

    相邻字母编号相邻

    ASCII 表有个好用的规律:字母按顺序编号,B 比 A 大 1,b 比 a 大 1;小写字母比对应大写字母大 32。所以“大写转小写”就是 ord(ch) + 32。

    PYTHON
    print(ord("B") - ord("A"))
    print(ord("a") - ord("A"))
  5. 05

    发明凯撒密码

    古罗马的凯撒大帝把每个字母往后移 3 位来传递军令:A 变 D、K 变 N。用 ord 把字母变数字、加 3、再用 chr 变回来,一行代码就完成了一次加密。

    PYTHON
    secret = chr(ord("K") + 3)
  6. 06

    升级你的密码

    把偏移量从 3 改成 5、7,加密结果立刻不同。想一想:如果加密 Z,加 3 之后超出了字母范围会怎样?这就是课后挑战题要解决的“绕回”问题。

05 · 练习与检验

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

本课实作步骤
  1. 1运行程序,查出 A 和 a 的编码
  2. 2用 chr() 把自己的名字首字母拼出来
  3. 3给另一个字母做凯撒加密
  4. 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 完整对照表

十进制、十六进制和二进制表示的是同一个编号。控制字符没有普通可见字形,用缩写和中文功能名表示。

控制字符 0–31、127空格 32可打印字符 33–126
标准 7 位 ASCII 的全部 128 个编码
十进制十六进制7 位二进制缩写字符含义分类
00x000000000NUL空字符控制字符
10x010000001SOH标题开始控制字符
20x020000010STX正文开始控制字符
30x030000011ETX正文结束控制字符
40x040000100EOT传输结束控制字符
50x050000101ENQ询问控制字符
60x060000110ACK确认控制字符
70x070000111BEL响铃控制字符
80x080001000BS退格控制字符
90x090001001HT水平制表控制字符
100x0A0001010LF换行控制字符
110x0B0001011VT垂直制表控制字符
120x0C0001100FF换页控制字符
130x0D0001101CR回车控制字符
140x0E0001110SO移出控制字符
150x0F0001111SI移入控制字符
160x100010000DLE数据链路转义控制字符
170x110010001DC1设备控制 1控制字符
180x120010010DC2设备控制 2控制字符
190x130010011DC3设备控制 3控制字符
200x140010100DC4设备控制 4控制字符
210x150010101NAK否定确认控制字符
220x160010110SYN同步空闲控制字符
230x170010111ETB传输块结束控制字符
240x180011000CAN取消控制字符
250x190011001EM介质结束控制字符
260x1A0011010SUB替换控制字符
270x1B0011011ESC转义控制字符
280x1C0011100FS文件分隔控制字符
290x1D0011101GS组分隔控制字符
300x1E0011110RS记录分隔控制字符
310x1F0011111US单元分隔控制字符
320x200100000SP空格空白字符
330x210100001!可打印标点或符号可打印字符
340x220100010"可打印标点或符号可打印字符
350x230100011#可打印标点或符号可打印字符
360x240100100$可打印标点或符号可打印字符
370x250100101%可打印标点或符号可打印字符
380x260100110&可打印标点或符号可打印字符
390x270100111'可打印标点或符号可打印字符
400x280101000(可打印标点或符号可打印字符
410x290101001)可打印标点或符号可打印字符
420x2A0101010*可打印标点或符号可打印字符
430x2B0101011+可打印标点或符号可打印字符
440x2C0101100,可打印标点或符号可打印字符
450x2D0101101-可打印标点或符号可打印字符
460x2E0101110.可打印标点或符号可打印字符
470x2F0101111/可打印标点或符号可打印字符
480x3001100000数字 0可打印字符
490x3101100011数字 1可打印字符
500x3201100102数字 2可打印字符
510x3301100113数字 3可打印字符
520x3401101004数字 4可打印字符
530x3501101015数字 5可打印字符
540x3601101106数字 6可打印字符
550x3701101117数字 7可打印字符
560x3801110008数字 8可打印字符
570x3901110019数字 9可打印字符
580x3A0111010:可打印标点或符号可打印字符
590x3B0111011;可打印标点或符号可打印字符
600x3C0111100<可打印标点或符号可打印字符
610x3D0111101=可打印标点或符号可打印字符
620x3E0111110>可打印标点或符号可打印字符
630x3F0111111?可打印标点或符号可打印字符
640x401000000@可打印标点或符号可打印字符
650x411000001A大写字母 A可打印字符
660x421000010B大写字母 B可打印字符
670x431000011C大写字母 C可打印字符
680x441000100D大写字母 D可打印字符
690x451000101E大写字母 E可打印字符
700x461000110F大写字母 F可打印字符
710x471000111G大写字母 G可打印字符
720x481001000H大写字母 H可打印字符
730x491001001I大写字母 I可打印字符
740x4A1001010J大写字母 J可打印字符
750x4B1001011K大写字母 K可打印字符
760x4C1001100L大写字母 L可打印字符
770x4D1001101M大写字母 M可打印字符
780x4E1001110N大写字母 N可打印字符
790x4F1001111O大写字母 O可打印字符
800x501010000P大写字母 P可打印字符
810x511010001Q大写字母 Q可打印字符
820x521010010R大写字母 R可打印字符
830x531010011S大写字母 S可打印字符
840x541010100T大写字母 T可打印字符
850x551010101U大写字母 U可打印字符
860x561010110V大写字母 V可打印字符
870x571010111W大写字母 W可打印字符
880x581011000X大写字母 X可打印字符
890x591011001Y大写字母 Y可打印字符
900x5A1011010Z大写字母 Z可打印字符
910x5B1011011[可打印标点或符号可打印字符
920x5C1011100\可打印标点或符号可打印字符
930x5D1011101]可打印标点或符号可打印字符
940x5E1011110^可打印标点或符号可打印字符
950x5F1011111_可打印标点或符号可打印字符
960x601100000`可打印标点或符号可打印字符
970x611100001a小写字母 a可打印字符
980x621100010b小写字母 b可打印字符
990x631100011c小写字母 c可打印字符
1000x641100100d小写字母 d可打印字符
1010x651100101e小写字母 e可打印字符
1020x661100110f小写字母 f可打印字符
1030x671100111g小写字母 g可打印字符
1040x681101000h小写字母 h可打印字符
1050x691101001i小写字母 i可打印字符
1060x6A1101010j小写字母 j可打印字符
1070x6B1101011k小写字母 k可打印字符
1080x6C1101100l小写字母 l可打印字符
1090x6D1101101m小写字母 m可打印字符
1100x6E1101110n小写字母 n可打印字符
1110x6F1101111o小写字母 o可打印字符
1120x701110000p小写字母 p可打印字符
1130x711110001q小写字母 q可打印字符
1140x721110010r小写字母 r可打印字符
1150x731110011s小写字母 s可打印字符
1160x741110100t小写字母 t可打印字符
1170x751110101u小写字母 u可打印字符
1180x761110110v小写字母 v可打印字符
1190x771110111w小写字母 w可打印字符
1200x781111000x小写字母 x可打印字符
1210x791111001y小写字母 y可打印字符
1220x7A1111010z小写字母 z可打印字符
1230x7B1111011{可打印标点或符号可打印字符
1240x7C1111100|可打印标点或符号可打印字符
1250x7D1111101}可打印标点或符号可打印字符
1260x7E1111110~可打印标点或符号可打印字符
1270x7F1111111DEL删除控制字符

常见误区

  • 把 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 的实现细节,不使用本章的普通整数进制模型直接推导。
  • 字符编码把字符映射到整数,但编码知识与整数进制书写是两个不同层次。
打开本章完整示例与独立阅读页 →

完成检查

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