第6篇_Python高级语法与标准库精髓:从会用到达精通

📅 2026/8/10 22:39:44
第6篇_Python高级语法与标准库精髓:从会用到达精通
前言在前五篇博客中我们从零开始建立了一套完整的 Python 编程知识体系第1篇搭建环境写下第一行代码理解变量与基础语法第2篇掌握数据类型与运算符建立 “数据” 的认知第3篇掌握条件语句、循环、函数建立逻辑的认知第4篇深入面向对象编程建立结构的认知第5篇文件操作与异常处理掌握程序与外界交互的能力本篇是进阶篇我们将深入 Python 真正精华的部分 —— 那些让代码变得更简洁、更高效、更强大的语法和工具。学完本篇你将从 “会写 Python” 迈向 “精通 Python”。本篇涵盖六大主题列表推导式与字典推导式一行代码生成复杂数据结构生成器与迭代器优雅处理海量数据内存零压力装饰器不修改原函数给它添加新功能AOP 思想闭包函数背后的记忆能力正则表达式用 pattern 精准匹配一切文字高阶标准库collections、itertools、functools 高级用法准备好了吗让我们开始一、列表推导式与字典推导式一行代码的威力1.1、从一个问题开始假设你有一个列表里面存放了 10 个学生的分数scores[85,90,78,92,88,76,95,89,83,91]现在你需要把每个分数都加上 5 分如果有超过 100 分的按 100 计然后挑出所有大于等于 90 分的分数。传统写法过程式# 第1步给每个分数加5但不超过100adjusted[]forscoreinscores:new_scorescore5ifnew_score100:new_score100adjusted.append(new_score)# 第2步挑出 90 的分数passed[]forscoreinadjusted:ifscore90:passed.append(score)print(passed)# [95, 97, 100, 94]这段代码逻辑清晰但有两个问题代码冗长总共 8 行而实际逻辑只有两句话变量名泛滥adjusted、new_score、passed……临时变量越造越多列表推导式写法scores[85,90,78,92,88,76,95,89,83,91]passed[min(score5,100)forscoreinscoresifscore590]print(passed)# [95, 97, 100, 94]一行搞定。这行代码的含义for score in scores→ 遍历原始列表if score 5 90→ 过滤条件min(score 5, 100)→ 转换逻辑加5不超过1001.2、列表推导式的基本语法列表推导式List Comprehension是 Python 提供的一种紧凑的列表创建语法。基本格式# 语法[表达式 for 变量 in 可迭代对象]# 例把 0~9 的每个数平方生成新列表squares[x**2forxinrange(10)]print(squares)# [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]带条件过滤# 语法[表达式 for 变量 in 可迭代对象 if 条件]# 例挑出偶数的平方even_squares[x**2forxinrange(10)ifx%20]print(even_squares)# [0, 4, 16, 36, 64]逐行解析组成部分含义[x ** 2 for x in range(10)]外层方括号表示 “生成一个新列表”x ** 2列表中每个元素的生成方式表达式for x in range(10)遍历range(10)每次把当前元素绑定到xif x % 2 0可选只处理满足条件的元素1.3、多个条件的组合# 多个 if 条件相当于 andresult[xforxinrange(100)ifx%30ifx%50]# 同时能被3和5整除就是能被15整除的数: [0, 15, 30, 45, 60, 75, 90]# if...else 在表达式里三元表达式# 语法 [expr_if_true if condition else expr_if_false for ...]labeled[偶数ifx%20else奇数forxinrange(5)]print(labeled)# [偶数, 奇数, 偶数, 奇数, 偶数]注意区分if condition过滤和if...else...三元的位置不同# ❌ 错误写法if 在表达式后面会变成三元表达式不会过滤result[x*2ifx5forxinrange(10)]# SyntaxError!# ✅ 正确写法过滤用 if 在 for 后面三元用 if 在表达式里result[x*2forxinrange(10)ifx5]# 过滤result[x*2ifx5else0forxinrange(10)]# 三元1.4、双重循环与二维列表列表推导式还支持双重循环可以用于展平二维列表矩阵# 把 3x3 矩阵展平为一维列表matrix[[1,2,3],[4,5,6],[7,8,9]]# 语法for 外层 in ... for 内层 in ...flattened[itemforrowinmatrixforiteminrow]print(flattened)# [1, 2, 3, 4, 5, 6, 7, 8, 9]逐行解析for row in matrix外层循环遍历每一行for item in row内层循环遍历行里的每个元素item直接输出每个数字不是行1.5、字典推导式字典推导式Dict Comprehension的语法与列表推导式类似只是用花括号{}并且每个元素是一个key: value对# 把一个列表的每个元素作为 key元素长度作为 valuewords[apple,banana,cherry,date]word_lengths{word:len(word)forwordinwords}print(word_lengths)# {apple: 5, banana: 6, cherry: 6, date: 4}实战统计字符串中每个字符出现的次数texthello pythonchar_count{ch:text.count(ch)forchinset(text)}print(char_count)# {h: 2, e: 1, l: 3, o: 2, : 1, p: 1, y: 1, t: 1, n: 1}性能提示上面这个例子中set(text)去掉了重复字符这样text.count(ch)就不用重复统计相同的字符。如果直接for ch in text并用char_count[ch] 1统计逻辑相同但字典推导式的写法更简洁。1.6、集合推导式类似的还有集合推导式Set Comprehension用{}但只放单个元素自动去重# 从列表中提取所有不重复的单词长度words[apple,banana,apricot,blueberry,cherry]lengths{len(word)forwordinwords}print(lengths)# {5, 6, 9}1.7、推导式 vs 普通循环该用哪个列表推导式不是银弹以下是选择建议场景推荐方式原因简单的映射/过滤转换列表推导式一行搞定简洁直观复杂的逻辑超过 3 层普通循环可读性更重要需要调试中间步骤普通循环推导式中间步骤无法打断点处理大文件百万级元素生成器后面讲推导式会一次性生成整个列表占内存二、生成器与迭代器优雅处理海量数据