在Python中,我们经常需要创建列表。比如,想生成1到10的平方数,或者从一个列表中筛选出偶数。如果用传统的for循环和append()方法,代码可能会比较冗长。有没有更简单的方式呢?答案是:列表推导式!
什么是列表推导式?¶
列表推导式是Python中一种简洁创建列表的方法,它允许我们在一行代码中完成循环和元素处理,生成新的列表。简单来说,就是用更少的代码实现列表的创建。
为什么要用列表推导式?¶
举个例子:如果想生成1到10的平方数,传统方法需要写循环和append():
# 传统方法
squares = []
for i in range(1, 11): # 循环1到10
squares.append(i ** 2) # 计算平方并添加到列表
print(squares) # 输出:[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
而用列表推导式,只需一行代码:
# 列表推导式
squares = [i ** 2 for i in range(1, 11)]
print(squares) # 输出:[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
好处:代码更简洁、可读性更高,不需要重复写append(),一行搞定列表创建。
基本语法结构¶
列表推导式的核心格式是:
[表达式 for 变量 in 可迭代对象]
- 表达式:对变量的操作(比如
i**2、i*2、字符串处理等),最终结果会成为列表的元素。 - 变量:循环中的每个元素(比如
i,可以是任何合法的变量名)。 - 可迭代对象:能被循环遍历的对象(比如
range()、列表、元组等,常见的是range())。
不带条件的列表推导式¶
如果只想对可迭代对象中的每个元素做统一处理(无筛选),直接用基本语法即可。
例子1:生成1到10的平方数
squares = [i ** 2 for i in range(1, 11)]
print(squares) # 输出:[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
例子2:生成1到5的偶数倍
even_multiples = [i * 2 for i in range(1, 6)] # i从1到5,每个乘2
print(even_multiples) # 输出:[2, 4, 6, 8, 10]
带条件的列表推导式¶
如果需要筛选元素(比如只保留偶数),可以在语法后加上if 条件。格式变为:
[表达式 for 变量 in 可迭代对象 if 条件]
例子3:筛选1到10中的偶数
传统方法:
evens = []
for i in range(1, 11):
if i % 2 == 0: # 判断是否为偶数
evens.append(i)
print(evens) # 输出:[2, 4, 6, 8, 10]
列表推导式:
evens = [i for i in range(1, 11) if i % 2 == 0]
print(evens) # 输出:[2, 4, 6, 8, 10]
例子4:筛选大于3的偶数
result = [i for i in range(1, 11) if i > 3 and i % 2 == 0]
print(result) # 输出:[4, 6, 8, 10]
更灵活的表达式¶
列表推导式的“表达式”可以是任何合法的Python操作,比如字符串处理、函数调用等。
例子5:将列表中的名字转为大写
names = ['alice', 'bob', 'charlie']
upper_names = [name.upper() for name in names] # name.upper()是字符串大写方法
print(upper_names) # 输出:['ALICE', 'BOB', 'CHARLIE']
例子6:对列表中的数字取绝对值
numbers = [-1, 2, -3, 4, -5]
abs_numbers = [abs(num) for num in numbers] # abs()是取绝对值函数
print(abs_numbers) # 输出:[1, 2, 3, 4, 5]
注意:列表推导式 vs 生成器表达式¶
- 列表推导式:用
[],直接生成完整列表,占用内存。 - 生成器表达式:用
(),生成的是“惰性序列”,需逐个迭代,节省内存。初学者先掌握列表推导式即可。
总结¶
列表推导式的核心优势是简洁高效,能让代码更紧凑、可读性更强。通过对比传统循环和列表推导式,你会发现它能大幅减少代码量。
练习建议:尝试用列表推导式改写之前用for循环+append()的代码,比如生成1到20的立方数、筛选列表中的负数等。多练几次,就能熟练掌握这种写法啦!