緣由:
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表示式返回可呼叫的函式物件,並且在執行時返回它們,通常是在需要乙個函式,但是又不想去命名乙個函式的場合下使用。
比如,我們定義數相加函式:
defadd(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已允許直接呼叫作為引數的函式,因此它已淡出
defmy_fun1():
"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...