1、map函式:
map()是 python 內建的高階函式,它接收乙個函式 f 和乙個 list,並通過把函式 f 依次作用在 list 的每個元素上,得到乙個新的 list 並返回。
1、當seq只有乙個時,將函式func作用於這個seq的每個元素上,並得到乙個新的seq
例如,對於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可以處理這種資料型別。
2、當seq多於乙個時,map可以並行(注意是並行)地對每個seq執行如下圖所示的過程:
l2=map(lambda x,y:x**y,[1,2,3],[1,2,3])
for i in l2:
print(i)
l3=map(lambda x,y:(x**y,x+y),[1,2,3],[1,2,3])
for i in l3:
print(i)
python3中可以處理類表長度不一致的情況,但無法處理型別不一致的情況,
l4=map(lambda x,y:(x**y,x+y),[1,2,3],[1,2])
for i in l4:
print(i)
l4=map(lambda x,y:(x**y,x+y),[1,2,3],[1,2,'a'])
for i in l4:
print(i)
特殊用法,做型別轉換:
l=map(int,'1234')
for i in l:
print(type(i))
print(i)
如果函式是 none,自動假定乙個『identity』函式,這時候就是模仿 zip()函式,
l=[1,2,3]
x=map(none,l)
print(x)
這時候 none 型別不是乙個可以呼叫的物件。所以他沒法返回值
目的是將多個列表相同位置的元素歸併到乙個元組。如:
>>> print map(none, [2,4,6],[3,2,1])
[(2, 3), (4, 2), (6, 1)]
2、lambda函式:
在python中,lambda的語法是唯一的。其形式如下:
lambda argument_list: expression
1. 這裡的argument_list是引數列表,它的結構與python中函式(function)的引數列表是一樣的。具體來說,argument_list可以有非常多的形式。例如:
a, b
a=1, b=2
*args
**kwargs
a, b=1, *args
空......
2. 這裡的expression是乙個關於引數的表示式。表示式**現的引數需要在argument_list中有定義,並且表示式只能是單行的。以下都是合法的表示式:
1none
a + b
sum(a)
1 if a >10 else 0
......
3. 這裡的lambda argument_list: expression表示的是乙個函式。這個函式叫做lambda函式。
三個特性
lambda函式有如下特性:
lambda函式是匿名的:所謂匿名函式,通俗地說就是沒有名字的函式。lambda函式沒有名字。
lambda函式有輸入和輸出:輸入是傳入到引數列表argument_list的值,輸出是根據表示式expression計算得到的值。
lambda函式一般功能簡單:單行expression決定了lambda函式不可能完成複雜的邏輯,只能完成非常簡單的功能。由於其實現的功能一目了然,甚至不需要專門的名字來說明。
下面是一些lambda函式示例:
lambda x, y: x*y;函式輸入是x和y,輸出是它們的積x*y
lambda:none;函式沒有輸入引數,輸出是none
lambda *args: sum(args); 輸入是任意個數的引數,輸出是它們的和(隱性要求是輸入引數必須能夠進行加法運算)
lambda **kwargs: 1;輸入是任意鍵值對引數,輸出是1
四個用法
由於lambda語法是固定的,其本質上只有一種用法,那就是定義乙個lambda函式。在實際中,根據這個lambda函式應用場景的不同,可以將lambda函式的用法擴充套件為以下幾種:
將lambda函式賦值給乙個變數,通過這個變數間接呼叫該lambda函式。
例如,執行語句add=lambda x, y: x+y,定義了加法函式lambda x, y: x+y,並將其賦值給變數add,這樣變數add便成為具有加法功能的函式。例如,執行add(1,2),輸出為3。
將lambda函式賦值給其他函式,從而將其他函式用該lambda函式替換。
例如,為了把標準庫time中的函式sleep的功能遮蔽(mock),我們可以在程式初始化時呼叫:time.sleep=lambda x:none。這樣,在後續**中呼叫time庫的sleep函式將不會執行原有的功能。例如,執行time.sleep(3)時,程式不會休眠3秒鐘,而是什麼都不做。
3. 將lambda函式作為其他函式的返回值,返回給呼叫者。
函式的返回值也可以是函式。例如return lambda x, y: x+y返回乙個加法函式。這時,lambda函式實際上是定義在某個函式內部的函式,稱之為巢狀函式,或者內部函式。對應的,將包含巢狀函式的函式稱之為外部函式。內部函式能夠訪問外部函式的區域性變數,這個特性是閉包(closure)程式設計的基礎,在這裡我們不展開。
4.將lambda函式作為引數傳遞給其他函式。
部分python內建函式接收函式作為引數。典型的此類內建函式有這些。
filter函式。此時lambda函式用於指定過濾列表元素的條件。例如filter(lambda x: x % 3 == 0, [1, 2, 3])指定將列表[1,2,3]中能夠被3整除的元素過濾出來,其結果是[3]。
sorted函式。此時lambda函式用於指定對列表中所有元素進行排序的準則。例如sorted([1, 2, 3, 4, 5, 6, 7, 8, 9], key=lambda x: abs(5-x))將列表[1, 2, 3, 4, 5, 6, 7, 8, 9]按照元素與5距離從小到大進行排序,其結果是[5, 4, 6, 3, 7, 2, 8, 1, 9]。
map函式。此時lambda函式用於指定對列表中每乙個元素的共同操作。例如map(lambda x: x+1, [1, 2,3])將列表[1, 2, 3]中的元素分別加1,其結果[2, 3, 4]。
reduce函式。此時lambda函式用於指定列表中兩兩相鄰元素的結合條件。例如reduce(lambda a, b: '{}, {}'.format(a, b), [1, 2, 3, 4, 5, 6, 7, 8, 9])將列表 [1, 2, 3, 4, 5, 6, 7, 8, 9]中的元素從左往右兩兩以逗號分隔的字元的形式依次結合起來,其結果是'1, 2, 3, 4, 5, 6, 7, 8, 9'。
另外,部分python庫函式也接收函式作為引數,例如gevent的spawn函式。此時,lambda函式也能夠作為引數傳入。
乙個爭議
事實上,關於lambda在python社群是存在爭議的。python程式設計師對於到底要不要使用lambda意見不一致。
支援方認為使用lambda編寫的**更緊湊,更「pythonic」。
反對方認為,lambda函式能夠支援的功能十分有限,其不支援多分支程式if...elif...else...和異常處理程式try ...except...。並且,lambda函式的功能被隱藏,對於編寫**之外的人員來說,理解lambda**需要耗費一定的理解成本。他們認為,使用for迴圈等來替代lambda是一種更加直白的編碼風格。
關於lambda的爭執沒有定論。在實際中,是否使用lambda程式設計取決於程式設計師的個人喜好。
以上就是我們總結的關於python中的lambda的「乙個語法,三個特性,四個用法,乙個爭論」。如有紕漏之處,歡迎批評指正。
Python map和reduce函式用法示例
先看map。map 函式接收兩個引數,乙個是函式,乙個是序列,map將傳入的函式依次作用到序列的每程式設計客棧個元素,並把結果作為新的list返回。舉例說明,比如我們有乙個函式a x x 2,要把這個函式作用在乙個list 1,2,3,4,5 上,就可以用map 實現如下 複製 如下 def a x...
python map函式用法
1,第乙個引數接收乙個函式名,第二個引數接收乙個可迭代物件 list1 1,2,3 result map str,list1 print result 列印結果 1 2 3 2,如果第乙個引數傳入none,第二和第三個引數傳入兩個可迭代物件,那map 的功能同zip list1 1,2,3 list...
python map 函式用法
map 函式 map 是 python 內建的高階函式,它接收乙個函式 f 和乙個 list,並通過把函式 f 依次作用在 list 的每個元素上,得到乙個新的 list 並返回。例如,對於list 1,2,3,4,5,6,7,8,9 如果希望把list的每個元素都作平方,就可以用map 函式 因此...