Python map() 函数

Python map() 语法

map() 是 Python 的一个内置高阶函数,它接收一个函数和一个可迭代对象作为参数。map() 函数在对可迭代对象遍历的同时,会对每一个元素进行 “相同操作”,然后将处理完成之后的元素添加到新的可迭代对象中去。

语法:

map(function, iterable1, iterable2, ..., iterableN)

说明:

map() 函数接收以下 2 个参数。

  • function(必选):它是一个函数名。
  • iterable(必选,可多个):它是一个可迭代对象。Python 内置的可迭代对象有列表、元组、字符串、字典、集合等。当传入多个可迭代对象时,函数需能接收相应数量的参数。

map(function, iterable) 表示将 iterable 中的每一个元素依次传入 function 进行 “处理”,元素被处理完成之后会添加到一个新的可迭代对象中去。

map() 函数最终会返回一个新的可迭代对象,然后你可以使用 list() 函数将这个可迭代对象转化为一个列表。

提示:

  • map() 是一个高阶函数。Python 内置的高阶函数只有 2 个:filter()、map()。而 reduce() 属于 functools 模块。
  • map() 返回的是一个迭代器,它采用的是惰性求值,在需要时才生成结果,这对于处理大型数据集非常高效。

Python map() 摘要

使用频率
时间复杂度 O(1)
官方文档 查看

Python map() 示例

接下来,我们通过几个简单的例子来讲解一下 Python map() 函数是如何使用的。

示例 1:map() 基本用法

# 定义函数
def fn(n):
    return n * 2

# 定义可迭代对象
items = [3, 9, 1, 14, 50, 21]

# 调用 map() 函数
result = map(fn, items)
print(list(result))

运行结果如下。

[6, 18, 2, 28, 100, 42]

分析:

上面其实是使用 map() 函数使得 items 中的每一个元素乘以 2,然后返回一个新的列表。

示例 2:map() 结合 lambda 表达式

# 定义可迭代对象
items = [3, 9, 1, 14, 50, 21]

# 调用 map() 函数,并使用 lambda 表达式
result = map(lambda x: x*2, items)
print(list(result))

运行结果如下。

[6, 18, 2, 28, 100, 42]

示例 3:map() 处理多个可迭代对象

prices = [100, 200, 300]
discounts = [0.1, 0.2, 0.15]
final_prices = map(lambda p, d: p*(1-d), prices, discounts)
print(list(final_prices)) 

运行结果如下。

[90.0, 160.0, 255.0]

分析:

在上面代码中,我们使用 map() 函数和 lambda 表达式,将 prices 列表中的每个价格与 discounts 列表中的对应折扣率结合,计算每个商品的最终价格。

具体来说,lambda p, d: p*(1-d) 定义了价格和折扣的计算公式,map() 函数将这一公式应用到 prices 和 discounts 的每一对元素上,生成最终价格列表。

示例 4:map() 应用于类型转换

nums = ['10', '8', '25']
result = map(int, nums)
print(sum(result))

运行结果如下。

43

分析:

在上面代码中,我们首先使用 map(int, nums) 将字符串列表 nums 中的每个元素转换为整数,生成一个整数迭代器 result。然后,使用 sum() 函数对转换后的整数列表求和,最终输出结果为 43(10 + 8 + 25)。

深入理解 map()

深入理解 map() 的高级特性,可以帮助我们更好地利用 map() 来优化代码。

1. 惰性求值

map() 函数最明显的特点就是它返回的是一个迭代器(map 对象),而不是一个立马就包含所有结果的列表。也就是说,map() 并不会在函数被调用时就立即计算所有结果,它只是创建了一个 “蓝图”,告诉 Python 如何在将来生成这些结果。实际的计算只会在你真正迭代这个 map 对象时才会发生。

这种 “按需计算” 的特性叫做 “惰性求值(lazy evaluation)” 。它能够显著节省内存,尤其是在处理庞大的数据集时,因为你不需要一次性把所有结果都加载到内存中。

比如在下面代码中,map() 返回的是一个迭代器,并不会立即计算所有值,而只有在调用 list(result) 时才会生成结果 [2, 4, 6]。

result = map(lambda x: x * 2, [1, 2, 3])
print(list(result))      # 输出 : [2, 4, 6]

2. 长度截断

当我们给 map() 函数传入多个可迭代对象时,它会并行地从每个对象中取出对应位置的元素,并将它们作为参数传递给 function。

如果这些可迭代对象的长度不一致,map() 会以最短的那个可迭代对象的长度为准,当最短的那个可迭代对象被完全遍历后,map() 就会停止,并忽略其他可迭代对象中多余的元素。

比如在下面代码中,map(lambda x, y: x + y, [1, 2], [3, 4, 5]) 只会处理前两个元素,因此结果为 [4, 6]。

result = map(lambda x, y: x + y, [1, 2], [3, 4, 5])
print(list(result))      # 输出 : [4, 6]

3. 内存优化

map() 函数适合处理大型数据集,这是因为它返回的是迭代器,而不是一次性生成完整的列表。这种惰性求值的方式可以避免内存的过度占用,特别适合处理流式数据或大规模数据。

result = map(lambda x: x ​**​ 2, range(5))
print(list(result))      # 输出 : [0, 1, 4, 9, 16]

4. 类型保持

map() 函数返回的迭代器会保持输入元素的顺序和数量。也就是说,输出结果的顺序与输入的顺序一致,且结果的数量与最短的输入可迭代对象的长度相同。

比如在下面代码中,map(lambda x: x * 2, [1, 2, 3]) 会返回 [2, 4, 6],顺序和数量都与输入一致。

result = map(lambda x: x * 2, [1, 2, 3])
print(list(result))      # 输出 : [2, 4, 6]

上一篇: zip()

下一篇: filter()

给站长反馈

绿叶网正在不断完善中,小伙伴们如果发现任何问题,还望多多给站长反馈,谢谢!

邮箱:lvyenet@vip.qq.com

「绿叶网」服务号
绿叶网服务号放大
关注服务号,微信也能看教程。
绿叶网服务号