HOWTO · Python

如何在 Python 中将函数应用于列表

在 Python 中将函数应用于列表主要有 4 种方法:for 循环、map() 函数、列表推导式和生成器表达式。

本页内容

要将函数应用于 Python 列表中的每一个元素,就对每个元素调用该函数,并收集返回的值。例如,将每个数字乘以 10,就会把 [1, 2, 3, 4] 变成 [10, 20, 30, 40]。你可以使用 for 循环、map()、列表推导式或生成器表达式。下面的示例使用相同的函数和输入,方便你比较每种方法是如何生成或提供结果的。

使用 for 循环将函数应用于 Python 中的列表

for 循环让每一步都一目了然:创建一个结果列表,对每个输入调用函数,并把每个返回值追加进去。当循环需要额外的语句或分支时,这种方法很有用。下面的示例将函数应用于每个数字,并打印结果列表。

def multiply_by_ten(number):
    return 10 * number


numbers = [1, 2, 3, 4]
results = []

for number in numbers:
    results.append(multiply_by_ten(number))

print(results)

这个循环不会改变 numbers,而是把 results 构建为一个单独的列表。你可以修改函数体,来对自己的数据执行所需的转换。

使用 map() 函数将函数应用于 Python 中的列表

Python 的 map() 函数 接受一个可调用对象和一个可迭代对象,然后逐个产出该可调用对象对每个元素的结果。在 Python 3 中,map() 返回一个迭代器;当其余代码需要列表时,把它包装在 list() 中。

def multiply_by_ten(number):
    return 10 * number


numbers = [1, 2, 3, 4]
results = list(map(multiply_by_ten, numbers))
print(results)

当你已经有一个要应用的函数时,这种形式很简洁。迭代器会随着 list() 请求它的值而被消耗;如果你需要再次遍历这些值,就保留结果列表,或者再创建一个迭代器。

使用列表推导式将函数应用于 Python 中的列表

列表推导式 通过把每个元素的表达式放在 for 子句之前来构建一个新列表。它是 Python 的语言结构,而不是方法,在转换可以清晰地写在一行之内时,它是一种紧凑的选择。

def multiply_by_ten(number):
    return 10 * number


numbers = [1, 2, 3, 4]
results = [multiply_by_ten(number) for number in numbers]
print(results)

表达式 multiply_by_ten(number) 决定每一个结果,而 for 子句提供每一个输入元素。当只应包含选定的元素时,推导式还可以带上一个条件。

使用生成器表达式将函数应用于 Python 中的列表

生成器表达式 是在类似推导式的表达式外加上圆括号。它在被请求时惰性地产出值,而不是立即构建一个结果列表。这样可以避免一次性保存所有转换后的值,不过把生成器转换为列表会使这些值具象化。

def multiply_by_ten(number):
    return 10 * number


numbers = [1, 2, 3, 4]
results = (multiply_by_ten(number) for number in numbers)
print(list(results))

每个值都是在迭代过程中生成的。生成器在被遍历时会逐渐消耗完,因此对同一个生成器进行第二次遍历不会重复产出这些值;如果你需要重复使用它们,就创建一个新的生成器,或者把值存入列表。

结论

当你希望明确地控制每一步时,选择 for 循环;当把一个现成的函数应用于可迭代对象是很自然的做法时,使用 map()。列表推导式用简洁的语法直接创建一个新列表。当你希望惰性迭代、并且不需要一次性具象化每一个结果时,使用生成器表达式。这四种方法既可以调用内置函数,也可以调用你自己定义的函数;例如,推导式可以用 [str(item) for item in numbers] 把 str 应用于每个元素。