map函數


***將元組轉換成list***
>>> map(int, (1,2,3))
[1, 2, 3]
***將字符串轉換成list***
>>> map(int, '1234')
[1, 2, 3, 4]
***提取字典的key,並將結果存放在一個list中***
>>> map(int, {1:2,2:3,3:4})
[1, 2, 3]
***字符串轉換成元組,並將結果以列表的形式返回***
>>> map(tuple, 'agdf')
[('a',), ('g',), ('d',), ('f',)]
#將小寫轉成大寫
def u_to_l (s):
 return s.upper()
print map(u_to_l,'asdfd')

python map函數

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
map ()函數
map ()是 Python 內置的高階函數,它接收一個函數 f 和一個 list ,並通過把函數 f 依次作用在 list 的每個元素上,得到一個新的 list 並返回。
例如,對於 list [ 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 ]
如果希望把 list 的每個元素都作平方,就可以用 map ()函數:
因此,我們只需要傳入函數f(x) = x * x,就可以利用 map ()函數完成這個計算:
def f(x):
  return x * x
print map (f, [ 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 ])
輸出結果:
[ 1 , 4 , 9 , 10 , 25 , 36 , 49 , 64 , 81 ]
注意: map ()函數不改變原有的 list ,而是返回一個新的 list
利用 map ()函數,可以把一個 list 轉換為另一個 list ,只需要傳入轉換函數。
由於 list 包含的元素可以是任何類型,因此, map () 不僅僅可以處理只包含數值的 list ,事實上它可以處理包含任意類型的 list ,只要傳入的函數f可以處理這種數據類型。
任務
假設用戶輸入的英文名字不規范,沒有按照首字母大寫,后續字母小寫的規則,請利用 map ()函數,把一個 list (包含若干不規范的英文名字)變成一個包含規范英文名字的 list
輸入:[ 'adam' , 'LISA' , 'barT' ]
輸出:[ 'Adam' , 'Lisa' , 'Bart' ]
def format_name(s):
  s1 = s[ 0 : 1 ].upper() + s[ 1 :].lower();
  return s1;
print map (format_name, [ 'adam' , 'LISA' , 'barT' ])

map()函數是python內置的高階函數,對傳入的list的每一個元素進行映射,返回一個新的映射之后的list

Python map()函數的用法

Python函數式編程之map()

Python中map()、filter()、reduce()這三個都是應用於序列的內置函數。

格式:

?
1
map (func, seq1[, seq2,…])

第一個參數接受一個函數名,后面的參數接受一個或多個可迭代的序列,返回的是一個集合。

Python函數編程中的map()函數是將func作用於seq中的每一個元素,並將所有的調用的結果作為一個list返回。如果func為None,作用同zip()。

1、當seq只有一個時,將函數func作用於這個seq的每個元素上,並得到一個新的seq。

讓我們來看一下只有一個seq的時候,map()函數是如何工作的。

work 

從上圖可以看出,函數func函數會作用於seq中的每個元素,得到func(seq[n])組成的列表。下面舉得例子來幫助我們更好的理解這個工作過程。

?
1
2
3
#使用lambda
>>> print map ( lambda x: x % 2 , range ( 7 ))
[ 0 , 1 , 0 , 1 , 0 , 1 , 0 ]

3

?
1
2
3
#使用列表解析
>>> print [x % 2 for x in range ( 7 )]
[ 0 , 1 , 0 , 1 , 0 , 1 , 0 ]

4 

一個seq時,可以使用filter()函數代替,那什么情況不能代替呢?

2、當seq多於一個時,map可以並行(注意是並行)地對每個seq執行如下圖所示的過程:

2 

從圖可以看出,每個seq的同一位置的元素同時傳入一個多元的func函數之后,得到一個返回值,並將這個返回值存放在一個列表中。下面我們看一個有多個seq的例子:

?
1
2
>>> print map ( lambda x , y : x * * y, [ 2 , 4 , 6 ],[ 3 , 2 , 1 ])
[ 8 , 16 , 6 ]

5 

如果上面我們不使用map函數,就只能使用for循環,依次對每個位置的元素調用該函數去執行。還可以使返回值是一個元組。如:

?
1
2
>>> print map ( lambda x , y : (x * * y, x + y), [ 2 , 4 , 6 ],[ 3 , 2 , 1 ])
[( 8 , 5 ), ( 16 , 6 ), ( 6 , 7 )]

7 

當func函數時None時,這就同zip()函數了,並且zip()開始取代這個了,目的是將多個列表相同位置的元素歸並到一個元組。如:

?
1
2
>>> print map ( None , [ 2 , 4 , 6 ],[ 3 , 2 , 1 ])
[( 2 , 3 ), ( 4 , 2 ), ( 6 , 1 )]

需要注意的是:

map無法處理seq長度不一致、對應位置操作數類型不一致的情況,這兩種情況都會報類型錯誤。如下圖:

8

 

import time
from datetime import datetime

def add(x, y):
print(datetime.now(), "enter add func...")
time.sleep(2)
print(datetime.now(), "leave add func...")
return x+y

map(add, [1,2,3], [4,5,6])

 

2016-04-05 15:01:49.382314 enter add func...
2016-04-05 15:01:51.383387 leave add func...
2016-04-05 15:01:51.383471 enter add func...
2016-04-05 15:01:53.385584 leave add func...
2016-04-05 15:01:53.385676 enter add func...
2016-04-05 15:01:55.387388 leave add func...
[5, 7, 9]


免責聲明!

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



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