python基礎 匿名函式及遞迴函式

2021-09-05 08:17:21 字數 4409 閱讀 9892

1 匿名函式語法

匿名函式lambda x: x * x實際上就是:

deff(x):

returnx*x

關鍵字lambda表示匿名函式,冒號前面的x表示函式引數

匿名函式有個限制,就是只能有乙個表示式,不用寫return,返回值就是該表示式的結果

2 匿名函式舉例

用匿名函式有個好處,因為函式沒有名字,不必擔心函式名衝突。此外,匿名函式也是乙個函式物件,也可以把匿名函式賦值給乙個變數,再利用變數來呼叫該函式:

>>> f=lambdax: x*x

>>> f

at0x10453d7d0>

>>> f(5)

25

同樣,也可以把匿名函式作為返回值返回,比如:

defbuild(x, y):

returnlambda: x*x+y*y

遞迴函式

1、遞迴函式定義

遞迴就是引用(或者呼叫)自己的意思

有用的遞迴函式包含以下幾個部分:

1 必須有乙個明確的結束條件

2 每次進入更深一層遞迴時,問題規模相比於上次遞迴都應有減少

3 遞迴效率不高,遞迴層次過多會導致棧溢位(在計算機中,函式呼叫時通過棧stack這種資料結構實現的,每當進入乙個函式呼叫,棧就會加一層幀,每當函式返回,棧就會減一層棧幀。由於棧的大小不是無限的,所以,遞迴呼叫的次數過多,會導致棧溢位,程式會以乙個「超過最大遞迴深度」的錯誤資訊結束)

遞迴中每次函式被呼叫,針對這個呼叫函式的新命名空間會被建立,意味著當函式呼叫「自身」時,實際上執行的是兩個不同的函式(或者說是同乙個函式具有兩個不同的命名空間)

遞迴的深度:

importsys

print(sys.getrecursionlimit())

輸出結果為:

1000

2 遞迴函式實現二分法舉例

二分法舉例:

data=list(range(1000))

defsear(num,data):

iflen(data)>1:

#二分

mid_index=int(len(data)/2)

mid_value=data[mid_index]

ifnum > data[mid_index]:

#num在列表的右邊

data=data[mid_index:]

sear(num,data)

elifnum < data[mid_index]:

#num在列表的左邊

data=data[:mid_index]

sear(num,data)

else:

print("find it")

return

else:

ifdata[0]==num:

print('find it')

else:

print('not exists')

sear(0,data)

sear(999,data)

sear(10000,data)

輸出結果為:

find it

find it

notexists

求5的階乘

defnum (n):

ifn==1:

return1

else:

returnnum (n-1)*n

print(num(5))

輸出結果為:

120

方法和函式的區別

1 呼叫方法不一樣 函式括號 方法點號

2 方法只對呼叫它的物件有用

函式沒有繫結任何物件

方法可以繫結到具體的物件

函式式程式設計概念

程式設計風格

1不會修改外部值的狀態

2 精簡,可讀性差

python匿名函式和遞迴

命名空間 內建命名空間 python直譯器一啟動就可以使用的名字儲存在內建命名空間 在啟動器啟動時被載入進記憶體裡 全域性命名空間 程式從上到下被執行的過程中一次載入進記憶體 放置了我們所有設定的變數名和函式名 區域性命名空間 函式內部定義的名字 當函式呼叫時,才會產生這個命名空間,隨著函式執行的結...

python之遞迴函式 匿名函式

定義 遞迴,就是函式自己呼叫自己 deffunc num int input num if num 2 0 print 是偶數 return else func 匿名函式 2 匿名函式 意義 減少記憶體占用 lambada 定義乙個匿名函式,eg lambad x,b x b 前面是入參eg x,b...

python遞迴函式和匿名函式

乙個函式的內部可以呼叫其他函式。但是,如果乙個函式在內部不呼叫其他函式,而是自己本身的話,這個函式就是遞迴函式。例 def fn num if num 1 result 1else result fn num 1 num return result n int input 請輸入乙個正整數 prin...