python map函数详解
python中有些内置的高阶函数,如map(),filter(),reduce();之所以称其为高阶函数,因为这类函数承受的参数中有一个参数为函数对象。
map()函数格局:map(func,seq1[,seq2,……])
map函数接管的第一个参数为一个函数对象,前面接管1个或多个序列;map函数会将func作用在前面序列中的各个值上,并返回一个迭代器。
举例:
def func(a): return a**2>>>map(func,[1,2,3])<map object at 0x000002B127AEA700>#返回一个map对象,为一个迭代器;>>>list(map(func1,[1,2,3]))[1, 4, 9]#将1,2,3作为参数一一传入func中,别离失去1,4,9;最初将后果转换为list
也能够传入多个序列,一个序列对应一个函数的参数;序列长度能够不统一,默认取到独特长度的序列值为止;
举例:
def func(a,b): return a+b>>>b=list(map(func,[10,20,30],[1,3,10]))#两个序列对应地位的值别离作为a,b作用到func中;>>>print(b)[11, 23, 40]#>>>list(map(func,[10,20,30,40],[1,3,10]))#长度不统一,默认取到长度雷同的一段序列[11, 23, 40]>>>list(map(func,[1,2,3],[10,20,30,40],[1,3,10]))#序列数量必须和func的参数数量统一TypeError: func() takes 2 positional arguments but 3 were given>>>b=list(map(func,[1,2,3]))TypeError: func() missing 1 required positional argument: 'b'
能够看到,map()函数实现的性能和for循环以及列表推导式十分相似,那么map和for循环以及列表推导式的各自效率如何?
举例说明:
- map形式实现
import timestart=time.time()def func(a,b): return a+bc=list(map(func,range(1000000),range(1000000)))end=time.time()>>>end-start0.16860485076904297
- for循环形式实现
import timestart=time.time()c=list()for i in range(1000000): c.append(i+i)end=time.time()>>>end-start0.2443540096282959
- 列表推导式实现
import timea=list(range(1000000))b=list(range(1000000))start=time.time()c=[a[i]+b[i] for i in range(1000000)]end=time.time()print(end-start)0.2124321460723877
从下面比照能够看到,map的效率最高,for循环的效率最低;
基于map的这类性能和效率,在我的项目开始波及到较多循环时,均可多思考是否用Map代替for循环,一方面代码更为简介和pythonic,另一方面代码的工夫效率会更高;