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
中的每个num
在nums_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_2
和nums_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]
的一般化。– 如果没有
start
和stop
值,切片从字符串的开头开始,延伸到字符串的末尾。
–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.考虑以下接受length
和breadth
作为输入并返回面积length*breadth
的函数area()
。
def area(length,breadth):
return length*breadth
不同矩形的长度和宽度分别存储在两个单独的列表lengths
和breadths
中。
lengths = [4,8,10,18]
breadths = [9,4,6,11]
我们可以使用map()
函数通过同时传入lengths
和breadths
列表来将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
函数,以及列表x
和base
来获得新的列表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。