我正在使用Python,我注意到map()
函数似乎并没有做太多。例如,如果我写程序:
mylist = [1, 2, 3, 4, 5]
function = map(print, l)
print(function)
它没有优势:
mylist = [1, 2, 3, 4, 5]
for item in mylist:
print(item)
事实上,第二个选项创建的变量较少,对我来说整体看起来通常更清晰。我认为map()
提供的优势在一个示例中看不到像这一个简单,但究竟是什么?
map()
函数方面做了一些工作,他们甚至决定不将它从3.0中删除,而是继续研究它。他们决定服务的基本功能是什么?
答案 0 :(得分:3)
在列表推导之前,它曾经更有用。您可能已经看过像
这样的代码[int(x[2]) for x in l]
在列表推导之前,您将其写为
map(lambda x: int(x[2]), l)
(这也是在map
返回迭代器之前回来的。)
现在,列表推导和生成器表达式处理map
过去所做的大部分工作。 map
有时候更清洁,特别是当你不需要lambda时。例如,有些人喜欢
map(str, l)
在
(str(x) for x in l)
答案 1 :(得分:1)
一个非常常见的用途是转换整个列表的类型
>>> myList = ['1', '2', '3', '4'] # currently strings
>>> myList
['1', '2', '3', '4']
>>> map(int, myList) # now ints
[1, 2, 3, 4]
>>> map(float, myList) # now floats
[1.0, 2.0, 3.0, 4.0]
另一个非常常见的用途是通过某个函数传递列表
>>> def addToFive(x):
>>> return x + 5
>>> l = [1,2,3,4,5]
>>> map(addToFive, l)
[6, 7, 8, 9, 10]
答案 2 :(得分:1)
它可能不那么冗长。想象一下,你想在一个整数列表中为每个元素添加+ 1。
old_list = [1, 2, 3, 4]
new_list = []
for i in old_list:
new_list.append(i+1)
VS
old_list = [1, 2, 3, 4]
new_list = map(lambda x: x+1, old_list)
你说地图语法对你来说不太清楚。但是,映射在应用程序中经常使用,您很快就会意识到它的小巧和简洁。
如果您将map视为一个接收大小为N的输入列表的函数,并输出一个新的完全相同的长度列表并对每个元素进行转换,这确实很有帮助。如果你记住这一点,每当你看到一个地图功能时,你就会知道将要发生什么。
你会注意到Python有一些其他函数编程函数,例如reduce
,filter
,zip
等。map
是这类函数的一部分,尽管每个函数都是实现一个非常简单的功能,当您将这些功能组合到一个语句中时,您可以获得非常强大的结果。使用for
循环,您无法如此简洁地达到相同的表现力。
答案 3 :(得分:1)
根据map's文档:“返回一个迭代器,它将函数应用于每个iterable项,产生结果。”
没有打包代码:
def square(x):
return x**2
def calculist(lista):
for n in lista:
yield square(n)
numbers = [i for i in calculist(range(10))]
一行代码:
numbers = map(lambda x: x**2, range(10))
作为过滤器,除了其他之外,map是一个内置函数,专注于功能编程。它可能对黑客和技巧很有用,因为它会缩短代码,但对于正在使用的大型项目来说可能是一个坏主意。
您可以通过官方文档在Functional Programming HOWTO获得更多乐趣。