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
注意:
- 匿名函數的主體只能是一行簡單表達式,不能擴展成一個多行的代碼塊。
- 先賦值再運行,和函數不太一樣,必須將匿名函數賦值給一個變量纔可以執行,如果不賦值就相當於只定義,但是沒有名字,類比房間沒有房間號,不可以被調用。