python lambda匿名函式,高效的表達方式

2021-10-11 21:30:13 字數 4904 閱讀 9832

在平時做python作業時總會用到這幾個函式,今天來做個總結

1.lambda函式:

python 使用 lambda 來建立匿名函式。

所謂匿名,意即不再使用 def 語句這樣標準的形式定義乙個函式。

lambda 只是乙個表示式,函式體比 def 簡單很多。

lambda的主體是乙個表示式,而不是乙個**塊。僅僅能在lambda表示式中封裝有限的邏輯進去。 lambda

函式擁有自己的命名空間,且不能訪問自己引數列表之外或全域性命名空間裡的引數。

雖然lambda函式看起來只能寫一行,卻不等同於c或c++的內聯函式,後者的目的是呼叫小函式時不占用棧記憶體從而增加執行效率。

lambda函式的語法只包含乙個語句:

lambd(arg1,(,arg2,…argn)):expression

他的格式呢很好理解,直接上**一目了然(這裡用的map,filter後面都會講到的~)

re=

list

(map

(lambda x,y:x+y,[1

,2,3

],[2

,3,4

]))#當運算符號為%時表示判斷

print

(re)

re=

list

(map

(lambda x:x**2,

range(1

,5))

)#當運算符號為%時表示判斷

print

(re)

這個**的另一種形式為:

def

square

(x):

return x**

2result =

list

(map

(square,[1

,2,3

,4,5

]))print

(result)

lambda的簡潔的寫法是不是更簡單更有逼格呢~

再舉乙個栗子:

先寫複雜的形式吧(沒有對比就沒有傷害)

def

is_odd

(n):

return n %2==

1 tmplist =

filter

(is_odd,[1

,2,3

,4,5

,6,7

,8,9

,10])

newlist =

list

(tmplist)

print

(newlist)

看好了lambda的**:

tmplist =

list

(filter

(lambda n:n%2==

0,range(1

,11))

)#上乙個**的簡寫,偶數找出來

print

(tmplist)

兩行解決戰鬥,其實也可以一行

print

(list

(filter

(lambda n:n%2==

0,range(1

,11))

))

是不是驚呆了~~

先解釋一下這個**吧:filter是可以理解為過濾的意思,只要是在0~10的數能被2除餘數為0那麼就選出來,然後range完後就能列印出偶數了,後面詳解。

所以完成一些加減乘除不用def直接lambd就可以了,節省時間(人生苦短,我用python)

再再就乙個栗子:

import math

new=

list

(filter

(lambda x:math.sqrt(x)%1

==0,range(1

,101))

)#選出平方根是整數的數字

print

(new)

lambda我還沒學怎麼深入,以後再補充

2.map函式:

先看菜鳥解釋:

map() 會根據提供的函式對指定序列做對映。

第乙個引數 function 以引數序列中的每乙個元素呼叫 function 函式,返回包含每次 function 函式返回值的新列表。

map(function, iterable, …)

function – 函式

iterable – 乙個或多個序列

也就是將乙個函式用在需要用的地方

def square

(x):

return x**2

result=

list

(map

(square,[1

,2,3

,4,5

]))print

(result)

re=

list

(map

(lambda x:x**2

,range(1

,5))

)#當運算符號為%時表示判斷

print

(re)

這兩個就能很好的對比lambda的與def函式的用法

並且map與fliter返回的都是生成器(generator),

re=

(map

(lambda x,y:x+y,[1

,2,3

],[2

,3,4

]))#當運算符號為%時表示判斷

print

(re)

執行結果:

<

mapobject at 0x00000214383aadc8

>

也就是可以for遍歷出值:

re=

map(lambda x:x**2

,range(1

,5))#當運算符號為%時表示判斷

for i in re :

print

(i,end=

' ')

filter() 函式用於過濾序列,過濾掉不符合條件的元素,返回乙個迭代器物件,如果要轉換為列表,可以使用 list() 來轉換。

該接收兩個引數,第乙個為函式,第二個為序列,序列的每個元素作為引數傳遞給函式進行判斷,然後返回 true 或 false,最後將返回 true 的元素放到新列表中。

語法以下是 filter() 方法的語法:

filter(function, iterable)

上面已經有許多栗子了,這裡簡單舉乙個

a=

sum(

list

(filter

(lambda x:x*x,

range(1

,5))

))print

(a)

執行過的小夥伴會發現,返回值為:1,2,3,4

為什麼會這樣呢,因為filter會進行乙個判斷,就不會進行x*x這個步驟

如果我們這樣:

print

(list

(filter

(lambda x:x*x==x*3,

range(1

,5))

))

[

3]

會以列表形式(因為我用的list)得到這個值[3]因為只有3這個值滿足,所以返回3,這是我的理解,希望大家能夠有更好的想法 ,也可以告訴我哦.還有filter只能用乙個可迭代物件,我試過兩個卻報錯了。可能它這個函式引數只能有乙個吧,有興趣的可以去研究一下哦。

4.reduce函式的用法

reduce() 函式會對引數序列中元素進行累積。

函式將乙個資料集合(鍊錶,元組等)中的所有資料進行下列操作:用傳給 reduce 中的函式 function(有兩個引數)先對集合中的第

1、2 個元素進行操作,得到的結果再與第三個資料用 function 函式運算,最後得到乙個結果。

注意:python3.x reduce() 已經被移到 functools 模組裡,如果我們要使用,需要引入 functools 模組來呼叫

reduce() 函式:

from functools import reduce

reduce() 函式語法:reduce(function, iterable[, initializer])

function – 函式,有兩個引數

iterable – 可迭代物件

initializer – 可選,初始引數

當然這個函式也可以和lambda聯動的哦~

from functools import

reduce

#reduce需要呼叫

a=reduce

(lambda x,y:x+y,

range(1

,5))

print

(a)

結果等於1+2+3+4=10

reduce用於迴圈的做一件事左引數為累加值,右引數為序列值,並在序列為空時用作預設值。

這幾個常用的就介紹到這了,如果再學習當中有其他的好用函式,我會第一時間分享再上面。

如有不恰當的地方,還請指正。

python lambda匿名函式

lambda定義乙個匿名函式 lambda只是乙個表示式,函式體比def簡單很多,很多時候定義def,然後寫乙個函式太麻煩,這時候就可以用lambda定義乙個匿名函式。lambda的主體是乙個表示式,而不是乙個 塊。僅僅能在lambda表示式中封裝有限的邏輯進去。參考鏈結 lambda的特性 乙個語...

python lambda 匿名函式

語法 lambda 引數 表示式 接受引數,執行表示式,返回結果 示例 乙個lambda函式,把引數加10,然後返回結果 x lambda a a 10print x 5 lambda函式可以接受任意數量的引數 示例 乙個lambda函式,將引數a與引數b相乘,然後返回結果 x lambda a,b...

python lambda匿名函式

在學習python的過程中,lambda的語法時常會使人感到困惑,lambda是什麼,為什麼要使用lambda,是不是必須使用lambda?下面就上面的問題進行一下解答。1 lambda是什麼?看個例子 1 g lambda x x 1看一下執行的結果 g 1 2 g 2 3 當然,你也可以這樣使用...