1. 程式人生 > 其它 >【基礎09】【自學筆記】python匿名函式和必學高階函式

【基礎09】【自學筆記】python匿名函式和必學高階函式

一、匿名函式的使用

匿名函式(英語:anonymous function)是指一類無需定義識別符號(函式名)的函式。通俗來說呢,就是它可以讓我們的函式,可以不需要函式名

這邊使用deflambda分別舉個例子,你很快就能理解

def mySum(x, y):
    return x+y
mySum(2, 3)
# 5

(lambda x, y: x+y)(2, 4)
# 6

可以看到匿名函式直接執行,省下了很多行的程式碼

帶 if/else 

>>>( lambda x, y: x if x < y else y )( 1, 2 )
 

 遞迴函式

>>> func = lambda n:1 if n == 0 else n * func(n-1)
>>> func(5)
120
>>> a = lambda *z:z #*z返回的是一個元祖
>>> a('Testing1','Testing2')
('Testing1', 'Testing2')

  

>>> c = lambda **Arg: Arg #arg返回的是一個字典
>>> c()
{}

  

二、必學高階函式

1. map 函式

map 函式,它接收兩個引數,第一個引數是一個函式物件(當然也可以是一個lambda表示式),第二個引數是一個序列。

>>>list(map(lambda x: x*2, [1,2,3,4,5]))
[2, 4, 6, 8, 10]

 可以很清楚地看到,它可以將後面序列中的每一個元素做為引數傳入lambda中 

不使用 map 函式寫法

mylist=[]
for i in [1,2,3,4,5]:
    mylist.append(i*2)

2.filter 函式

filter 函式,和 map 函式相似。同樣也是接收兩個引數,一個lambda 表示式,一個序列。它會遍歷後面序列中每一個元素,並將其做為引數傳入lambda表示式中,當表示式返回 True,則元素會被保留下來,當表示式返回 False ,則元素會被丟棄。

下面這個例子,將過濾出一個列表中小於0的元素。

>>>filter(lambda x: x < 0, range(-5, 5))
[-5, -4, -3, -2, -1]

3. reduce 函式

reduce 函式,也是類似的。它的作用是先對序列中的第 1、2 個元素進行操作,得到的結果再與第三個資料用 lambda 函式運算,將其得到的結果再與第四個元素進行運算,以此類推下去直到後面沒有元素了。

這邊舉個例子你也就明白了。

>>>reduce(lambda x,y: x+y, [1,2,3,4,5])
15

  

它的運算過程分解一下是這樣的。

1+2=3
3+3=6
6+4+10
10+5=15

  

總結一下:

第一點,map 和 filter 函式返回的都不再是一個列表,而是一個迭代器物件。這裡以map為例

>>> map_obj = map(lambda x: x*2, [1,2,3,4,5])
>>> from collections.abc import Iterator
>>> isinstance(map_obj, Iterator)
True
>>> next(map_obj)
2
>>> list(map_obj)
[4, 6, 8, 10]

  

第二點,reduce 不可以直接呼叫,而是要先匯入才能使用,

from functools import reduce

  

  

  

奔跑的蝸牛