1. 程式人生 > >Python--lambda&遞迴

Python--lambda&遞迴

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)