PYTHON LESSON 057
考点精讲:考号里的字符串密码
在主线课基础上更进一步:熟练带步长的切片、in 判断、find 与 index 的区别、isdigit / isalpha / isalnum 判断函数。
00 · 学习目标
这一课要解决什么?
学完后,你应该能够
- s[起点:终点:步长] 带步长切片,s[::-1] 倒序
- 子串 in s 判断“有没有”
- s.find() 找不到返回 -1,s.index() 找不到直接报错
01 · 核心概念
切片步长、in 成员判断、find 与 index 之别、is 系列判断函数
切片步长、in 成员判断、find 与 index 之别、is 系列判断函数:主线课学过 s[起点:终点],再加上第三个数就是步长:ticket[::2] 每隔 2 个取一个字符,ticket[::-1] 步长为 -1,整个字符串倒着走。倒序切片是考级常客,务必背下来。
GESP Python 4 级 · 字符串及其函数GESP Python 4 级 · 字符串切片与成员判断正则表达式不在低等级字符串必修范围,但复杂模式匹配时应使用 re,而不是堆叠大量 split/find。
02 · 语法与规则
先记住这 3 条,再开始写程序
s[起点:终点:步长] 带步长切片,s[::-1] 倒序先准确读出这条写法的结构与作用。
子串 in s 判断“有没有”换一组最小数据,手工推演一次结果。
s.find() 找不到返回 -1,s.index() 找不到直接报错再用边界值或反例确认它的适用条件。
03 · 完整实例
代码、运行结果和解释放在一起看
# 考点精讲:字符串进阶十八般武艺
ticket = "G4-2025-PY-038"
# 1. 切片三板斧:起点:终点:步长
print("前 2 位(级别):", ticket[:2])
print("年份:", ticket[3:7])
print("最后 3 位(座位号):", ticket[-3:])
print("每隔 2 个取一个:", ticket[::2])
print("倒序:", ticket[::-1])
# 2. in 与 not in:有没有
print("含 PY 吗:", "PY" in ticket)
# 3. find 与 index 的区别
print("find 找到 '-':", ticket.find("-"))
print("find 找不到返回:", ticket.find("X"))
# print(ticket.index("X")) # index 找不到会直接报错!
# 4. 判断家族
for s in ["2025", "PY38", "abc"]:
print(s, "纯数字?", s.isdigit(), "纯字母?", s.isalpha(), "字母或数字?", s.isalnum())
# 5. 忽略大小写比较
answer = "py"
print("答案对吗:", answer.upper() == "PY")前 2 位(级别): G4 年份: 2025 最后 3 位(座位号): 038 每隔 2 个取一个: G-05P-3 倒序: 830-YP-5202-4G 含 PY 吗: True find 找到 '-': 2 find 找不到返回: -1 2025 纯数字? True 纯字母? False 字母或数字? True PY38 纯数字? False 纯字母? False 字母或数字? True abc 纯数字? False 纯字母? True 字母或数字? True 答案对吗: True
find 找不到时返回 -1,不报错;index 找不到时直接抛异常——考场上最爱考这一对。
04 · 逐步理解
每一步只解决一个问题
- 01
切片加上第三个数:步长
主线课学过 s[起点:终点],再加上第三个数就是步长:ticket[::2] 每隔 2 个取一个字符,ticket[::-1] 步长为 -1,整个字符串倒着走。倒序切片是考级常客,务必背下来。
print(ticket[::2]) print(ticket[::-1]) - 02
负数下标:从尾巴往回数
ticket[-3:] 表示“倒数第 3 个到结尾”,不用先算长度就能取到座位号。负数下标在“取最后几位”的题目里特别好用。
print(ticket[-3:]) - 03
in:一个词的“有没有”
"PY" in ticket 直接回答 True 或 False,比 find 再判断 -1 简洁得多。做“含有某关键词就处理”的题目时,in 是首选。
if "PY" in ticket: print("是 Python 考场的票") - 04
find 和 index 的分歧点
找到时两者一样,都返回位置;找不到时分道扬镳:find 返回 -1 继续跑,index 直接报错终止程序。考级选择题常问“find 找不到返回什么”,答案:-1。
print(ticket.find("X")) # -1 # ticket.index("X") # ValueError - 05
is 系列判断家族
isdigit() 全是数字吗、isalpha() 全是字母吗、isalnum() 字母或数字吗?它们逐个字符检查,全部满足才返回 True。做“统计一句话里有几个数字”时,配合 for 循环逐个字符判断。
for ch in "a1b2": if ch.isdigit(): print(ch, "是数字") - 06
忽略大小写的比较套路
用户输入 y、Y、yes 都算“是”?统一转成一种大小写再比较:answer.upper() == "PY"。这是处理用户输入的标准动作,编程题里经常出现。
answer.upper() == "PY"
05 · 练习与检验
自己写出来,才算真正学会
- 1运行解析器,看考号被拆成哪些信息
- 2把考号换成自己的学号再解析一次
- 3用 [::-1] 倒序输出考号
- 4用 isdigit 判断一个字符是不是数字
06 · 完整知识
继续理解定义、规则和适用边界
第一次学习先完成上面的六个步骤;需要查定义、核对规则、分析误区或理解“为什么”时,再展开对应知识章。
编码与文本字符串、转义、切片与格式化从不可变字符序列到检索、拆分、拼接、格式化和常用判断方法。+
正式定义
str 是不可变的 Unicode 字符序列。下标访问单个字符,切片生成新字符串;任何看似“修改字符串”的方法都会返回新对象。
必须掌握
- 下标从 0 开始,负下标从末尾开始;切片 s[start:stop:step] 不包含 stop,step 不能为 0。
- 转义序列用于在字面量中表示换行、制表、引号、反斜杠或码点;原始字符串仍有末尾反斜杠限制。
- find 找不到返回 -1,index 找不到抛 ValueError;count 统计不重叠出现次数。
- split 把字符串拆成列表,join 用一个字符串连接可迭代对象中的字符串,strip 只删除两端字符。
- f-string 的格式说明可控制宽度、对齐、精度、进制和百分比;格式化不改变原值。
- isalpha/isdigit 等按 Unicode 定义,不只识别英文字母和 ASCII 数字。
STRING LITERALS
字符串转义序列速查
表中写法用于普通字符串字面量。原始字符串 r'...' 会保留多数反斜杠,但不能以奇数个反斜杠结束。
| 写法 | 含义 |
|---|---|
\\ | 反斜杠 \ |
\' | 单引号 |
\" | 双引号 |
\n | 换行 LF |
\r | 回车 CR |
\t | 水平制表 |
\b | 退格 |
\f | 换页 |
\v | 垂直制表 |
\a | 响铃 |
\ooo | 八进制值 ooo 的字符(最多三位) |
\xhh | 十六进制值 hh 的字符(必须两位) |
\N{name} | 按 Unicode 正式名称指定字符 |
\uxxxx | 16 位十六进制 Unicode 码点 |
\Uxxxxxxxx | 32 位十六进制 Unicode 码点 |
反斜杠 + 换行 | 忽略物理换行,继续同一逻辑行 |
STR PUBLIC METHODS
字符串公开方法完整速查
以下覆盖 Python 3.12 str 的公开方法。所有方法都返回结果或判断值,不会原地改变字符串。
| 方法 | 核心作用 |
|---|---|
capitalize | 首字符大写,其余字符小写 |
casefold | 用于无大小写文本匹配的强力小写化 |
center | 按宽度居中并填充 |
count | 统计非重叠子串次数 |
encode | 按编码方案转为 bytes |
endswith | 判断是否以指定后缀结束 |
expandtabs | 把制表符展开为空格 |
find | 查找子串,找不到返回 -1 |
format | 按格式字段生成字符串 |
format_map | 使用映射提供格式字段 |
index | 查找子串,找不到抛 ValueError |
isalnum | 是否全为字母或数字且非空 |
isalpha | 是否全为字母且非空 |
isascii | 是否所有字符码点都小于 128 |
isdecimal | 是否全为十进制数字字符且非空 |
isdigit | 是否全为数字字符且非空,范围比 isdecimal 广 |
isidentifier | 是否可作 Python 标识符的形状 |
islower | 是否有大小写字符且都为小写 |
isnumeric | 是否全为数值字符且非空,范围比 isdigit 广 |
isprintable | 是否全为可打印字符或为空串 |
isspace | 是否全为空白字符且非空 |
istitle | 是否符合标题式大小写 |
isupper | 是否有大小写字符且都为大写 |
join | 用当前字符串连接一组字符串 |
ljust | 按宽度左对齐并填充 |
lower | 转为小写 |
lstrip | 删除左端指定字符集合 |
maketrans | 创建 translate 使用的转换表 |
partition | 按首次分隔符拆成三元组 |
removeprefix | 存在指定前缀时删除一次 |
removesuffix | 存在指定后缀时删除一次 |
replace | 替换子串,可限制次数 |
rfind | 从右侧查找,找不到返回 -1 |
rindex | 从右侧查找,找不到抛 ValueError |
rjust | 按宽度右对齐并填充 |
rpartition | 按最后一次分隔符拆成三元组 |
rsplit | 从右侧开始限制拆分次数 |
rstrip | 删除右端指定字符集合 |
split | 按分隔符拆成列表 |
splitlines | 按行边界拆分 |
startswith | 判断是否以指定前缀开始 |
strip | 删除两端指定字符集合 |
swapcase | 交换大小写 |
title | 转为标题式大小写 |
translate | 按转换表替换或删除字符 |
upper | 转为大写 |
zfill | 在符号后用 0 补齐宽度 |
常见误区
- 尝试 s[0] = 'A' 原地修改字符串
- 把 strip('ab') 误解为删除完整子串 'ab'
- find 返回 -1 后直接拿去当有效下标
- 把字节长度与字符长度混为一谈
适用边界
- 正则表达式不在低等级字符串必修范围,但复杂模式匹配时应使用 re,而不是堆叠大量 split/find。
- 面向用户的字符计数还可能涉及组合字符和字素簇,len 统计的是 Unicode 码点序列长度。
Python 基础条件、循环与程序流程准确理解 if、for、while、range、break、continue 和循环嵌套,而不是背代码模板。+
正式定义
控制流决定下一条要执行的语句。分支依据布尔条件选择路径;循环在满足规则时重复执行代码块。Python 用冒号和缩进界定代码块。
必须掌握
- if/elif/else 从上到下判断,只执行第一个为真的分支;else 不写条件。
- for 依次取得可迭代对象中的元素;range(start, stop, step) 包含 start、不包含 stop,step 不能为 0。
- while 在每轮开始前检查条件;循环体必须让状态向终止条件推进。
- break 结束最内层循环,continue 跳过本轮剩余语句,循环的 else 仅在没有被 break 终止时执行。
- 嵌套循环的总执行次数通常需要把各层次数相乘;内层 break 不会结束外层循环。
- 边界测试至少覆盖空范围、单个元素、第一项命中、最后一项命中和始终不命中。
常见误区
- range 的右端点多算或少算一次
- while 忘记更新状态造成死循环
- 把两个互斥条件写成两个独立 if
- 误以为 break 会跳出所有嵌套循环
适用边界
- 流程图是算法的表示方法,不是 Python 语法。
- 递归也能表达重复,但有调用开销和递归深度限制,不能无条件代替循环。
Python 基础运算符、表达式与优先级完整区分算术、比较、逻辑、成员、身份和位运算,并用优先级表消除歧义。+
正式定义
表达式求值得到一个值。运算符规定如何组合操作数;当一个表达式含多个运算符时,优先级和结合方向决定求值顺序,括号可以明确改变顺序。
必须掌握
- / 总是得到浮点结果;// 是向负无穷方向取整的整除;% 与 // 满足 a == (a // b) * b + a % b。
- 比较可以链式书写,如 0 <= x < 10;and/or 会短路并返回最后求值的操作数,不一定返回 bool。
- == 比较值是否相等,is 比较是否为同一个对象;判断 None 应写 is None。
- in/not in 做成员测试;对 dict 测试的是键。
- 位运算作用于整数的二进制位;负整数按无限长二进制补码语义理解。
- 复杂表达式即使能靠优先级正确运行,也应使用括号表达意图。
常见误区
- 把 // 当成简单截断
- 用 is 比较数字或字符串的值
- 忘记 and 的优先级高于 or
- 连续位移、比较和逻辑运算却不加括号
适用边界
- 浮点数比较受二进制表示误差影响,需要按问题选择容差。
- 运算符可由自定义类重载,因此相同符号对不同类型可能有不同语义。
工程能力异常、文件、测试与调试读懂报错、缩小问题、设计测试,并安全地打开、读取和关闭文本文件。+
正式定义
异常是在运行期间表示错误或特殊情况的对象。调试是用可复现输入和证据定位实际行为与预期行为差异的过程;文件对象连接程序与持久化字节数据。
必须掌握
- 先读 traceback 最后一行的异常类型与消息,再从最靠近自己代码的栈帧向上追踪。
- try 只包可能失败的最小代码;except 捕获具体异常;else 处理成功路径;finally 做必需清理。
- raise 主动报告不满足的前置条件;assert 用于开发期内部假设,不用于校验不可信用户输入。
- with open(...) as file 会在退出代码块时可靠关闭文件。文本模式必须明确编码,本站统一推荐 encoding='utf-8'。
- 测试至少包含正常值、边界值、空数据、极端值和反例;每个测试只应有明确目的。
- 定位错误时一次只改一个假设,保留能稳定复现问题的最小输入。
常见误区
- 使用 except: 吞掉所有错误
- 只测题目样例就认为程序正确
- 文本文件不写 encoding
- 修复报错表象却不验证根因
适用边界
- 在线判题的学生代码由独立 Worker 执行;文件系统、网络和资源权限必须受平台限制。
- 二进制文件、JSON/CSV 和数据库各有专门格式与错误处理方式,不能按普通文本随意拆分。
完成检查