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

PYTHON LESSON 057

考点精讲:考号里的字符串密码

在主线课基础上更进一步:熟练带步长的切片、in 判断、find 与 index 的区别、isdigit / isalpha / isalnum 判断函数。

00 · 学习目标

这一课要解决什么?

先想一想一串“G4-2025-PY-038”的考号里,藏着多少可以一秒提取的信息?
完成任务准考证号解析器
学习顺序正式定义 → 机制推演 → 边界与反例 → 迁移

学完后,你应该能够

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

01s[起点:终点:步长] 带步长切片,s[::-1] 倒序

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

02子串 in s 判断“有没有”

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

03s.find() 找不到返回 -1,s.index() 找不到直接报错

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

03 · 完整实例

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

g4-string-deep-dive.pyPYTHON 3.12
# 考点精讲:字符串进阶十八般武艺
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")
运行结果OUTPUT
前 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 · 逐步理解

每一步只解决一个问题

  1. 01

    切片加上第三个数:步长

    主线课学过 s[起点:终点],再加上第三个数就是步长:ticket[::2] 每隔 2 个取一个字符,ticket[::-1] 步长为 -1,整个字符串倒着走。倒序切片是考级常客,务必背下来。

    PYTHON
    print(ticket[::2])
    print(ticket[::-1])
  2. 02

    负数下标:从尾巴往回数

    ticket[-3:] 表示“倒数第 3 个到结尾”,不用先算长度就能取到座位号。负数下标在“取最后几位”的题目里特别好用。

    PYTHON
    print(ticket[-3:])
  3. 03

    in:一个词的“有没有”

    "PY" in ticket 直接回答 True 或 False,比 find 再判断 -1 简洁得多。做“含有某关键词就处理”的题目时,in 是首选。

    PYTHON
    if "PY" in ticket:
        print("是 Python 考场的票")
  4. 04

    find 和 index 的分歧点

    找到时两者一样,都返回位置;找不到时分道扬镳:find 返回 -1 继续跑,index 直接报错终止程序。考级选择题常问“find 找不到返回什么”,答案:-1。

    PYTHON
    print(ticket.find("X"))   # -1
    # ticket.index("X")      # ValueError
  5. 05

    is 系列判断家族

    isdigit() 全是数字吗、isalpha() 全是字母吗、isalnum() 字母或数字吗?它们逐个字符检查,全部满足才返回 True。做“统计一句话里有几个数字”时,配合 for 循环逐个字符判断。

    PYTHON
    for ch in "a1b2":
        if ch.isdigit():
            print(ch, "是数字")
  6. 06

    忽略大小写的比较套路

    用户输入 y、Y、yes 都算“是”?统一转成一种大小写再比较:answer.upper() == "PY"。这是处理用户输入的标准动作,编程题里经常出现。

    PYTHON
    answer.upper() == "PY"

05 · 练习与检验

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

本课实作步骤
  1. 1运行解析器,看考号被拆成哪些信息
  2. 2把考号换成自己的学号再解析一次
  3. 3用 [::-1] 倒序输出考号
  4. 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'...' 会保留多数反斜杠,但不能以奇数个反斜杠结束。

Python 字符串转义序列
写法含义
\\反斜杠 \
\'单引号
\"双引号
\n换行 LF
\r回车 CR
\t水平制表
\b退格
\f换页
\v垂直制表
\a响铃
\ooo八进制值 ooo 的字符(最多三位)
\xhh十六进制值 hh 的字符(必须两位)
\N{name}按 Unicode 正式名称指定字符
\uxxxx16 位十六进制 Unicode 码点
\Uxxxxxxxx32 位十六进制 Unicode 码点
反斜杠 + 换行忽略物理换行,继续同一逻辑行

STR PUBLIC METHODS

字符串公开方法完整速查

以下覆盖 Python 3.12 str 的公开方法。所有方法都返回结果或判断值,不会原地改变字符串。

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 和数据库各有专门格式与错误处理方式,不能按普通文本随意拆分。
打开本章完整示例与独立阅读页 →

完成检查

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