介绍
我们可以使用 Python 内置函数 map()
将函数应用于迭代中的每个项目(如 list 或 dictionary)并返回一个新的迭代器检索结果。 map()
返回一个映射对象(一个迭代器),我们可以在程序的其他部分使用它。 我们还可以将映射对象传递给 list()
函数或其他序列类型,以创建一个可迭代对象。
map()
函数的语法如下:
map(function, iterable, [iterable 2, iterable 3, ...])
map()
函数没有使用 for 循环 ,而是提供了一种将函数应用于可迭代项中的每个项目的方法。 因此,它通常可以提高性能,因为它一次只应用一个项目,而不是将项目的副本复制到另一个可迭代的项目中。 这在处理大型数据集的程序时特别有用。 map()
还可以通过一次将每个可迭代项中的一项发送到函数来将多个可迭代项作为函数的参数。
在本教程中,我们将回顾使用 map()
的三种不同方式:使用 lambda
函数,使用用户定义的函数,最后使用使用多个可迭代参数的内置函数.
使用 Lambda 函数
map()
的第一个参数是一个函数,我们用它来应用于每个项目。 Python 为我们传递给 map()
的迭代中的每个项目调用一次该函数,并返回映射对象中的操作项目。 对于第一个函数参数,我们可以传递用户定义的函数,也可以使用 lambda
函数,尤其是在表达式不太复杂的情况下。
带有 lambda 函数的 map()
的语法如下:
map(lambda item: item[] expression, iterable)
使用如下列表,我们可以实现一个 lambda
函数,其中包含我们想要应用于列表中每个项目的表达式:
numbers = [10, 15, 21, 33, 42, 55]
要对我们的每个数字应用表达式,我们可以使用 map()
和 lambda
:
mapped_numbers = list(map(lambda x: x * 2 + 3, numbers))
在这里,我们将列表中的一个项目声明为 x
。 然后我们添加我们的表达式。 我们将数字列表作为 map()
的可迭代对象传入。
为了立即接收结果,我们打印 map
对象的列表:
print(mapped_numbers)
Output[23, 33, 45, 69, 87, 113]
我们使用了 list()
以便将地图对象作为列表返回给我们,而不是像 <map object at 0x7fc250003a58>
这样的不太可读的对象。 map 对象是我们结果的迭代器,因此我们可以使用 for
对其进行循环,也可以使用 list()
将其转换为列表。 我们在这里这样做是因为这是查看结果的好方法。
最终 map()
在处理大型数据集时最有用,因此我们可能会进一步处理地图对象,并且通常不会在它们上使用像 list()
这样的构造函数。
对于较小的数据集,列表推导可能更合适,但出于本教程的目的,我们使用一个小数据集来演示 map()
。
实现用户定义的函数
与 lambda
类似,我们可以使用我们定义的函数应用于可迭代对象。 虽然 lambda
函数在使用单行表达式时更有用,但当表达式变得复杂时,用户定义的函数更合适。 此外,当我们需要将另一条数据传递给要应用于可迭代的函数时,用户定义的函数可能是更好的可读性选择。
例如,在以下迭代中,每个项目都是一个字典,其中包含有关我们每个水族馆生物的不同详细信息:
aquarium_creatures = [ {"name": "sammy", "species": "shark", "tank number": 11, "type": "fish"}, {"name": "ashley", "species": "crab", "tank number": 25, "type": "shellfish"}, {"name": "jo", "species": "guppy", "tank number": 18, "type": "fish"}, {"name": "jackie", "species": "lobster", "tank number": 21, "type": "shellfish"}, {"name": "charlie", "species": "clownfish", "tank number": 12, "type": "fish"}, {"name": "olly", "species": "green turtle", "tank number": 34, "type": "turtle"} ]
我们已经决定所有的水族馆生物实际上都将进入同一个水箱。 我们需要更新我们的记录以反映我们所有的生物都在进入坦克 42
。 为了让 map()
访问每个字典和字典中的每个键:值对,我们构造了一个嵌套函数:
def assign_to_tank(aquarium_creatures, new_tank_number): def apply(x): x["tank number"] = new_tank_number return x return map(apply, aquarium_creatures)
我们定义了一个 assign_to_tank()
函数,它以 aquarium_creatures
和 new_tank_number
作为参数。 在 assign_to_tank()
中,我们将 apply()
作为函数传递给最后一行的 map()
。 assign_to_tank
函数将返回由 map()
生成的迭代器。
apply()
将 x
作为参数,它代表我们列表中的一个项目——单个字典。
接下来我们定义 x
是来自 aquarium_creatures
的 "tank number"
键,它应该存储传入的 new_tank_number
。 我们在应用新的罐号后退回每件物品。
我们用我们的字典列表和我们想要为每个生物替换的新坦克编号调用 assign_to_tank()
:
assigned_tanks = assign_to_tank(aquarium_creatures, 42)
函数完成后,我们将地图对象存储在 assigned_tanks
变量中,我们将其转换为列表并打印:
print(list(assigned_tanks))
我们将从该程序中收到以下输出:
Output[{'name': 'sammy', 'species': 'shark', 'tank number': 42, 'type': 'fish'}, {'name': 'ashley', 'species': 'crab', 'tank number': 42, 'type': 'shellfish'}, {'name': 'jo', 'species': 'guppy', 'tank number': 42, 'type': 'fish'}, {'name': 'jackie', 'species': 'lobster', 'tank number': 42, 'type': 'shellfish'}, {'name': 'charlie', 'species': 'clownfish', 'tank number': 42, 'type': 'fish'}, {'name': 'olly', 'species': 'green turtle', 'tank number': 42, 'type': 'turtle'}]
我们已经将新的坦克编号映射到我们的字典列表中。 使用我们定义的函数,我们可以合并 map()
以有效地将函数应用于列表的每个项目。
使用具有多个可迭代对象的内置函数
与 lambda
函数或我们自己定义的函数一样,我们可以将 Python 内置函数与 map()
一起使用。 要应用具有多个可迭代对象的函数,我们在第一个之后传入另一个可迭代名称。 例如,使用 pow() 函数 接受两个数字来找到所提供指数的底数的幂。
在这里,我们有我们想与 pow()
一起使用的整数列表:
base_numbers = [2, 4, 6, 8, 10] powers = [1, 2, 3, 4, 5]
接下来我们将 pow()
作为我们的函数传入 map()
并提供两个列表作为我们的迭代:
numbers_powers = list(map(pow, base_numbers, powers)) print(numbers_powers)
map()
将 pow()
函数应用于每个列表中的相同项目以提供电源。 因此,我们的结果将显示 2**1
、4**2
、6**3
等:
Output[2, 16, 216, 4096, 100000]
如果我们要为 map()
提供一个比另一个更长的可迭代对象,则 map()
将在到达最短可迭代对象的末尾时停止计算。 在下面的程序中,我们将 base_numbers
扩展为三个额外的数字:
base_numbers = [2, 4, 6, 8, 10, 12, 14, 16] powers = [1, 2, 3, 4, 5] numbers_powers = list(map(pow, base_numbers, powers)) print(numbers_powers)
结果,在这个程序的计算中什么都不会改变,所以它仍然会产生相同的结果:
Output[2, 16, 216, 4096, 100000]
我们已经将 map()
函数与 Python 内置函数一起使用,并且已经看到它可以处理多个迭代。 我们还审查了 map()
将继续处理多个迭代,直到它到达具有最少项目的迭代的末尾。
结论
在本教程中,我们学习了在 Python 中使用 map()
函数的不同方法。 现在您可以将 map()
与您自己的函数、lambda
函数以及任何其他内置函数一起使用。 您还可以使用需要多个可迭代的函数来实现 map()
。
在本教程中,我们将 map()
中的结果立即打印为列表格式以进行演示。 在我们的程序中,我们通常会使用返回的地图对象来进一步操作数据。
如果您想了解更多 Python,请查看我们的 How To Code in Python 3 系列和我们的 Python 主题页面。 要了解有关在函数式编程中使用数据集的更多信息,请查看我们关于 filter() 函数 的 文章。