Python 高階函式

2021-08-20 17:08:42 字數 4681 閱讀 5240

變數可以指向函式

函式本身也可以

賦值給變

量, 即:

變數可以指向函式。

>>> f = abs

>>> f(-10)10說

明變數 f 現在已

經指向了

abs

函式本身。 直接呼叫

abs()

函式和呼叫變

量 f()

完全相同。

函式名也是變數

函式名其

實就是指向函式的變數!

對於 abs()

這個函式,

完全可以把函式名

abs 看成變

量, 它指向乙個可以計算

絕對值的函式!

>>> abs = 10

>>> abs(-10)

traceback (most recent call last):

file "", line 1, in

typeerror: 'int' object is not callable

把 abs

指向 10

後, 就無法通

過 abs(-10) 呼叫

該函式了!因

為 abs 這個

變數已經

不指向求

絕對值函式而是指向乙個整數

10 !

傳入函式既然變

量可以指向函式, 函式的引數能接收

變數, 那麼乙個函式就可以接收另乙個

函式作為

引數,

這種函式就稱之為高

階函式。

乙個最簡單的高階

函式:def add(x, y, f):

return f(x) + f(y)

>>> add(-5, 6, abs)

11把函式作為引數

傳入,

這樣的函式稱為高

階函式, 函式式

程式設計就是指

這種高度抽象的

程式設計正規化。

map/reduce

python

內建了

map()

和 reduce()

函式。map()

函式接收

兩個引數, 乙個是函式, 乙個是

iterable

, map 將傳

入的函式依次作用到序列的每個元素, 並把結果作

為新的 iterator

返回。現

在, 我們用

python

**實現

def f(x):

return x * x

>>> r = map(f, [1, 2, 3, 4, 5, 6, 7, 8, 9])

>>> list(r)

[1, 4, 9, 16, 25, 36, 49, 64, 81]

reduce

把乙個函式作用在乙個序列

[x1, x2, x3,...]

上, 這

個函式必須接收

兩個引數,

reduce 把結

果繼續和序列的下乙個元素

做累積計

算, 其效果就是:

reduce(f, [x1, x2, x3, x4]) = f(f(f(x1, x2), x3), x4)

比方說對

乙個序列求和, 就可以用

reduce 實現:

from functools import reduce

def add(x, y):

return x + y

>>> reduce(add, [1, 3, 5, 7, 9])

25寫乙個

prod()

函式, 可以接受乙個

list

並利用

reduce() 求積

def prod(l):

from functools import reduce

def subprod(x,y):

return int(x) * int(y)

return reduce(subprod,l)

>>>print('3*5*7:',prod([3,5,7]))

3*5*7: 105

filter

python

內建的

filter()

函式用於

過濾序列 .

和 map()

類似,

filter()

也接收乙個函式和乙個序列。 和

map()

不同的時

, filter() 把傳

入的函式依次作用於每個元素, 然後根據返回值是

true 還是

false

決定保留還是

丟棄該元素。

例如, 在乙個

list

中, 刪

掉偶數, 只保留奇數, 可以

這麼寫:

def is_odd(n):

return n % 2 == 1

>>>list(filter(is_odd, [1, 2, 4, 5, 6, 9, 10, 15]))# 結

果: [1, 5, 9, 15]

filter()

函式返回的是乙個

iterator

, 也就是乙個惰性序列, 所以要強迫

filter() 完成計

算結果, 需要用

list() 函式獲

得所有結

果並返回

list

。filter()

的作用是從乙個序列中

篩出符合條件的元素。 由於

filter()

使用了惰性

計算, 所以只有在取

filter() 結果的

時候, 才會真正

篩選並每次返回下乙個

篩出的元素。

sorted :排序演算法

python

內建的

sorted()

函式就可以

對list

進行排序:

>>> sorted([36, 5, -12, 9, -21])

[-21, -12, 5, 9, 36]

們給 sorted 傳入

key函式, 即可

實現忽略大小寫的排序:

sorted()

函式也是乙個高

階函式, 它

還可以接收乙個

key

函式來實現自定義

的排序, 例如按

絕對值大小排序:

>>> sorted([36, 5, -12, 9, -21], key=abs)

[5, 9, -12, -21, 36]

們再看乙個字串排序的例子:

>>> sorted(['bob', 'about', 'zoo', 'credit'])

['credit', 'zoo', 'about', 'bob']

認情況下,

對字串排序, 是按照

ascii

的大小比

較的, 由於

'z' < 'a' ,結

果, 大寫字母

z 會排在小寫字母

a 的前面。

>>> sorted(['bob', 'about', 'zoo', 'credit'], key=str.lower)

['about', 'bob', 'credit', 'zoo']

進行反向排序, 不必改

動key

函式, 可以

傳入第三個引數

reverse=true

>>> sorted(['bob', 'about', 'zoo', 'credit'], key=str.lower, reverse=true)

['zoo', 'credit', 'bob', 'about']

sorted()

對列表分

別按名字排序:

>>>l = [('bob', 75), ('adam', 92), ('bart', 66), ('lisa', 88)]

>>>l2 = sorted(l)

>>>print(l2)

[('adam', 92), ('bart', 66), ('bob', 75), ('lisa', 88),]

用 

sorted() 

對列表分

別按成績排序:

>>>l = [('bob', 75), ('adam', 92), ('bart', 66), ('lisa', 88)]

>>>sorted(l,key = lambda l:l[1])

>>>print(l2)

[('bart', 66), ('bob', 75), ('lisa', 88), ('adam', 92)]

def is_odd(n): return n % 2 == 1

python 函式高階 python 函式高階

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

Python高階 函式高階

閉包 closure 常規函式中可以在函式的引數中新增引數的預設值來簡化函式的操作,偏函式也可以做到這一點,而且會更加的方便管理函式的操作。通過內建模組functools的partial進行定義和處理 語法結構 新函式名稱 functools.partial 函式名稱,預設賦值引數 例如 全域性函式...

python 函式 高階函式

filter 函式是 python 內建的另乙個有用的高階函式,filter 函式接收乙個函式 f 和乙個list,這個函式 f 的作用是對每個元素進行判斷,返回 true或 false,filter 根據判斷結果自動過濾掉不符合條件的元素,返回由符合條件元素組成的新list。例如判斷奇偶數 def...