10.python3推导式——代码瘦身神器

2025博客之星年度评选已开启 10w+人浏览 1.6k人参与

推导式(Comprehension)是Python中一种简洁而强大的语法结构,用于创建列表、字典、集合等数据结构。它允许我们用一行代码来生成这些数据结构,比传统的循环方式更加简洁和易读。

目录

一、推导式

1. 列表推导式

2. 集合推导式

3. 字典推导式

4. 生成器推导式

二、复杂示例

三、表格总结:推导式速查

四、实战小案例(练手)


推导式的优势:

  1. 简洁性:相比传统循环,代码更短
  2. 可读性:对于简单操作,更容易理解意图
  3. 性能:通常比传统循环更快
  4. 功能性:可以在一行中完成过滤、转换等操作

一、推导式

1. 列表推导式

  • 基本格式:[表达式 for 变量 in 列表]
  • 带条件:[表达式 for 变量 in 列表 if 条件]
  • 多重循环:[表达式 for 变量1 in 列表1 for 变量2 in 列表2]

(1).基本格式:

# 生成1-5的平方列表
squares = [x**2 for x in range(1, 6)]
print(squares) #输出:[1, 4, 9, 16, 25]


# 传统写法:使用for循环生成1-5的平方列表
squares = []
for x in range(1, 6):
    squares.append(x**2)
print(squares)  # 输出:[1, 4, 9, 16, 25]

所以推导式与传统写法对比,把代码浓缩到了一行,简洁不少。

(2).带条件:找出1-10的偶数:


evens = [x for x in range(1, 11) if x % 2 == 0]
print(evens) #输出:[2, 4, 6, 8, 10]

(3).多重循环:两个列表的组合:


colors = ["红", "绿"]
fruits = ["苹果", "香蕉"]
combination = [c + f for c in colors for f in fruits]
print(combination)

#输出:
# ['红苹果', '红香蕉', '绿苹果', '绿香蕉']

关键点:多重循环等价于嵌套for循环,先循环外层再循环内层

2. 集合推导式

  • 格式:{表达式 for 变量 in 列表}(用花括号)
# 列表去重并转成集合
numbers = [1, 2, 2, 3, 3, 3, 4]
unique_set = {x for x in numbers}
print(unique_set)

# 找出1-10中的奇数集合
odd_set = {x for x in range(1, 11) if x % 2 != 0}
print(odd_set)

关键点:集合推导式自动去重,结果是一个集合

3. 字典推导式

  • 格式:{键:值 for 变量 in 列表}
  • 配合zip()打包两个列表
# 把两个列表组合成字典
keys = ["name", "age", "city"]
values = ["小明", 18, "北京"]
info = {k: v for k, v in zip(keys, values)}
print(info)

# 快速创建数字平方字典
squares_dict = {x: x**2 for x in range(1, 6)}
print(squares_dict)

关键点zip()函数把两个列表像拉链一样合并在一起

4. 生成器推导式

基本语法:(expression for item in iterable) (表达式 for 变量 in 可迭代对象)

生成器推导式(Generator Expression)圆括号包裹,与列表推导式(方括号)类似,,但返回的是一个生成器对象而不是列表:

squares_gen = (x**2 for x in range(1, 6))
print(squares_gen)  # <generator object <genexpr> at ...>
print(list(squares_gen))  # [1, 4, 9, 16, 25]

# 生成器是一次性的,用完即弃
print(list(squares_gen))  # [] - 再次调用得到空列表

二、复杂示例

# 嵌套推导式
matrix = [[i*j for j in range(1, 4)] for i in range(1, 4)]
print(matrix)  # [[1, 2, 3], [2, 4, 6], [3, 6, 9]]

# 使用多个for子句
pairs = [(x, y) for x in range(3) for y in range(3)]
print(pairs)  # [(0, 0), (0, 1), (0, 2), (1, 0), (1, 1), (1, 2), (2, 0), (2, 1), (2, 2)]

# 结合条件判断
filtered_pairs = [(x, y) for x in range(5) for y in range(5) if x < y]
print(filtered_pairs)  # [(0, 1), (0, 2), (0, 3), (0, 4), (1, 2), (1, 3), (1, 4), (2, 3), (2, 4), (3, 4)]

第一个嵌套式推导式分析:

1.这是嵌套的推导式,我们遇到的一个for循环是外层推导式,即for i in range(1, 4)

i 的取值依次为 1, 2, 3

2.对于每个 i 值,内层推导式:[i*j for j in range(1, 4)]

当 i=1 时:j 取 1,2,3,结果为 [11, 12, 1*3] = [1, 2, 3]

当 i=2 时:j 取 1,2,3,结果为 [21, 22, 2*3] = [2, 4, 6]

当 i=3 时:j 取 1,2,3,结果为 [31, 32, 3*3] = [3, 6, 9]

第二个for循环子句代码解释:

推导式的执行顺序,按照从左到右的顺序:

第一个 for x in range(3) 是外层循环,x 依次取值 0, 1, 2

第二个 for y in range(3) 是内层循环,- 对每个x值,y 依次取值 0, 1, 2

等价的传统嵌套循环:


pairs = []
for x in range(3):      # 外层循环
    for y in range(3):  # 内层循环
        pairs.append((x, y))

三、表格总结:推导式速查

类型

语法格式

示例

输出

适用场景

列表

[x for x in list]

[x*2 for x in range(3)]

[0,2,4]

生成新列表

带条件

[x for x in range(5) if x>2]

[3,4]

过滤数据

多重循环

[x+y for x in "ab" for y in "12"]

['a1','a2','b1','b2']

组合数据

集合

{x for x in list}

{x for x in [1,2,2]}

{1,2}

去重+集合

字典

{k:v for x in list}

{x:x*2 for x in range(3)}

{0:0,1:2,2:4}

键值对生成

推导式记住[结果 for 变量 in 列表 if 条件]

四、实战小案例(练手)

# 案例1:用推导式清洗数据
prices = ["  10元  ", "20元", "  30元  "]
clean_prices = [p.strip().replace("元", "") for p in prices]
print(f"清洗后:{clean_prices}")

# 案例2:找出1-100中能被7整除的数
result = [x for x in range(1, 101) if x % 7 == 0]
print(f"结果:{result}")

案例1代码详解:

for p in prices - 遍历列表中的每个元素
p 是列表中的每个字符串元素(如 " 10元 ")
p.strip() - 对每个字符串调用 strip() 方法,移除首尾空白字符
p.strip().replace("元", "") - 在去除空白后,再调用 replace() 方法替换掉"元"字

strip()和replace()是字符串的操作方法(需要了解更多字符串的欢迎查看7.2 Python3序列 | 字符串操作:常用方法与格式化技巧-CSDN博客

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值