在 Python 中,map
和 starmap
都是用于将一个函数应用到可迭代对象(如列表、元组等)上,并返回结果。它们的主要区别在于处理输入参数的方式。
map
函数map(function, iterable, ...)
map
会将提供的 function
应用于可迭代对象的每个元素,如果有多个可迭代对象,map
会将它们的元素组合起来并传递给 function
。假设我们有一个简单的函数,它将两个数相加:
def add(a, b):
return a + b
# 两个列表
numbers1 = [1, 2, 3]
numbers2 = [4, 5, 6]
# 使用 map
result = map(add, numbers1, numbers2)
print(list(result)) # 输出: [5, 7, 9]
在这个例子中,map
将 add
函数分别应用到 numbers1
和 numbers2
的对应元素上,如 (1, 4), (2, 5), (3, 6)
,然后返回结果 [5, 7, 9]
。
starmap
函数starmap(function, iterable)
starmap
来自 itertools
模块,它类似于 map
,但区别在于它期望传入的可迭代对象中的每个元素本身是一个元组或列表,并将元组/列表中的元素解包作为函数的多个参数传递。与 map
相同的函数和数据,但这次数据是打包成了元组的形式:
from itertools import starmap
def add(a, b):
return a + b
# 元组列表
numbers = [(1, 4), (2, 5), (3, 6)]
# 使用 starmap
result = starmap(add, numbers)
print(list(result)) # 输出: [5, 7, 9]
在这个例子中,starmap
直接将每个元组解包成 a
和 b
,并传递给 add
函数。
map
: 适合处理多个独立的可迭代对象,并将它们的元素传递给函数。starmap
: 适合处理包含元组或列表的单个可迭代对象,自动解包每个元组/列表的元素传递给函数。假设我们有一组坐标 (x, y)
,想要计算它们到原点的距离:
map
:import math
def distance(coord):
x, y = coord
return math.sqrt(x**2 + y**2)
coordinates = [(3, 4), (5, 12), (8, 15)]
# 需要自己解包元组
result = map(distance, coordinates)
print(list(result)) # 输出: [5.0, 13.0, 17.0]
starmap
:from itertools import starmap
def distance(x, y):
return math.sqrt(x**2 + y**2)
coordinates = [(3, 4), (5, 12), (8, 15)]
# starmap 自动解包
result = starmap(distance, coordinates)
print(list(result)) # 输出: [5.0, 13.0, 17.0]
在使用 map
时,我们需要在函数内部手动解包传入的元组。而使用 starmap
时,元组会被自动解包,使得代码更加简洁。