Python--lambda&遞迴
阿新 • • 發佈:2018-11-28
lambda
- lambda關鍵字用於建立匿名函式,lambda函式能接收任意數量引數,只能返回一個表示式的值
- lambda自帶返回值
- 用一次就清除
格式:
# 普通函式 def fooo(): return x**2 print(foo(3)) # 使用lambda實現 lambda x : x**2 #<function <lambda> at 0x7fa1c6a17488> # x 是引數 # x**2 相當於 return x**2
lambda函式地址
print(lambda x:x**2) # <function <lambda> at 0x7fa1c6a17488>
給lambda起名字
f = lambda x : x**2 f(3) # 9 # 這樣人為的加了個名字,沒什麼意義
使用:
def foo(n): return lambda x:x+n res = foo(15) print(res(6))
遞迴
遞迴呼叫:呼叫一個函式的過程中直接或者間接地呼叫了該函式本身
# 直接呼叫: def func(): print('hello') func() func() #無限遞迴,記憶體會把所有經歷過的遞迴儲存,內 存溢位 # 間接呼叫: def foo(): print('hello') bar() def bar(): print('haha') foo() foo()
遞迴特性:
遞迴效率低,需要在進入下一次遞迴時保留當前的狀態
解決辦法是尾遞迴,就是在函式最後一步(注意不是最後一行)呼叫自己
python沒有尾遞迴,它對遞迴的層級做了限制
1. 必須有一個明確的結束條件
2. 每次進入更深一層遞迴時,問題規模相比上次遞迴都應有所減少
3. 遞迴效率不高,遞迴層次過多會導致棧溢位(在計算機中,函式呼叫是通過棧(stack)這種資料結構實現的,每當進入一個函式呼叫,棧就會加一層棧幀,每當函式返回,棧就會減一層棧幀。由於棧的大小不是無限的,所以,遞迴呼叫的次數過多,會導致棧溢位)
def age(n): if n ==5: return 18 return age(n+1)+2 print(age(1))
例:
l=[1,[2,3,[4,5,[6,7,[8,9,[10,11,[12,13]]]]]]] def func(l): for i in l: if isinstance(i,list): func(i) else: print(i) func(l)