好啦,親愛的們,上次小編給大家講了python函數,趁熱打鐵,小易今天要給大家講一講用函數偷懶的那些事兒啦,今天我們要講的內容有三個,爲了不讓大家拉到底部然後馬上收藏退出,三連,小編還是老老實實爲大家解惑:匿名函數、filter與map、遞歸。(頭條君會吞掉小編的代碼,所以小編截圖了相關代碼內容,需要源代碼的話可以私信小編。)

1匿名函數

使用 lambda 來創建匿名函數

lambda這個名稱來自於LISP,而LISP則是從lambda calculus(一種符號邏輯形式)取這個名稱的。

在Python中,lambda作爲一個關鍵字,作爲引入表達式的語法。想比較def函數,lambda是單一的表達式,而不是語句塊!

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

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

匿名函數的優點:

1)可節省定義函數的過程,使代碼更精簡

2)對於一些抽象的,很少重複使用的函數使用lambda就不用考慮命名問題

3)簡化代碼的可讀性

下面來看一下簡單的例子:

普通函數:

): 2*x+15)11

使用lambda定義函數:

=lambda x2*x+15)11=lambda xyx+y3,4)7 ): + y

3,4)

7

2filter與map

filter與map也是兩個高階函數。

1filter

filter有兩個參數

):

x%2 #x除以2的餘數

=range10)

=)

#odd爲第一個參數,若第一個參數爲none,則將第二個裏面的True值篩選出來

#temp爲第二個參數,若第一個爲函數,則第二個可迭代數據的每一個元素

#接上,都將作爲函數參數進行計算,將返回爲True的值篩選出來合併爲一個列表

)

[1, 3, 5, 7, 9]

% 2range10))) #利用匿名函數結合filter

[1, 3, 5, 7, 9]

2map

map是映射,同樣有兩個參數。

list(map(lambda x : x * 2,range(10)))

#第一個參數是函數,第二個參數是可迭代序列,此函數運行時將序列中每一個元素作爲函數的參數進行運算,直至所有元素由此進入一個新的序列爲止。

[0, 2, 4, 6, 8, 10, 12, 14, 16, 18]

高階函數結合匿名函數簡直就是偷懶用的神器有木有,不過小編建議,初學者的話還是先不要偷懶,先要對代碼進行熟練然後再來想偷懶的事情哦。

3遞歸

遞歸一直被稱爲天才程序員使用的專利,到底遞歸有和神奇之處呢?

利用遞歸處理的自拍美照

程序調用自身的編程技巧稱爲遞歸( recursion)。遞歸做爲一種算法在程序設計語言中廣泛應用。 一個過程或函數在其定義或說明中有直接或間接調用自身的一種方法,它通常把一個大型複雜的問題層層轉化爲一個與原問題相似的規模較小的問題來求解,遞歸策略只需少量的程序就可描述出解題過程所需要的多次重複計算,大大地減少了程序的代碼量。遞歸的能力在於用有限的語句來定義對象的無限集合。一般來說,遞歸需要有邊界條件、遞歸前進段和遞歸返回段。當邊界條件不滿足時,遞歸前進;當邊界條件滿足時,遞歸返回。

遞歸就好像可以不斷分叉的知識樹一樣,但是它其中蘊含着奇妙的規律,首先來看一個簡單的例子

): ))#結果如下:Traceback (most recent call last): File "", line 3, in File "", line 2, in recursion File "", line 2, in recursion File "", line 2, in recursion Previous line repeated 986 more times]#運行結束了: maximum recursion depth exceeded

這個是最簡單的遞歸,如果電腦足夠強大,且不按下Ctrl+C鍵的話,則會一直運行遞歸(Ctrl+C在pythonconsole裏是停止運行)。

1)斐波那契數列

斐波那契數列(Fibonacci sequence),又稱黃金分割數列、因數學家列昂納多·斐波那契(Leonardoda Fibonacci)以兔子繁殖爲例子而引入,故又稱爲“兔子數列”,指的是這樣一個數列:1、1、2、3、5、8、13、21、34、……在數學上,斐波納契數列以如下被以遞推的方法定義:F(1)=1,F(2)=1, F(n)=F(n-1)+F(n-2)(n>=3,n∈N*)

如果我們使用Python來計算斐波那契數列的值要如何編寫代碼呢?這裏我們採取迭代方式與遞歸兩種方法進行計算。

迭代方式: ): n1=1 n2=1 n3=1 <1: print("數據有誤請重新輸入:") -1 -2>0: n3=n2+n1 n1=n2 n2=n3 -=1 n3=45) =-1:print("結果爲%d"%result)結果爲1134903170遞歸方式: ): <1: print("輸入有誤!") -1 ==1 or n==2: 1 : -1+fabn-2)=30) =-1: print("結果是%d"%result)結果是832040#遞歸數據縮小是因爲數據越大運行速度越慢

當然遞歸也並不是毫無瑕疵,相比較迭代方法,遞歸的運行速度會更慢,而且運行數據越多,則會更慢,所以遞歸也並不是萬能的,遞歸原本是爲了效率而使用遞歸方法,千萬不要本末倒置。

2)漢諾塔

法國數學家愛德華·盧卡斯曾編寫過一個印度的古老傳說:在世界中心貝拿勒斯(在印度北部)的聖廟裏,一塊黃銅板上插着三根寶石針。印度教的主神梵天在創造世界的時候,在其中一根針上從下到上地穿好了由大到小的64片金片,這就是所謂的漢諾塔。不論白天黑夜,總有一個僧侶在按照下面的法則移動這些金片:一次只移動一片,不管在哪根針上,小片必須在大片上面。僧侶們預言,當所有的金片都從梵天穿好的那根針上移到另外一根針上時,世界就將在一聲霹靂中消滅,而梵塔、廟宇和衆生也都將同歸於盡。

不管這個傳說的可信度有多大,如果考慮一下把64片金片,由一根針上移到另一根針上,並且始終保持上小下大的順序。這需要多少次移動呢?這裏需要遞歸的方法。假設有n片,移動次數是f(n).顯然f(1)=1,f(2)=3,f(3)=7,且f(k+1)=2*f(k)+1。此後不難證明f(n)=2^n-1。n=64時,

假如每秒鐘一次,共需多長時間呢?一個平年365天有31536000 秒,閏年366天有31622400秒,平均每年31556952秒,計算一下:

18446744073709551615秒

這表明移完這些金片需要5845.54億年以上,而地球存在至今不過45億年,太陽系的預期壽命據說也就是數百億年。真的過了5845.54億年,不說太陽系和銀河系,至少地球上的一切生命,連同梵塔、廟宇等,都早已經灰飛煙滅。

漢諾塔平時是一種益智類玩具,例如下圖,一般層數不會過高,而這個數字越大,所耗費的時間精力也就越大,若是單純依靠人力計算的話無疑是件大工程,如果我們採用遞歸的方法就會簡單許多。

def hanoi(n,x,y,z): ==1: ,"-->"z) : hanoi(n-1,x,z,y)#將前n-1個盤子從x移動到y上 x,"-->"z#將最底下的最後一個盤子從x移動到z上 hanoi(n-1,y,x,z,)#將y上的n-1個盤子移動到z上n=int(input("請輸入漢諾塔層數:"))hanoi(n,"X","Y","Z")請輸入漢諾塔層數:>? 6X --> YX --> ZY --> ZX --> YZ --> XZ --> YX --> YX --> ZY --> ZY --> XZ --> XY --> Z#可以說這就是一個遊戲攻略了

Tips:

頭條君會吞掉小編的內容,因此小編將代碼單獨截圖,需要源代碼的親也可以私信小編哦。

查看原文 >>
相關文章