Python之遞歸函數、函數作用域以及匿名函數——第八天

1、遞歸函數定義
自己調用自己的函數,例子如下:

def calc(n):
    print(n)
    if int(n/2)==0:
        return n
    res=calc(int(n/2))
    return res

res=calc(10)

#輸出結果:
10
5
2
1

2、遞歸特性
(1)必須有一個明確的結束條件
(2)每進入一層遞歸,問題規模相比上次遞歸都應該有所減少
(3)遞歸效率不高,遞歸層次過多容易造成內存溢出(在計算機中,函數調用是通過棧這種數據結構實現的,每當執行一次函數調用,就會增加一層棧幀,每返回一次函數,就會減少一層棧幀,由於棧的大小不是無限的,所以,遞歸調用的次數過多,會導致棧溢出)

3、打印函數名會出現內存地址

def test():
    pass
print(test)


#輸出結果:
<function test at 0x02D0B6A0>

4、將函數名賦值,並打印,就相當於執行

name = "123"
def test():
   return name
p = test()
print(p)

#輸出結果:
123

5、匿名函數
(1)匿名函數的定義:
lambda 函數形參:函數的功能表達式(相當於return),對比普通函數,舉例如下:

需求:給變量後追加一個字符串

#匿名函數

name="alex"
p = lambda x:x+"_add"
print(p(name))

#輸出結果:
alex_add
#普通函數

name="alex"
def test(x):
    return name+"_add"
print(test(name))

#輸出結果:
alex_add

(2)可以有多個參數,python3的表達式不加括號也沒有報錯,不過最好還是加括號,看起來清晰些

#正常加()的

p = lambda x,y,z:(x+y+z)
print(p(1,2,3))

#輸出結果:6

注意:

  • 匿名函數的主體只能是一行簡單表達式,不能擴展成一個多行的代碼塊。
  • 先賦值再運行,和函數不太一樣,必須將匿名函數賦值給一個變量纔可以執行,如果不賦值就相當於只定義,但是沒有名字,類比房間沒有房間號,不可以被調用。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章