學 Python 一定要學會的幾個高階函式

2022-06-05 11:12:12 字數 2618 閱讀 8239

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

正常情況下,我們定義乙個函式,使用的是def關鍵字,而當你學會使用匿名函式後,替代def的是lambda

這邊使用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 )

1

巢狀函式

>>>( lambda x: ( lambda y: ( lambda z: x + y + z  )( 1 ) )( 2 ) )( 3 )

6

遞迴函式

>>> func = lambda n:1 if n == 0 else n * func(n-1)

>>> func(5)

120

或者

>>> f = lambda func, n: 1 if n == 0 else n * func( func, n - 1 )

>>> f(f,4)

24

從以上示例來看,lambda 表示式和常規的函式相比,寫法比較怪異,可讀性相對較差。除了可以直接執行之外,好像並沒有其他較為突出的功能,為什麼在今天我們要介紹它呢?

首先我們要知道 lambda 是乙個表示式,而不是乙個語句。正因為這個特點,我們可以在一些特殊的場景中去使用它。具體是什麼場景呢?接下來我們會介紹到幾個非常好用的內建函式。

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

它可以實現怎樣的功能呢,我舉個例子你就明白了。

>>> 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]:

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

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

>>>filter(lambda x: x < 0, range(-5, 5))

[-5, -4, -3, -2, -1]

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

以上幾個函式,熟練的掌握它們的寫法,可以讓我們的**看起來更加的 pythonic ,在某一程度上**看起來更加的簡潔。

如果你是新手呢,你需要注意的是,以上示例是在 python2.x 環境下演示的。而在 python3.x 中,卻有所不同,你可以自己嘗試一下。

這裡總結一下:

第一點,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

為什麼青少年一定要學Python?

學習程式設計要比學習英語更重要。因為程式語言可以影響全球70億人。蘋果ceo庫克 程式設計是網際網路 人工智慧等高新技術的基礎和核心,而當下,正是計算機程式設計普及的風口浪尖,誰能搶先一步抓住這個風口,就會在未來的計算機時代占有主動地位。現在程式設計教育正在逐漸普及,學習程式設計對孩子的成長有著重要...

前端面試寶典,一定要學會

之前一直沒寫就是因為辭職了,然後不斷的學習,不斷的整理,這兩天剛入職,我就趕快吧這點經驗分享出去,希望能幫助到換工作的兄弟們。1,簡歷 4,面試聊天 其實就是從側面了解你,他會問你什麼時候離職的啊?離職的原因是什麼啊?之前公司的薪水多少啊?公司的人員配置 後台前端測試什麼的 業餘時間都幹嘛呢?喜歡看...

復仇之路 我一定要學會linux系統

說起linux,我不知道大家對這幾個字母有什麼認識,是不是早已經對這個作業系統已經很熟悉了?還是不知道他是乙個作業系統,只是知道他是乙個英文單詞?或是知道他是乙個人的名字?亦或是一本叫做 linux就該這麼學 的書籍?對於剛開始學習linux的我來說,我只是知道這是幾個英文本母。學習linux你要挑...