Python 推导式:让代码简洁如诗的魔法技巧

阅读此文:你将知道怎么使用推导式、什么时候用、有哪些注意事项?

🌈Hi,小伴们~关注我,将持续分享Python 实用技巧 与 干货案例

今天我们要聊一个Python中特别酷炫的语法——推导式(Comprehension)

初学者可能会觉得它有点复杂,但一旦掌握,便会爱不释手,它能让你的代码简洁到飞起!

什么是推导式?

🎯推导式:是Python中一种优雅且高效的创建数据结构的方式。它可以用一行代码就实现多行循环的功能,让你的代码更加简洁、易读

简单来说,推导式就是” 一行代码搞定循环 + 条件判断 + 数据生成 “ 的语法糖

推导式适用哪些对象?

☘️凡是可迭代的对象都能用推导式,那什么是可迭代对象?简单理解就是能用for进行循环的对象(如:列表、集合、字典、元组、字符串、range对象等)

以列表为例讲解展示

列表推导式(List Comprehension):是Python中一种高效创建列表的方式 

列表推导式的基本结构包含以下3部分内容:

图片

①表达式:将可迭代对象中取出的变量进行处理,它的形式可以是一个计算式、也可以是一个函数

②迭代循环体:for循环从可迭代对象中取出变量

③条件判断:对从循环体中取出的变量进行筛选判断

🔑看一个简单例子领略一下它的魅力:假设我们需要将列表的数字翻倍*2

🏐传统写法:

# 利用for循环逐个遍历列表元素*2
numbers = [1, 3, 5, 7, 9]
new_numbers = []
for number in numbers:
    result = numbers * 2
    new_numbers.append(result)

🏀列表推导式写法:

new_numbers = [number * 2 for number in numbers]

是不是简洁多了?实现过程类似下图所示:

图片

列表推导式的常见使用场景

1. 简单转换

🌱代码示例:将0~9的数字转换为它们的平方

squares = [x**2 for x in range(10)]
print(squares)  
# 输出:[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]

备注:range(10)生成的序列是半开区间,即包含起始值,但不包含结束值。如range(start, stop) 会生成从 start 到 stop - 1 的整数序列,start不写默认为0

2. 利用函数转换

🌱代码示例:利用函数将0~9的数字转换为它们的平方

#定义函数
def square(n):
    return n ** 2

[square(x) for x in range(5)]  
# 表达式是square(x)函数

备注:将调用函数作为表达式时,要注意调用函数的内部逻辑要尽可能的简单且不易产生报错的场景

3. 添加条件进行过滤

🌱代码示例:获取0~9中的所有偶数

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

备注:if条件判断筛选符合条件的元素,在条件判断里不能加else,加else变成三元运算符需放在前面的表达式中,对生成的结果进行处理

❌ 错误尝试:在条件过滤位置用 if-else

# 语法错误!条件过滤部分不能用else
invalid = [x for x in range(5) if x % 2 == 0 else -1]  
#                           ^ 这里只能用if,不能带else ^
✅ 正确写法:将 if-else 移到表达式部分
valid = [x if x % 2 == 0 else -1 for x in range(5)]  # 正确
# 偶数保留原值,奇数替换为-1 
print(numbers)  
# 输出: [0, -1, 2, -1, 4](所有元素都存在)
4. 复杂转换与过滤

🌱代码示例:获取 0~9 中的偶数且大于 2 的数字进行平方

evens_gt_2 = [x*2 for x in range(10) if x % 2 == 0  if x > 2]
print(evens_gt_2)  
# 输出:[8, 12, 16]

备注:多条件判断的开展顺序是从左至右(从最靠近数据源的开始)

5. 多重循环嵌套

🌱代码示例:生成一个乘法表矩阵

multiplication_table = [[i*j for j in range(1, 4)] for i in range(1, 4)]
for row in multiplication_table:
    print(row)
#输出:
[1, 2, 3]
[2, 4, 6]
[3, 6, 9]

备注:多种循环嵌套时外层嵌套的优先级更高

图片

循环生成的过程示意图如下:

图片

四、集合推导式

🌱代码示例:创建一个包含字符串长度的集合

words = ["apple", "banana", "cherry"]
word_lengths = {len(word) for word in words}
print(word_lengths)  
# 输出:{5, 6} (集合自动去重)

备注:集合推导式能自动去除重复的内容,有去重的功能

五、元组推导式(生成器推导式)

🌱代码示例:创建一个生成器,惰性计算平方数

squares_gen = (x**2 for x in range(10))
print(squares_gen)  
# 输出:<generator object <genexpr> at 0x...>
print(list(squares_gen))  
# 输出:[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]

备注:元组推导式与生成器推导式类似,生成器推导式属于延迟计算没那么占内存,在推导大数据集时适用(生成器在后面的文章中会介绍),若要强调是元组推导式生成的结果需用tuple()转化

六、字典推导式

🌱代码示例:创建一个单词与长度的映射字典

word_dict = {word: len(word) for word in words}
print(word_dict)  
# 输出:{'apple': 5, 'banana': 6, 'cherry': 6}

# 交换键值对
length_to_word = {length: word for word, length in word_dict.items()}
print(length_to_word)  
# 输出:{5: 'apple', 6: 'cherry'} (注意:相同键会覆盖)

备注:word_dict.items()返回所有键值对的视图对象,循环时key-value各自对应循环跌出相应遍历赋值给新key-value,要注意key的唯一性不要重复生成

🎈使用推导式的注意事项

  • 可读性优先:如果推导式过于复杂难以理解,优先考虑用传统循环方式

  • 避免副作用:不要在推导式中执行有副作用的操作(如打印、修改外部变量等)

  • 性能考虑:对于大数据集推导生成,利用生成器推导式会更节省内存

  • 嵌套限制:尽量避免推导式中包含多层嵌套(建议<3层)

⏳什么时候用推导式?

  • 处理简单的数据转换和过滤任务,推导式是理想选择

  • 代码简洁性比可读性更重要时,追求极简表达

  • 需要一次性生成整个序列时(生成器推导式除外)

🏁结语:

🚀掌握推导式是Python编程化繁为简的必由之路

七、轻松一下,挑战一道题

i = 5
lists = [i for i in range(i, i + 3)]
print(i)

  👉打印出的 i 的值是多少?评论区留言~

📌也可关注微信 公众号:“ Python-伍六七 ”,将持续输出Python 实用技巧 与 干货案例 !

简洁到飞起的列表推导式

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值