一、一个平平无奇的 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 技术干货!如果觉得有用,记得收藏本文!