列表推导式:Python简洁创建列表的技巧(适合初学者)

在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**2i*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的立方数、筛选列表中的负数等。多练几次,就能熟练掌握这种写法啦!

Xiaoye