python map函數詳解


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循環以及列表推導式的各自效率如何?

舉例說明:

  1. map方式實現

import time
start=time.time()
def func(a,b):
   return a+b
c=list(map(func,range(1000000),range(1000000)))
end=time.time()
>>>end-start
0.16860485076904297
  1. for循環方式實現

import time
start=time.time()
c=list()
for i in range(1000000):
       c.append(i+i)
end=time.time()
>>>end-start
0.2443540096282959
  1. 列表推導式實現

import time
a=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,另一方面代碼的時間效率會更高;


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM