map与starmap

map与starmap

在 Python 中,mapstarmap 都是用于将一个函数应用到可迭代对象(如列表、元组等)上,并返回结果。它们的主要区别在于处理输入参数的方式。

1. 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]

在这个例子中,mapadd 函数分别应用到 numbers1numbers2 的对应元素上,如 (1, 4), (2, 5), (3, 6),然后返回结果 [5, 7, 9]

2. 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 直接将每个元组解包成 ab,并传递给 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 时,元组会被自动解包,使得代码更加简洁。

你可能感兴趣的:(python)