当前位置: 首页 > news >正文

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

前言

在前五篇博客中,我们从零开始,建立了一套完整的 Python 编程知识体系:

  • 第1篇:搭建环境,写下第一行代码,理解变量与基础语法
  • 第2篇:掌握数据类型与运算符,建立 “数据” 的认知
  • 第3篇:掌握条件语句、循环、函数,建立"逻辑"的认知
  • 第4篇:深入面向对象编程,建立"结构"的认知
  • 第5篇:文件操作与异常处理,掌握程序与外界交互的能力

本篇是进阶篇,我们将深入 Python 真正精华的部分 —— 那些让代码变得更简洁、更高效、更强大的语法和工具。学完本篇,你将从 “会写 Python” 迈向 “精通 Python”。

本篇涵盖六大主题:

  1. 列表推导式与字典推导式:一行代码生成复杂数据结构
  2. 生成器与迭代器:优雅处理海量数据,内存零压力
  3. 装饰器:不修改原函数,给它添加新功能(AOP 思想)
  4. 闭包:函数背后的"记忆"能力
  5. 正则表达式:用 pattern 精准匹配一切文字
  6. 高阶标准库: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_score=score+5ifnew_score>100:new_score=100adjusted.append(new_score)# 第2步:挑出 >= 90 的分数passed=[]forscoreinadjusted:ifscore>=90:passed.append(score)print(passed)# [95, 97, 100, 94]

这段代码逻辑清晰,但有两个问题:

  1. 代码冗长:总共 8 行,而实际逻辑只有两句话
  2. 变量名泛滥adjustednew_scorepassed……临时变量越造越多

列表推导式写法:

scores=[85,90,78,92,88,76,95,89,83,91]passed=[min(score+5,100)forscoreinscoresifscore+5>=90]print(passed)# [95, 97, 100, 94]

一行搞定。这行代码的含义:

for score in scores→ 遍历原始列表
if score + 5 >= 90→ 过滤条件
min(score + 5, 100)→ 转换逻辑(加5,不超过100)

1.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%2==0]print(even_squares)# [0, 4, 16, 36, 64]

逐行解析:

组成部分含义
[x ** 2 for x in range(10)]外层方括号表示 “生成一个新列表”
x ** 2列表中每个元素的生成方式(表达式)
for x in range(10)遍历range(10),每次把当前元素绑定到x
if x % 2 == 0可选:只处理满足条件的元素

1.3、多个条件的组合

# 多个 if 条件:相当于 andresult=[xforxinrange(100)ifx%3==0ifx%5==0]# 同时能被3和5整除(就是能被15整除)的数: [0, 15, 30, 45, 60, 75, 90]# if...else 在表达式里:三元表达式# 语法: [expr_if_true if condition else expr_if_false for ...]labeled=['偶数'ifx%2==0else'奇数'forxinrange(5)]print(labeled)# ['偶数', '奇数', '偶数', '奇数', '偶数']

注意区分if condition(过滤)和if...else...(三元)的位置不同:

# ❌ 错误写法:if 在表达式后面会变成三元表达式,不会过滤result=[x*2ifx>5forxinrange(10)]# SyntaxError!# ✅ 正确写法:过滤用 if 在 for 后面,三元用 if 在表达式里result=[x*2forxinrange(10)ifx>5]# 过滤result=[x*2ifx>5else0forxinrange(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}

实战:统计字符串中每个字符出现的次数:

text="hello python"char_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 层)普通循环可读性更重要
需要调试中间步骤普通循环推导式中间步骤无法打断点
处理大文件(百万级元素)生成器(后面讲)推导式会一次性生成整个列表,占内存

二、生成器与迭代器:优雅处理海量数据

http://www.jsqmd.com/news/1368642/

相关文章:

  • Heroku-buildpack-static深度解析:从入门到精通的静态网站部署终极指南
  • 3步实现企业级权限管理系统:RuoYi-Vue快速开发框架实战指南
  • rowGrid.js常见问题解答:解决图片加载、尺寸适配与浏览器兼容难题
  • through高级技巧:掌握autoDestroy选项与流生命周期管理的终极指南
  • 如何用OpenCore Legacy Patcher修复老旧Mac的网络功能:4步解决WiFi与热点问题
  • 岳阳水下搜救队|专业水下堵漏施工队找哪家-鸿腾水下打捞 - 行业推荐官-2
  • 信通院力荐低代码平台,政企数字化转type新路径
  • OpenCensus-Java完全指南:从入门到精通的分布式追踪与统计框架
  • 3个简单步骤:用4480+免费Visio模具打造专业IT架构图
  • 如何快速获取网页视频:面向普通用户的完整指南
  • 2026年PC管亚克力管厂家,有机玻璃管聚碳酸酯透明管,高透光耐冲击定制加工 - 优企名品
  • RegNetY-320.SWAG-FT-In1k特征提取教程:3行代码获取高维图像特征
  • 2026龙岩卫生间漏水避坑指南 - 房屋修缮
  • Swag常见问题解答:新手必知的15个实用技巧
  • Unity资源依赖管理:从AssetBundle到Addressables的优化实践
  • MCP 微软教材背书:5 国产基座 Agent 承接力实测
  • Agent Governance Toolkit安全认证学习小组:加入学习小组共同学习
  • ESP-IDF完整指南:从零开始构建ESP32物联网应用的终极教程 [特殊字符]
  • 2026 绍兴上班族怎么提升成人大专本科学信网可查报考指南 - 浙江教育测评
  • txt怎么转word?盘点7款PDF转换工具,覆盖电脑自带与在线方案 - 耶斯去水印
  • 上海房产分割别乱找律师!动迁、离婚、继承、商铺厂房,一文讲清怎么选对法律服务君澜孙青律师 - 孙青律师13681945561
  • 5大核心价值:Android开源项目精选平台的深度技术生态解析
  • 2026宁德卫生间漏水避坑指南 - 房屋修缮
  • docker-compose部署docker-ddns全攻略:持久化配置与安全最佳实践
  • AtlasOS显卡优化完全指南:3个免费工具让游戏性能飙升25%
  • 如何快速创建专业网络拓扑图:Visio模具的完整指南
  • 如何用GSEApy轻松实现GSEA分析?5分钟快速上手教程
  • MCP OAuth 2.1 合规上线:5 国产基座屠夫
  • 2026南昌卫生间漏水避坑指南 - 房屋修缮
  • 华为MetaERP 采购四环节会计核算、SAP / Oracle EBS / Fusion 对比分析业务流程:PO 采购下单 → 采购接收 → 接收检验 → 入库PO 下单:无论国内手工账还是 E