朋友们,如需转载请标明出处:https://blog.csdn.net/jiangjunshow
声明:在人工智能技术教学期间,不少学生向我提一些python相关的问题,所以为了让同学们掌握更多扩展知识更好地理解AI技术,我让助理负责分享这套python系列教程,希望能帮到大家!由于这套python教程不是由我所写,所以不如我的AI技术教学风趣幽默,学起来比较枯燥;但它的知识点还是讲到位的了,也值得阅读!想要学习AI技术的同学可以点击跳转到我的教学网站。PS:看不懂本篇文章的同学请先看前面的文章,循序渐进每天学一点就不会觉得难了!
编程中我们常常要做的一件事就是对列表中每一个元素都进行一个操作。例如,在一个列表counter中更新所有的数字,我们可以简单地通过一个for循环来实现。
>>>counters = [1,2,3,4]
>>>
>>>updated = []
>>>for x in counters:
... updated.append(x + 10) # Add 10 to each item
...
>>>updated
[11,12,13,14]
因为这是一个常见的操作,Python已经为我们提供了一个内置的工具函数——就是map函数。它会对一个序列对象中的每一个元素应用被传入的函数。如下所示。
>>>def inc(x): return x + 10 # Function to be run
...
>>>list(map(inc,counters)) # Collect results
[11,12,13,14]
map对列表中的每个元素都调用了inc函数。别忘了,map在Python 3.0中是一个可迭代对象,因此,在这里,我们用一个列表list调用来迫使它生成所有的结果以显示,这在Python 2.6中不是必需的。
由于map期待传入一个函数,这恰好是lambda常出现的地方之一:
>>>list(map((lambda x: x + 3),counters)) # Function expression
[4,5,6,7]
这里,函数将会为counters列表中的每一个元素加3。因为这个函数不会在其他的地方用到,所以将它写成了一行的lambda。
某些程度上来说,使用map与for循环是等效的,我们可以自己编写一个类似map的映射工具。
>>>def mymap(func,seq):
... res = []
... for x in seq: res.append(func(x))
... return res
我们可以用内置函数或我们自己的对等形式将其映射到一个序列:
>>>list(map(inc,[1,2,3])) # Built-in is an iterator
[11,12,13]
>>>mymap(inc,[1,2,3]) # Ours builds a list (see generators)
[11,12,13]
尽管如此,因为map是内置函数,所以有一些性能方面的优势(简而言之,它要比自己编写的for循环更快)。所以尽管我们也能够来模拟map,但是当有速度优势的内置函数已经提供了这样的功能,再去模拟,意义不是很大。
另外map调用与列表解析很相似,但是map对每一个元素应用函数调用而不是任意的表达式。因为这点限制,从某种意义上来说,它成为了不太通用的工具。尽管如此,在某些情况下,目前map比列表解析运行起来更快,并且它所编写的代码也较少。