Python map() 语法
map() 是 Python 的一个内置高阶函数,它接收一个函数和一个可迭代对象作为参数。map() 函数在对可迭代对象遍历的同时,会对每一个元素进行 “相同操作”,然后将处理完成之后的元素添加到新的可迭代对象中去。
语法:
map(function, iterable1, iterable2, ..., iterableN)说明:
map() 函数接收以下 2 个参数。
function(必选):它是一个函数名。iterable(必选,可多个):它是一个可迭代对象。Python 内置的可迭代对象有列表、元组、字符串、字典、集合等。当传入多个可迭代对象时,函数需能接收相应数量的参数。
map(function, iterable) 表示将 iterable 中的每一个元素依次传入 function 进行 “处理”,元素被处理完成之后会添加到一个新的可迭代对象中去。
map() 函数最终会返回一个新的可迭代对象,然后你可以使用 list() 函数将这个可迭代对象转化为一个列表。
提示:
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]