Python map()函数,带有示例解释

在本教程中,您将学习如何使用Python的map()函数将函数应用于可迭代对象的所有项目。

Python支持函数式编程范式,允许您以编程方式将任务定义为函数的计算。您可以将Python函数视为对象:一个函数可以将另一个函数作为参数并返回另一个函数。

map()函数接受一个函数作为参数,并允许您将其应用于序列中的所有项目。

通过本教程的最后,您将能够使用Python的map()函数——重写冗长的循环和列表推导式。您将编写几个示例来了解您可以使用map()函数的不同方式。

如何将函数应用于Python列表的元素

让我们从一个示例开始讨论。这里nums是一个数字列表。

接下来,考虑函数self_pow()。函数self_pow()以一个数字作为参数,并返回该数字的幂次方:n**n。

在Python中,**是幂运算符。a**b返回a的b次幂,ab

def self_pow(n):
  return n**n

TO-DO: 通过将函数self_pow()应用于列表nums中的每个元素,创建一个新列表nums_pow。

使用for循环

为此,您可以在Python中使用for循环:

  • 对于列表nums中的每个数字,调用函数self_pow()并将num作为参数。
  • 将函数调用的结果追加到新列表nums_pow中。
nums_pow = []

for num in nums:
  nums_pow.append(self_pow(num))

print(nums_pow)

在输出中,每个数字nums都被提高到自身。nums_pow列表中的元素如下:22,44,33,77

Output
[4, 256, 27, 823543]

使用列表推导

您可以使用列表推导来简化此过程。通过上面的显式for循环,我们可以确定输出表达式和要循环遍历的列表。

然后,我们可以修改通用的列表推导式:

new_list = [ for item in iterable]

生成nums_pow列表的列表推导式如下:

nums_pow = [self_pow(num) for num in nums]
print(nums_pow)

输出与使用for循环的输出相同,如预期。

Output
[4, 256, 27, 823543]

除了循环和列表推导,您还可以使用Python的map()函数以简明的语法将函数应用于可迭代对象的所有项目。让我们首先学习map函数的语法。

Python map()函数语法

使用Python的map()函数的一般语法如下:

map(function, iterable_1,[iterable_2,...,iterable_n])

map()函数接受至少两个参数,一个函数和一个可迭代对象

在上述语法中:

  • function表示Python函数或一般情况下的任何Python可调用对象。包括用户定义的和内置的函数、类、实例和类方法等。
  • iterable是任何有效的Python可迭代对象,例如列表、元组和字符串。
  • map()函数将function应用于iterable中的每个项。

map()函数返回什么?

它返回一个映射对象。然后可以使用list(map(function,iterable))的语法将映射对象转换为列表。

根据用例,可以将其转换为Python tuple

现在,您已经学会了Python map()函数的语法,让我们开始编写示例。

您需要Python 3.x才能跟随本教程。否则,您可以在Geekflare online Python editor中运行代码片段。

如何使用map()函数与用户定义的函数

#1.之前,我们已经将self_pow()函数应用于nums列表中的每个数字。在map()函数的语法中,可以将函数self_pow和列表nums作为参数传递。

注意:只需指定函数的名称,而不是函数调用。使用self_pow而不是self_pow()

map()函数返回一个映射对象。

print(map(self_pow,nums))

然后,我们可以使用list()函数将映射对象转换为列表,如下所示。

nums_pow = list(map(self_pow,nums))
print(nums_pow)

以下是输出,其中nums中的每个numnums_pow列表中映射为numnum

Output
[4, 256, 27, 823543]

#2.考虑以下将英寸转换为厘米的函数inch_to_cm()1 英寸 = 2.54 厘米

def inch_to_cm(inch):
  return inch*2.54

要将inches列表中的英寸值转换为厘米,可以使用map()函数,如下所示。

inches = [5.54,3.4,1,25,8.2]
cms = list(map(inch_to_cm,inches))
print(cms)

cms列表包含以厘米表示的英寸值。

Output
[14.0716, 8.636, 2.54, 63.5, 20.828]

如何使用map()函数与内置函数

在本节中,我们将学习如何在Python中使用内置函数与map()函数。

#1.列表strings是一组编程语言。您想创建一个名为strings_upper的新列表,其中包含以大写字母表示的编程语言字符串。

strings = ['JavaScript','Rust','Python','Go']

内置字符串方法.upper()作用于字符串并返回一个以大写字母格式化的副本。

strings_upper = list(map(str.upper,strings)) 
print(strings_upper)

strings_upper列表包含以大写字母表示的strings列表中的字符串。

Output
['JAVASCRIPT', 'RUST', 'PYTHON', 'GO']

#2. Python内置的len()函数接受一个序列作为参数并返回其长度。要找出strings列表中每个字符串的长度,我们可以使用map()函数,并在每个字符串上应用长度函数,如下所示。

strings_len = list(map(len,strings))
print(strings_len)
输出
[10, 4, 6, 2]

#3. 您可以将map()函数与其他集合(例如元组)一起使用。

以下示例包含一个元组,其中包含有关房屋的卧室数量、面积和所在城市的信息。

在Python中,type()函数返回任何Python对象的数据类型。要获取此元组中所有项的数据类型,可以使用map()函数在每个元组项上调用type函数。

house = (2,758.5,'Bangalore')
house_elt_type = tuple(map(type,house))
print(house_elt_type)

我们已将map对象转换为元组。您还可以转换为列表或任何其他集合。

在下面的输出中,我们可以看到2、758.5和Bangalore的数据类型分别被推断为'int'、'float'和'str'。

输出
(, , )

#4. 在Python中,您可以和使用定义在模块中的函数。

要计算nums列表中每个数字的根,可以使用数学模块中的平方根函数sqrt

import math
nums = [30,90,34,45,97]
nums_sqrt = list(map(math.sqrt,nums))
print(nums_sqrt)
输出
[5.477225575051661, 9.486832980505138, 5.830951894845301, 6.708203932499369, 9.848857801796104]

上述输出很难解析和跟踪。您可能希望将每个平方根值四舍五入到小数点后两位。

如何在Python中对浮点数进行四舍五入

让我们定义一个函数round_2(),它接受一个浮点数并将其四舍五入到小数点后两位。

def round_2(num):
  return round(num,2)

现在,您可以将map()函数与round_2nums_sqrt列表一起使用。

nums_sqrt_round = list(map(round_2,nums_sqrt))
print(nums_sqrt_round)
输出
[5.48, 9.49, 5.83, 6.71, 9.85]

您还可以使用嵌套的map()函数,其中内部map函数用于计算平方根列表nums_sqrt,外部map函数执行四舍五入操作。

nums_sqrt_round = list(map(round_2,list(map(math.sqrt,nums))))
print(nums_sqrt_round)
输出
[5.48, 9.49, 5.83, 6.71, 9.85]

上述两种方法的输出是相同的。然而,当嵌套函数(如上所示)时,您应确保代码可读性和可维护性。

如何使用带有Lambda函数的map()函数

在前面的部分中,您学习了如何将Python的map()函数与内置和用户定义的函数一起使用。现在,您将学习如何将map()函数与Python中的匿名函数lambda函数一起使用。

有时,您可能有一个函数,其主体只包含一行代码,并且可能只需要在程序中使用一次,而不需要在其他地方引用它。您可以在Python中定义此类函数作为lambda函数

注意:lambda args: expression是使用Python lambda function的一般语法。

#1.考虑以下列表strings。假设你想要得到一个列表strings_rev – 包含每个字符串的反转副本。

strings = ['JavaScript','Rust','Python','Go']

我们可以使用reverse a Python string using string slicing

注意:这是字符串切片表达式str[start:stop:step]的一般化。

– 如果没有startstop值,切片从字符串的开头开始,延伸到字符串的末尾。
step的负值给出了从字符串末尾开始的切片。
– 因此,str[::-1]返回了str的反转副本。

你可以使用这个lambda函数:lambda x:x[::-1],在map函数中,如下所示。

strings_rev = list(map(lambda x:x[::-1],strings))
print(strings_rev)

与其他示例一样,我们将map对象转换为列表。在输出中,我们看到列表strings中的每个字符串都被反转。

输出
['tpircSavaJ', 'tsuR', 'nohtyP', 'oG']

#2.在前一节中,我们计算了numbers列表中每个数字的平方根,然后将每个平方根值四舍五入到小数点后两位。

我们使用函数round_2()来实现这一点。让我们将round_2()函数重写为lambda函数,并使用下面描述的map()函数。

nums_sqrt_round_l =list(map(lambda num:round(num,2),nums_sqrt))
print(nums_sqrt_round_l)

如下所示,输出与使用round_2()函数得到的结果完全相同。

输出
[5.48, 9.49, 5.83, 6.71, 9.85]

如何使用map()函数处理多个可迭代对象

在我们所看到的示例中,我们在一个可迭代对象的所有项目上应用了一个函数。

有时,我们可能有需要接受两个或更多参数的函数。在这种情况下,每个参数都存储在一个列表或任何类似的集合中。

我们也可以使用Python的map()函数处理多个列表。

#1.考虑以下接受lengthbreadth作为输入并返回面积length*breadth的函数area()

def area(length,breadth):
  return length*breadth

不同矩形的长度和宽度分别存储在两个单独的列表lengthsbreadths中。

lengths = [4,8,10,18]
breadths = [9,4,6,11]

我们可以使用map()函数通过同时传入lengthsbreadths列表来将area函数应用于上述列表。

areas = list(map(area,lengths,breadths))
print(areas)

由于area函数接受两个参数,所以长度和宽度的值分别来自列表lengths breadths

输出
[36, 32, 60, 198]

#2. Python math module具有帮助我们计算一个数字的以任意底数为底的对数的log函数。

注意:log(x, base)返回基于值base指定的底数的值log x,即log base x。如果未指定底数,则默认底数值为e(log计算自然对数)。

在这个例子中:

  • 列表x对应于您想要计算对数的值。
  • base列表包含对数计算中要使用的所有底数值。
x = [2,6,12,10]
base = [2,3,2,5]

我们可以使用Python的map()函数和math.log函数,以及列表xbase来获得新的列表log_x,具体如下。

log_x = list(map(math.log,x,base))
print(log_x)

下面是输出结果。

输出
[1.0, 1.6309297535714573, 3.5849625007211565, 1.4306765580733933]

结论

以下是您在本教程中学到的内容的总结:

  • Python的map()函数接受至少两个参数:一个函数和一个可迭代对象,语法为map(function, iterable(s))
  • 函数可以是任何有效的Python可调用对象。
  • 函数接受k个参数时,可以使用map()函数和函数以及每个k个参数的可迭代对象。

接下来,学习如何使用sets in Python,还要学习如何使用python sleep function

类似文章