介绍
我们可以使用 Python 内置函数map()
将函数应用于可迭代对象(如列表或字典)中的每个项目,并返回一个新的迭代器以检索结果。map()
返回一个映射对象(一个迭代器),我们可以在程序的其他部分使用它。我们还可以将 map 对象传递给list()
函数或其他序列类型,以创建一个可迭代对象。
该map()
函数的语法如下:
map(function, iterable, [iterable 2, iterable 3, ...])
该函数没有使用for
循环,而是map()
提供了一种将函数应用于可迭代对象中的每个项目的方法。因此,它通常可以提高性能,因为它一次只应用一个项目,而不是将项目的副本复制到另一个可迭代对象中。这在处理大型数据集的程序中特别有用。map()
还可以通过一次从每个可迭代对象向函数发送一个项目,将多个可迭代对象作为函数的参数。
在本教程中,我们将回顾使用 的三种不同方式map()
:使用lambda
函数、使用用户定义的函数,最后使用使用多个可迭代参数的内置函数。
使用 Lambda 函数
的第一个参数map()
是一个函数,我们用它来应用于每个项目。Python 为我们传入的可迭代对象中的每个项目调用一次该函数map()
,并返回映射对象中被操作的项目。对于第一个函数参数,我们可以传递用户定义的函数,也可以使用lambda
函数,尤其是当表达式不太复杂时。
map()
with lambda 函数的语法如下:
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()
.
实现用户定义的函数
与 a 类似,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"}
]
我们已经决定所有的水族馆生物实际上都将搬到同一个水族箱中。我们需要更新我们的记录以反映我们所有的生物都在移动到 tank 中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
是"tank number"
from的键aquarium_creatures
,它应该存储传入的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
函数或我们自己定义的函数一样,我们可以使用带有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()
将继续处理多个可迭代对象,直到达到具有最少项目的可迭代对象的末尾。
结论
在本教程中,我们学习了map()
在 Python中使用该函数的不同方式。现在,您可以使用map()
自己的函数、lambda
函数以及任何其他内置函数。您还可以map()
使用需要多个迭代的函数来实现。
在本教程中,map()
出于演示目的,我们将结果立即打印为列表格式。在我们的程序中,我们通常会使用返回的地图对象来进一步操作数据。
如果您想了解更多 Python,请查看我们的How To Code in Python 3系列和我们的Python 主题页面。要了解有关在函数式编程中使用数据集的更多信息,请查看我们关于filter()
函数的文章。