匿名函數

如今咱們要了解到一種函數:匿名函數。編程

  • ambda只是一個表達式,函數體比def簡單不少。
  • lambda的主體是一個表達式,而不是一個代碼塊。僅僅能在lambda表達式中封裝有限的邏輯進去。
  • lambda函數擁有本身的命名空間,且不能訪問自有參數列表以外或全局命名空間裏的參數。
  • 雖然lambda函數看起來只能寫一行,卻不等同於C或C++的內聯函數,後者的目的是調用小函數時不佔用棧內存從而增長運行效率。

因此 咱們能夠總結出來的是,匿名函數是一個能進行簡單邏輯運算的簡單函數,優勢是不用再去命名類命名函數,下降程序的冗餘度。函數式編程

在如下兩種狀況時使用匿名函數:函數

1. 指定運算一次性使用,因此不須要定義函數名,節省內存中變量定義空間

2. 若是想讓程序更加簡潔時。spa

咱們下面來看看普通的加法函數:對象

def add(x,y):ip

    a=x+y內存

    return a博客

咱們再來使用匿名函數的方法:效率

a=lambda x,y:x+yimport

這樣是否是簡潔了不少?

a=lambda x,y:x+y

print(a(1,2))

輸出結果爲:

3

 

那麼我來說解一下匿名函數的應用,匿名函數能夠和map,reduce,filter相結合使用。

①map:

map() 會根據提供的函數對指定序列作映射。

如今先來一段程序理解如下:

list1=[1,2,3,4,5]

def multiply(x):

    return x**2

a=map(multiply,list1)

print(a)

輸出結果:

<map object at 0x000001F25C276F98>

因而在代碼尾,再加一句print(list(a))

輸出結果:

<map object at 0x000001F25C276F98>

[1, 4, 9, 16, 25]

看到這兒,應該明白了map的做用,我用通俗易懂的方式寫出map的公式和做用:

a=map(函數,列表),用括號內的函數的功能去實現列表裏的每個元素。

那麼輸出結果在Python3.x中返回迭代器(在Python2.x中返回列表),承載着幾個數據,故正確的打印應該是print(list(a))

咱們在上面已經提到了能夠跟匿名函數結合運算:

list1=[1,2,3,4,5]

a=map(lambda x:x**2,list1)

print(list(a))

輸出結果:

[1, 4, 9, 16, 25]

咱們能夠看到,跟匿名函數結合以後,代碼變得更加簡潔有效。

 

②reduce:

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

如今一段程序理解一下:

def add(x,y):

    return x+y

list2=[1,2,3,4,5]

a=reduce(add,list2)

print(a)

咱們運行的時候,卻發現報了reduce的錯,緣由在於:

在 Python3 中,reduce() 函數已經被從全局名字空間裏移除了,它如今被放置在 functools 模塊裏,若是想要使用它,則須要經過引入 functools 模塊來調用 reduce() 函數:

from functools import reduce

 

def add(x,y):

 

    return x+y

 

list2=[1,2,3,4,5]

 

a=reduce(add,list2)

 

print(a)

輸出結果是:

15

那麼爲何打印的時候,不是print(list(a))呢?要注意,這個函數的輸出結果是一個數,而不是幾個數據,可是依然輸出到了迭代器。

a=reduce(函數,列表),用括號內的函數去累加處理列表的每個元素。也就是說,若是函數是乘法函數,那麼輸出結果就是列表中全部元素相乘的值。

那麼如今咱們就用匿名函數與reduce相結合來試試乘法:

from functools import reduce

list2=[1,2,3,4,5]

a=reduce(lambda x,y:x*y,list2)

print(a)

輸出結果:

120

 

③filter:

filter() 函數用於過濾序列,過濾掉不符合條件的元素,返回由符合條件元素組成的新列表。

這個filter的運做方式是和map同樣的,輸出結果也是幾組數據:

def is_1(x):

    return x == 1

list3=[1,2,5,1,6,1]

a=filter(is_1,list3)

print(list(a))

輸出結果:

[1,1,1]

a=filter(函數,列表),用括號內的函數去篩選過濾列表的每個元素。

一樣的,咱們依然能使用匿名函數的方法去簡化:

list3=[1,2,5,1,6,1]

a=filter(lambda x:x==1,list3)

print(list(a))

輸出結果:

[1,1,1]

 

如今我講完了匿名函數與map,reduce和filter相結合的方法,咱們來總結一下:

這三個的輸出結果都是到迭代器,處理的對象是列表。

匿名函數可讓代碼變得更加簡潔效率化,減小佔用內存。

那麼,匿名函數與map,reduce和filter相結合的這種方法,究竟屬於什麼樣的編程呢?

咱們把這種方式叫作命令式編程。

那麼,還有一種編程方式,天然是函數式編程,函數式編程能夠說已經貫穿了以前的博客,由於:

函數式編程是用def,for,if,else等等來完成。

 

咱們在寫代碼的時候,要學會取捨命令式編程和函數式編程的使用,不一樣的狀況下作出不一樣的選擇。

那麼我就囉嗦一下函數式編程中的一些可以更簡潔的方法吧:

這個方法叫作三元表達式:

x=2

y=1

z=x if x >y else y 

print(z)

輸出結果:

2

很顯然,三元表達式極大簡化了代碼,但願你們也注意一下這種表達式的應用。

相關文章
相關標籤/搜索