Python 高階函式與lambda表示式

2021-09-25 11:55:15 字數 2919 閱讀 3386

緣由:

python語法簡單一看就會,但用在實處,想因為少於實戰,總感覺有些捉襟。

翻閱跟蹤youtube_dl原始碼,看到filter()函式用法,及其中lambda表示式,感覺好有意思,就補下課,記錄所思。

1. 高階函式

所謂高階函式,即是能接受函式做引數的函式。函式做參,與c#委託、c++函式指標、delphi事件有類似之處

比如:

def my_func(f, *args):

f(args)

defmy_print(s):

print',

'.join(s)

my_func(my_print,

'liujw

', '

male

')

它列印出:

liujw, male

如此定義函式,它能接受函式做引數,並能處理其它引數,我們就說它高階函式。

2. lambda表示式

lambda表示式返回可呼叫的函式物件,並且在執行時返回它們,通常是在需要乙個函式,但是又不想去命名乙個函式的場合下使用。

比如,我們定義數相加函式:

def

add(x, y):

return x + y

它用lambda表示式表示為:

lambda x, y: x + y

它以乙個表示式,替代了常規def方法中return語句。

lambda可以支援0至多個引數,但沒見有支援可變引數,即*args、**args,應該是不支援。

3. 內建高階函式

用可選的引數來呼叫func,nkw 為非關鍵字引數,kw 關鍵字引數;返回值是函式呼叫的返回值。此函式已於python 1.6中擯棄

用途:當乙個函式的引數存在於乙個元組或者乙個字典中時,用來間接的呼叫這個函式。現在版本python已允許直接呼叫作為引數的函式,因此它已淡出

def

my_fun1():

print

"my_fun

"def

my_fun2(x, y):

print x +y

輸出為:

my_fun

8

3.2 filter(func, seq):

呼叫乙個布林函式func 來迭代遍歷每個seq 中的元素, 返回乙個使func 返回值為ture 的元素的序列。

這個好用,我就是看到它才複習其用法,並成此文的。而youtube_dl中,大量用作為字典類判斷,諸如:

matches = list(filter(lambda f: f['

ext'] == ext, formats))

比如下面**,求陣列中的偶數:

lst = [1, 2, 3, 6, 7, 9, 10, 12, 15, 18]   

lst = filter(lambda x: x % 2 ==0, lst)

print lst

它返回為:

[2, 6, 10, 12, 18]

3.3 map(func, seq1[,seq2...])

將函式func 作用於給定序列(s)的每個元素,並用乙個列表來提供返回值,如果func 為none,func 表現為乙個身份函式,返回乙個含有每個序列中元素集合的n 個元組的列表。

比如上面列表元素做翻倍如處,可寫**如此:

lst = [1, 2, 3, 6, 7, 9, 10, 12, 15, 18]   

lst = map(lambda x: x +x, lst)

print lst

返回結果為:

[2, 4, 6, 12, 14, 18, 20, 24, 30, 36]

3.4 reduce(func, seq[, init]):

將二元函式作用於seq 序列的元素,每次攜帶一對(先前的結果以及下乙個序列元素),連續的將現有的結果和下雨給值作用在獲得的隨後的結果上,最後減少我們的序列為乙個單一的返回值;如果初始值init 給定,第乙個比較會是init 和第乙個序列元素而不是序列的頭兩個元素。

python核心程式設計pdf版翻譯令人蛋疼,什麼是下雨給值作用在?

簡而言之就是返回func對後所面引數執行結果,通常用在數學計算上,當然其用處不止如此。

比如求上面列表所有元素之和,可寫**如下:

lst = [1, 2, 3, 6, 7, 9, 10, 12, 15, 18]   

result = reduce(lambda x, y: x +y, lst)

print result

其結果為:

83

3.5 sorted(iterable, cmp=none, key=none, reverse=false):

顧名思義,它是用來排序的。接受乙個傳入引數,其它可選引數為排序規則、排序key值、是否反轉等。

如果cmp為空,則預設公升序排列列表,cmp返回值決定排序方式,>0為公升序,=0不變,<0降序,cmp須得有兩個引數。

比如降序排列如下列表:

lst = [1, 7, 5, 2, 3, 6, 9]

lst = sorted(lst, lambda x, y: y -x)

print lst

結果為:

[9, 7, 6, 5, 3, 2, 1]

其為氣泡排序法,x為後面元素,y為前面元素。若公升序排列,置x - y為結果即可。

python 函式高階 python 函式高階

形參角度 萬能引數 動態接收位置引數 args 動態接收關鍵字引數 kwargs 的魔性用法 函式定義時 代表聚合。他將所有的位置引數 聚合成乙個元組,賦值給了args 函式定義時 將所有的關鍵字引數聚合成乙個字典中,將這個字典賦給了 kwargs 和 在函式的呼叫時 代表打散 僅限關鍵字引數 de...

python偏函式和高階函式 高階函式與偏函式

今天主要在這裡仔細說明一下高階函式與偏函式的知識。高階函式 在絕大多數通常的計算機語言裡,函式的引數只接受基本的資料型別或是物件的引用,返回值也只是基本資料型別或者物件引用。示例如下 function test1 else return function console.log 資料不符合規範,錯誤...

C 委託,delegate,匿名函式和lambda

1委託就是可以把方法當作引數傳遞 2可以把委託看作乙個類來使用 3委託使用前需要例項化 using system using system.collections.generic using system.linq using system.text private void button1 cli...