python:列表推导式(List Comprehension)

用一行代码,描述'如何从一个集合生成另一个集合'。

一、最基础形式

传统写法

python 复制代码
result = []
for x in range(10):
    result.append(x * 2)

列表推导式

python 复制代码
result = [x * 2 for x in range(10)]

👉 可读性 + 简洁度 + 性能,都更好

range是什么?
range 是 Python 内置的"序列生成器"类型,不是关键字,是一个 内置类(type)。

作用:用来生成一段"整数序列",通常配合 for 循环 / 推导式使用。

py 复制代码
range(start, stop, step)
# 从 start 开始
# 每次加 step
# 直到但不包含 stop

二、基本语法结构(记住这个模板)

python 复制代码
[表达式 for 变量 in 可迭代对象]

例子:

python 复制代码
[x ** 2 for x in [1, 2, 3, 4]]

三、加条件(非常常用)

1️⃣ 过滤条件(if 在后)

python 复制代码
[x for x in range(10) if x % 2 == 0]

👉 含义:

"从 0~9 中,取所有偶数"


2️⃣ 条件表达式(三元运算)

python 复制代码
["even" if x % 2 == 0 else "odd" for x in range(5)]

👉 注意顺序:

python 复制代码
[结果 if 条件 else 结果 for x in ...]

⚠️ 很多人写反


四、嵌套循环(等价双重 for)

python 复制代码
pairs = [(x, y) for x in [1, 2] for y in [3, 4]]
# [(1, 3), (1, 4), (2, 3), (2, 4)]

等价于:

python 复制代码
pairs = []
for x in [1, 2]:
    for y in [3, 4]:
        pairs.append((x, y))

👉 顺序 从左到右


五、常见"高级用法"(工程里真的用)

1️⃣ 字符串处理

python 复制代码
names = [" Tom ", "Jerry ", " spike"]
clean = [name.strip().title() for name in names]
# ['Tom', 'Jerry', 'Spike']

2️⃣ 类型转换

python 复制代码
nums = ["1", "2", "3"]
nums = [int(x) for x in nums]
# [1, 2, 3]

3️⃣ 扁平化二维列表

python 复制代码
matrix = [[1, 2], [3, 4], [5, 6]]
flat = [x for row in matrix for x in row]
# [1, 2, 3, 4, 5, 6]

4️⃣ 过滤 None / 空值

python 复制代码
data = [1, None, 2, "", 3]
clean = [x for x in data if x]

六、不只是列表:推导式家族

Python 有 4 种推导式

1️⃣ 列表推导式

python 复制代码
[x for x in range(5)]

2️⃣ 集合推导式

python 复制代码
{x for x in [1, 2, 2, 3]}

3️⃣ 字典推导式

python 复制代码
{k: v for k, v in [("a", 1), ("b", 2)]}

4️⃣ 生成器表达式(省内存)

python 复制代码
(x * 2 for x in range(10))

👉 不是列表,是惰性计算


七、性能 & 可读性(非常关键)

为什么比 for + append 快?

  • 内部实现更优化
  • 减少 Python 层函数调用

但不是越复杂越好

❌ 不推荐:

python 复制代码
[x for x in data if x > 0 if x % 2 == 0 if x < 100]

✅ 推荐拆开:

python 复制代码
result = []
for x in data:
    if x > 0 and x % 2 == 0 and x < 100:
        result.append(x)

👉 可读性永远第一


八、什么时候不该用列表推导式?

❌ 以下情况请用普通 for:

  • 多行逻辑
  • 有 try / except
  • 有复杂 if / else
  • 有副作用(打印、写文件)

相关推荐
人道领域1 分钟前
【零基础学java】(等待唤醒机制,线程池补充)
java·开发语言·jvm
智算菩萨4 分钟前
【Python自然语言处理】基于NLTK库的英文文本词频统计系统实现原理及应用
开发语言·python·自然语言处理
superman超哥7 分钟前
Rust 异步并发核心:tokio::spawn 与任务派发机制深度解析
开发语言·rust·编程语言·rust异步并发核心·rust任务派发机制
喵星人工作室8 分钟前
C++传说:神明之剑0.2.1
开发语言·c++·游戏
黎雁·泠崖9 分钟前
Java入门之吃透基础语法:注释+关键字+字面量+变量全解析
java·开发语言·intellij-idea·intellij idea
Ashley_Amanda11 分钟前
Python 常见问题梳理
开发语言·windows·python
UpgradeLink14 分钟前
基于 Go 打造的升级链路管理平台:upgradelink 让设备升级更简单
开发语言·后端·golang
比奇堡的猪猪15 分钟前
修改默认conda环境(在win中)
python·conda
天府之绝16 分钟前
uniapp 中使用uview表单验证时,自定义扩展的表单,在改变时无法触发表单验证处理;
开发语言·前端·javascript·vue.js·uni-app
萧鼎26 分钟前
深入解析 Python 的 Word 模板引擎:docxtpl 全面指南
开发语言·python·word