为什么要使用map()函数?

时间:2014-06-08 21:06:19

标签: python

我正在使用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()提供的优势在一个示例中看不到像这一个简单,但究竟是什么?

编辑:似乎有些人一直在回答一个与我打算提出的问题不同的问题。制作Python的开发人员显然在创建map()函数方面做了一些工作,他们甚至决定不将它从3.0中删除,而是继续研究它。他们决定服务的基本功能是什么?

4 个答案:

答案 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有一些其他函数编程函数,例如reducefilterzip等。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获得更多乐趣。