Python 列表推导式:让你的代码更优雅、更高效

一、一个平平无奇的 for 循环

想象一个简单的任务:我们有一个数字列表 [1, 2, 3, 4, 5],现在想得到一个新列表,其中每个数字都是原列表数字的平方。

按照我们最熟悉的思路,你会这样写:

python 复制代码
numbers = [1, 2, 3, 4, 5]
squared_numbers = []  # 1. 先创建一个空列表

for num in numbers:  # 2. 遍历原列表
    squared_numbers.append(num * num)  # 3. 计算平方并添加进去

print(squared_numbers)
# 输出: [1, 4, 9, 16, 25]

二、列表推导式的真面目

同样的需求,用列表推导式来写,只需要一行:

python 复制代码
numbers = [1, 2, 3, 4, 5]
squared_numbers_new = [num * num for num in numbers]

print(squared_numbers_new)
# 输出: [1, 4, 9, 16, 25]

解析

[<表达式> for <元素> in <可迭代对象>]

  • []:首先,它被一对方括号包围,这明确告诉Python:"嘿,我要创建一个新列表!"
  • <表达式> (num * num):这是你希望对每个元素进行的操作。可以是计算、调用函数,或者任何能返回一个值的表达式。
  • for <元素> in <可迭代对象> (for num in numbers):这部分和你熟悉的 for 循环几乎一模一样,它负责从源(numbers列表)中逐个取出元素(num)。

三、加入if筛选

列表推导式的强大之处不止于此。假设我们只想计算偶数的平方,怎么办?

传统的 for 循环需要加一个 if 判断:

python 复制代码
numbers = [1, 2, 3, 4, 5]
even_squared_numbers = []

for num in numbers:
    if num % 2 == 0:  # 如果是偶数
        even_squared_numbers.append(num * num)

print(even_squared_numbers)
# 输出: [4, 16]

而在列表推导式中,我们只需要在末尾加上 if 条件即可:

python 复制代码
numbers = [1, 2, 3, 4, 5]
even_squared_numbers = [num * num for num in numbers if num % 2 == 0]

print(even_squared_numbers)
# 输出: [4, 16]

语法变成了:[<表达式> for <元素> in <可迭代对象> if <条件>]

这个 if 就像一个过滤器,只有满足条件的元素才会被加工并放入新列表。

四、更进一步的if-else

那如果我想对不同条件的元素做不同的处理呢?比如,把偶数变成它的平方,奇数变成它的相反数。

这时,if-else就要登场了。但要注意,它的位置和单纯的 if 筛选不一样。

python 复制代码
numbers = [1, 2, 3, 4, 5]
transformed_numbers = [num * num if num % 2 == 0 else -num for num in numbers]

print(transformed_numbers)
# 输出: [-1, 4, -3, 16, -5]

它的语法是:[<为真时的表达式> if <条件> else <为假时的表达式> for <元素> in <可迭代对象>]

这里的 if-else 构成了一个三元运算符 ,它必须放在 for 循环的前面,因为它决定了表达式本身的值。

结语

点个赞,关注我获取更多实用 Python 技术干货!如果觉得有用,记得收藏本文!

相关推荐
Sakuraba Ema4 分钟前
从零理解 MoE(Mixture of Experts)混合专家:原理、数学、稀疏性、专家数量影响与手写 PyTorch 实现
人工智能·pytorch·python·深度学习·数学·llm·latex
嫂子的姐夫11 分钟前
041-全扣补环境:同花顺
爬虫·python·js逆向·逆向
贼爱学习的小黄17 分钟前
NC BIP参照开发
java·前端·nc
小江的记录本21 分钟前
【MyBatis-Plus】MyBatis-Plus的核心特性、条件构造器、分页插件、乐观锁插件
java·前端·spring boot·后端·sql·tomcat·mybatis
2401_8942419223 分钟前
机器学习与人工智能
jvm·数据库·python
光影少年26 分钟前
如何进行前端性能优化?
前端·性能优化
vx-程序开发29 分钟前
springboot在线装修管理系统-计算机毕业设计源码56278
java·c语言·spring boot·python·spring·django·php
Dxy123931021632 分钟前
js如何把字符串转数字
开发语言·前端·javascript
爱写bug的野原新之助41 分钟前
爬虫之补环境:加载原型链
前端·javascript·爬虫
进击的雷神1 小时前
主办方过滤、展位号模糊提取、多层级官网爬取、缅文编码解码——缅甸塑料展爬虫四大技术难关攻克纪实
网络·爬虫·python