news 2026/4/15 10:35:35

告别繁琐循环:Python 推导式 (Comprehensions) 终极入门指南

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
告别繁琐循环:Python 推导式 (Comprehensions) 终极入门指南

目录

    • 告别繁琐循环:Python 推导式 (Comprehensions) 终极入门指南
    • 1. 前言:为什么要学习推导式?
    • 2. 预备知识
    • 3. 核心指南:一步步掌握推导式
      • 3.1 列表推导式 (List Comprehensions)
        • 传统写法 vs. 推导式写法
        • 语法解构
        • 进阶:带条件的列表推导式
      • 3.2 字典推导式 (Dictionary Comprehensions)
      • 3.3 集合推导式 (Set Comprehensions)
      • 3.4 特别篇:生成器表达式 (Generator Expressions)
    • 4. 常见误区与注意事项
      • 4.1 避免过度嵌套
      • 4.2 别为了“炫技”而使用
    • 5. 总结

专栏导读
  • 🌸 欢迎来到Python办公自动化专栏—Python处理办公问题,解放您的双手
  • 🏳️‍🌈 个人博客主页:请点击——> 个人的博客主页 求收藏
  • 🏳️‍🌈 Github主页:请点击——> Github主页 求Star⭐
  • 🏳️‍🌈 知乎主页:请点击——> 知乎主页 求关注
  • 🏳️‍🌈 CSDN博客主页:请点击——> CSDN的博客主页 求关注
  • 👍 该系列文章专栏:请点击——>Python办公自动化专栏 求订阅
  • 🕷 此外还有爬虫专栏:请点击——>Python爬虫基础专栏 求订阅
  • 📕 此外还有python基础专栏:请点击——>Python基础学习专栏 求订阅
  • 文章作者技术和水平有限,如果文中出现错误,希望大家能指正🙏
  • ❤️ 欢迎各位佬关注! ❤️

告别繁琐循环:Python 推导式 (Comprehensions) 终极入门指南

1. 前言:为什么要学习推导式?

在 Python 的世界里,你经常会听到一个词——Pythonic(具有 Python 风格的)。它代表了代码的简洁、优雅和高效。而**推导式(Comprehensions)**正是 Pythonic 代码的典型代表。

作为初学者,你可能习惯使用传统的for循环来创建列表或处理数据。虽然这没有错,但 Python 提供了一种更强大的工具,能让你用一行代码完成过去需要三四行才能做到的事情,而且通常运行速度更快。

本文将带你从零开始,系统地掌握 Python 中的列表、字典、集合推导式以及生成器表达式。


2. 预备知识

在开始之前,请确保你已经了解以下基础概念:

  • 列表 (List)字典 (Dictionary)集合 (Set)的基本用法。
  • for循环的基本结构。
  • if条件语句的基本用法。

3. 核心指南:一步步掌握推导式

3.1 列表推导式 (List Comprehensions)

这是最常用的一种推导式。它的核心目的是:基于一个现有的列表(或可迭代对象),通过某种运算或筛选,创建一个新的列表。

传统写法 vs. 推导式写法

假设我们需要创建一个包含 0 到 9 的平方数的列表。

传统写法 (for循环 +append):

squares=[]forxinrange(10):squares.append(x*x)print(squares)# 输出: [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]

推导式写法:

squares=[x*xforxinrange(10)]print(squares)# 输出: [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
语法解构

列表推导式的基本语法如下:

[表达式for变量in可迭代对象]
  • [...]: 方括号表示结果是一个列表。
  • x * x(表达式): 这是你希望放入新列表的元素(也就是append里的内容)。
  • for x in range(10): 循环逻辑,定义数据的来源。
进阶:带条件的列表推导式

如果你只想保留符合特定条件的元素(例如,只计算偶数的平方),该怎么办?

语法:

[表达式for变量in可迭代对象if条件]

示例代码:

# 只计算 0-9 中偶数的平方even_squares=[x*xforxinrange(10)ifx%2==0]print(even_squares)# 输出: [0, 4, 16, 36, 64]

注意:这里的if语句相当于过滤器,只有满足条件的x才会进入表达式计算。


3.2 字典推导式 (Dictionary Comprehensions)

除了列表,Python 也允许你快速构建字典。

语法:

{键表达式:值表达式for变量in可迭代对象}

注意这里使用的是花括号{},并且包含冒号:来分隔键和值。

示例:将列表转换为字典
假设你有两个列表,一个是名字,一个是年龄,你想把它们合并成一个字典。

names=['Alice','Bob','Charlie']ages=[24,30,18]# 使用 zip 函数将两个列表打包user_dict={name:ageforname,ageinzip(names,ages)}print(user_dict)# 输出: {'Alice': 24, 'Bob': 30, 'Charlie': 18}

示例:筛选字典
提取所有年龄大于 20 的用户:

adults={name:ageforname,ageinuser_dict.items()ifage>20}print(adults)# 输出: {'Alice': 24, 'Bob': 30}

3.3 集合推导式 (Set Comprehensions)

集合(Set)的特点是无序且不重复。集合推导式的语法与字典推导式非常相似,也是使用花括号{},但没有冒号

语法:

{表达式for变量in可迭代对象}

示例:由列表生成去重后的集合

raw_data=[1,2,2,3,4,4,5]# 提取数据并计算平方,自动去重unique_squares={x*xforxinraw_data}print(unique_squares)# 输出: {1, 4, 9, 16, 25} (顺序可能不同,因为集合是无序的)

3.4 特别篇:生成器表达式 (Generator Expressions)

这是一个经常被初学者忽略但极其重要的概念。如果你将列表推导式的方括号[]换成圆括号(),你得到的不是元组(Tuple),而是一个生成器(Generator)

语法:

(表达式for变量in可迭代对象)

区别在于内存占用:

  • 列表推导式:一次性生成所有数据,放入内存。如果数据量有一亿条,内存可能会爆掉。
  • 生成器表达式惰性求值(Lazy Evaluation)。它不会立刻计算结果,而是当你需要下一个数据时(比如在循环中),它才临时计算。

示例:

# 创建生成器gen=(x*xforxinrange(5))print(gen)# 输出: <generator object <genexpr> at 0x...> (看不到具体数据)# 获取数据forvalingen:print(val)# 依次输出: 0, 1, 4, 9, 16

最佳实践:如果你处理的数据量非常大,或者你只需要遍历一次数据,请优先使用生成器表达式。


4. 常见误区与注意事项

虽然推导式很强大,但“能力越大,责任越大”。以下是初学者容易犯的错误:

4.1 避免过度嵌套

推导式可以嵌套(即推导式里套推导式),但这会极大地降低代码的可读性。

反面教材(难以阅读):

# 扁平化一个矩阵matrix=[[1,2,3],[4,5,6],[7,8,9]]flat=[numforrowinmatrixfornuminrow]# 这种双重循环在一行里很容易看晕

如果逻辑超过了两层循环或包含了复杂的条件判断,请直接使用普通的for循环。代码是写给人看的,不仅仅是给机器执行的。

4.2 别为了“炫技”而使用

不要在推导式中执行带有“副作用”的操作(例如print()函数)。推导式的初衷是创建新的数据结构,而不是用来执行流程控制。

错误示范:

[print(x)forxinrange(5)]# 这是一个糟糕的写法!

正确做法:

forxinrange(5):print(x)

5. 总结

恭喜你!你已经掌握了 Python 中提升代码质量的利器。让我们回顾一下核心要点:

  1. 列表推导式[...]:最常用的替代for循环创建列表的方法。
  2. 字典推导式{k:v ...}:快速构建或转换字典。
  3. 集合推导式{...}:用于去重和集合运算。
  4. 生成器表达式(...):节省内存,适合处理大数据。
  5. 核心原则:保持简洁。如果一行代码写不下或读不懂,就换回普通的循环。

下一步行动建议:
打开你之前的 Python 代码,找出一个使用了for循环和append来创建列表的地方,尝试将其重构为列表推导式。这将是你迈向 Python 高手的第一步!

结尾
  • 希望对初学者有帮助;致力于办公自动化的小小程序员一枚
  • 希望能得到大家的【❤️一个免费关注❤️】感谢!
  • 求个 🤞 关注 🤞 +❤️ 喜欢 ❤️ +👍 收藏 👍
  • 此外还有办公自动化专栏,欢迎大家订阅:Python办公自动化专栏
  • 此外还有爬虫专栏,欢迎大家订阅:Python爬虫基础专栏
  • 此外还有Python基础专栏,欢迎大家订阅:Python基础学习专栏

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/4 4:08:38

2026AI面相最新版小程序源码 无限多开版

内容目录一、详细介绍二、效果展示1.部分代码2.效果图展示三、学习资料下载一、详细介绍 详情内容 AI面相系统可以通过你上传的清晰正面、五官清晰、不戴眼镜、面部完整显现、无刘海遮挡照片&#xff0c;先进行扫描照片面部特征&#xff0c;头部姿势、左眼状态、右眼状态无误&…

作者头像 李华
网站建设 2026/4/13 16:47:35

关于springAOP的总结

12.4号14&#xff1a;01我终于整理完笔记&#xff0c;理清了所有知识点。 关于spring的两大核心&#xff1a;Ioc和AOP AOP的底层&#xff1a;动态代理技术 为什么要有AOP&#xff1f; 一般一个系统当中都会有一些系统服务&#xff0c;例如&#xff1a;日志、事务管理、安全等。…

作者头像 李华
网站建设 2026/4/9 17:30:35

TinyMCE支持整站程序word导入功能扩展实现

没有任何限制的在任何产品中使用&#xff0c;完全开放产品源代码。 今儿一早&#xff0c;又有位网友“神通广大”地加了我微信&#xff0c;说是想探探这块技术的底儿&#xff0c;聊聊解决方案。原来&#xff0c;这位老兄也撞上了在富文本编辑器里粘贴Word图片自动上传的“小怪…

作者头像 李华
网站建设 2026/4/11 21:17:49

百度WebUploader大文件上传插件的使用教程

一个前端老鸟的"求生"之路&#xff1a;大文件上传项目实录 各位前端江湖的兄弟姐妹们&#xff0c;我是老张&#xff0c;一个在甘肃苦哈哈写代码的"前端农民工"。最近接了个"史诗级"外包项目&#xff0c;客户要求之多让我这个老程序员差点把假发…

作者头像 李华
网站建设 2026/4/5 21:20:40

Anaconda环境变量优先级对PyTorch的影响

Anaconda环境变量优先级对PyTorch的影响 在深度学习项目中&#xff0c;你是否遇到过这样的场景&#xff1a;明明装了GPU、驱动也正常&#xff0c;nvidia-smi 能看到显卡&#xff0c;但一运行 PyTorch 代码&#xff0c;torch.cuda.is_available() 却返回 False&#xff1f;更奇…

作者头像 李华