深入建议 50 分钟学习等级 2/8

PYTHON LESSON 025

考点精讲:字符编码进阶营

吃透 ASCII 编码的三个高频考法:大小写相差 32、字符比较比的是编码、用 % 26 实现绕回位移。

00 · 学习目标

这一课要解决什么?

先想一想小写变大写、Z 加密后绕回开头……这些“字母魔术”其实只是一张编码表的加减法?
完成任务字母变形密码机
学习顺序正式定义 → 机制推演 → 边界与反例 → 迁移

学完后,你应该能够

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

01chr(ord(ch) - 32) 小写转大写

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

02字符比大小,比的是 ASCII 编码

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

03(编码 - 起点 + 位移) % 26 + 起点 实现绕回

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

03 · 完整实例

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

g2-ascii-master.pyPYTHON 3.12
# 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)
运行结果OUTPUT
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 · 逐步理解

每一步只解决一个问题

  1. 01

    编码表里的邻居关系

    ASCII 表不是乱排的:大写字母从 A=65 开始连号,小写字母从 a=97 开始连号,同一个字母的小写比大写正好大 32。记住这个规律,大小写转换就是一道减法题。考试常直接问“'d' 的编码是多少”,知道 a=97 就能一路数过去。

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

    小写转大写的万能公式

    把小写 ch 变成大写:先 ord(ch) 查出编码,减去 32,再 chr() 变回字符。反过来大写转小写就加 32。这个“ord 进、chr 出”的组合拳是二级考试的经典题型,一定要默写得出。

    PYTHON
    print(chr(ord("g") - 32))
  3. 03

    字符也能比大小

    两个字符用 < 比较时,Python 比的是它们的编码。所以 'a' < 'b' 是 True,'A' < 'a' 也是 True(65 < 97)。排序单词、判断字符落在哪个区间(比如是不是大写字母)都靠这一招。

    PYTHON
    print("A" <= "M" <= "Z")
  4. 04

    绕回加密:% 26 的魔法

    Z 后移 2 位会“越界”,怎么办?先把编码减去 ord("A"),让 A 变成 0、Z 变成 25;加上位移后对 26 取余,超出的部分自动绕回开头;最后再加回 ord("A")。这就是考卷里“凯撒密码绕回”问题的标准解法。

    PYTHON
    code = (ord(ch) - ord("A") + shift) % 26 + ord("A")
  5. 05

    数字字符不是数字

    字符 '7' 的编码是 55,它和数字 7 完全是两回事:"7" + "8" 是字符串拼接得 "78",7 + 8 是加法得 15。考试里最爱在这里挖坑,看到引号就要警觉:有引号是文字,没引号才是数。

    PYTHON
    print("7" + "8", 7 + 8)
  6. 06

    三个必须背下来的编码

    二级考试记不住整张表没关系,背三个锚点就够:'0' 是 48、'A' 是 65、'a' 是 97。任何字符的编码都能从锚点数出来,比如 'C' = 65 + 2 = 67。考场上这能帮你省下大把时间。

05 · 练习与检验

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

本课实作步骤
  1. 1运行程序,观察小写 g 怎么变成大写 G
  2. 2把 ch 换成自己名字的拼音首字母再运行
  3. 3把 shift 改成 5,看看 Z 绕回后变成谁
  4. 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 完整对照表

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

控制字符 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 的解释必须同时注明代码页;字符显示还依赖字体,有合法码点也不等于当前字体一定有对应字形。
打开本章完整示例与独立阅读页 →
算法方法算法、复杂度与解题验证把题意转成输入、状态、规则与输出,用正确性和复杂度共同评价解法。

正式定义

算法是解决一类问题的有限、明确步骤。正确性说明算法对所有满足前置条件的输入都得到规定结果;时间和空间复杂度描述输入规模增长时资源使用的增长量级。

必须掌握

  • 先明确输入规模 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 码点序列长度。
打开本章完整示例与独立阅读页 →

完成检查

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