说明
《Python 教程》 持续更新中,提供建议、纠错、催更等加作者微信: gairuo123(备注:pandas教程)和关注公众号「盖若」ID: gairuo。跟作者学习,请进入 Python学习课程。欢迎关注作者出版的书籍:《深入浅出Pandas》 和 《Python之光》。
map() 函数的作用是将给定的函数应用于 iterable 的每一项(列表、元组等),并返回结果列表。可以使用嵌入函数(内置函数)、lambda(拉姆达式、无名函数)、def 中定义的函数等应用到所有元素中。
它的语法如下:
map(function, iterable, ...)
map() 的参数:
可以向 map 函数传递多个 iterable,对应的函数也要接受相同序列数量的参数,如果 iterable 的数量不一样,则取短板,其余的放弃。function 可以使用匿名函数 lambda。
返回一个将 function 应用于 iterable 中每一项并输出其结果的迭代器。 如果传入了额外的 iterable 参数,function 必须接受相同个数的实参并被应用于从所有可迭代对象中并行获取的项。 当有多个可迭代对象时,最短的可迭代对象耗尽则整个迭代就将结束。
将给定的函数应用于可迭代对象的每一项,并返回结果列表,返回的结果是一个 map object(map 对象),可以将 map object 传递给 list()(创建列表)、set()(创建集合)等函数以显示和应用结果。
以下是一些案例。
# 单个对象
def add_1(x):
return x + 1
m = map(add_1, [1,2,3,4])
list(m)
# [2, 3, 4, 5]
函数处理的序列可以是多个,这样帮我个省去了 zip 操作:
# 多个对象
def add_num(x, y):
return x + y
m = map(add_num, [1,2,3,4], [1,2,3,4])
list(m)
# [2, 4, 6, 8]
多个序列如果长度不一样,只会处理到最短的元素位置:
# 对象不同长度
def add_num(x, y):
return x + y
m = map(add_num, [1,2,3,4], [1, 2])
list(m)
# [2, 4]
有几个序列,函数就要承接几个参数:
def add_num(x, y, z):
return x + y + z
l1 = [1, 2, 3]
[*map(add_num, l1, l1, l1)]
[3, 6, 9]
# 匿名函数
m = map(lambda x,y: x+y, [1,2,3,4], [1, 2])
list(m)
# [2, 4]
对于函数的输入已经是参数元组的情况,可以 使用 itertools.starmap() 操作。它创建一个迭代器,使用从可迭代对象中获取的参数来计算该函数。当参数对应的形参已从一个单独可迭代对象组合为元组时(数据已被“预组对”)可用此函数代替 map()。map() 与 starmap() 之间的区别可以类比 function(a,b)
与 function(*c)
的区别。
import itertools
t = [(2,5), (3,4)]
# 元组内操作(相乘)
sm = itertools.starmap(lambda x,y: x*y, t)
list(sm)
# [10, 12]
详见: itertools.starmap() 。
map 的功能可以用列表表达式来代替:
l = [-2, -1, 0]
[abs(x) for x in l]
# [2, 1, 0]
[x**2 for x in l]
# [4, 1, 0]
l_1 = [1, 2, 3]
l_2 = [10, 20, 30]
[x * y for x, y in zip(l_1, l_2)]
# [10, 40, 90]
在大多数情况下,与 map 相比,使用列表生成器式更简洁明了,但也有人认为 map 作为高阶函数,能更加突出函数,弱化了循环的表达,让处理逻辑看起来更加明显。
在数据科学中,不需要按 map 模式的计算,两个序列之间的操作被认为是一个矩阵计算,NumPy 可以非常好地完成这些,比 map() 和列表表示更为明确。
import numpy as np
a = np.array([-2, -1, 0])
print(np.abs(a))
# [2 1 0]
print(a**2)
# [4 1 0]
a_1 = np.array([1, 2, 3])
a_2 = np.array([10, 20, 30])
print(a_1 * a_2)
# [10 40 90]
对于大规模的列表的处理和复杂的处理NumPy更快。NumPy还提供各种函数,所以在进行以数值排列为对象的处理的情况下可以尝试一下,可参考NumPy 教程。
更新时间:2024-07-04 09:33:35 标签:python map