遞歸函數
遞歸函數指的是:自己調用自己的函數,在函數體内部直接或間接的自己調用自己。遞歸類
似于數學的“數學歸納法”。 每個遞歸函數必須包含兩個部分:
1. 終止條件
表示遞歸什麼時候結束。一般用于傳回值,不再調用自己。
2. 遞歸步驟
把第 n 步的值和第 n-1 步相關聯。
遞歸函數由于會建立大量的函數對象、過量的消耗記憶體和運算能力。在處理大量資料時,謹
慎使用。
【操作】 使用遞歸函數計算階乘(factorial)
factorial(n):
if n == 1:
return 1
return n*factorial(n-1)
for i in range(1,6):
print("{0}!={1}".format(i,factorial(i)))
執行結果:
1!=1
2!=2
3!=6
4!=24
5!=120
嵌套函數(内部函數)
嵌套函數: 在函數内部定義的函數!
【操作】 嵌套函數定義
def f1():
print('f1 running...')
def f2():
print('f2 running...')
f2()
f1()
執行結果:
f1 running...
f2 running...
上面程式中,f2()就是定義在 f1 函數内部的函數。f2()的定義和調用都在 f1()函數内部。
一般在什麼情況下使用嵌套函數
1. 封裝 - 資料隐藏
外部無法通路“嵌套函數”。
2. 貫徹 DRY(Don’t Repeat Yourself) 原則
嵌套函數,可以讓我們在函數内部避免重複代碼。
3. 閉包
【操作】使用嵌套函數避免重複代碼
def printChineseName(name,familyName):
print("{0} {1}".format(familyName,name))
def printEnglishName(name,familyName):
print("{0} {1}".format(name, familyName))
#使用 1 個函數代替上面的兩個函數
def printName(isChinese,name,familyName):
def inner_print(a,b):
print("{0} {1}".format(a,b))
if isChinese:
inner_print(familyName,name)
else:
inner_print(name,familyName)
printName(True,"狐沖","令")
printName(False,"David","Copperfield")
運作結果:
令 狐沖
David Copperfield