遞迴:
遞迴的概念很簡單,如果函式包含了對其自身的呼叫,該函式就是遞迴。拗口一點的定義是,如果乙個新的呼叫能在相同過程中較早的呼叫結束之前開始,那麼該過程就是遞迴。
"""階乘"""def jie(n):
if n==0 or n==1:
return 1
else:
return n*jie(n-1)
print fac(8)
d:\python3.5\python.exe d:/untitled/python2/denglu.py
40320
process finished with exit code 0
'''''''''''遞迴方式『'''''''''''''''''
def digui(n): #定義函式 迴圈後的結果print(n) #輸出每一次的結果
if n == 1: #如果不等於繼續向下執行
return 1 #返回最終的結果
return digui(n-1) * 1 #返回的值減一在乘一
s = digui(10) #執行函式
print(s)
'''''''''''''''''斐波那契數列''''''''斐波那契數列指的是這樣乙個數列 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233,377,610,987,1597,2584,4181,6765,10946,17711,28657,46368
def digui(a,a1,a2): #定義函式,引數 #a = 2 a1= 13,a2 = 15 。。。。。。。。
if a == 10: #判斷如果q不等於10 就向下執行
return a,a1,a2
a3 = a1 + a2 #兩數相加附乙個新值 a3 等於15
re = digui(a + 1,a2,a3) #繼續回去一級一級迴圈結果 最終結果484
return re #定乙個返回值 一級一級退出迴圈
z = digui(1,2,13) #執行函式的最終結果
print(z)
d:\python3.5\python.exe d:/untitled/python2/denglu.py
(10, 484, 783)
process finished with exit code 0
def di(n,n1): #定義函式 引數 0,1
print(n) #輸 出最終的結果
if n > 100: #如果n(0)大於100就向下繼續執行直到大於100
return #返回終止
n2 = n + n1 # n=0 n1 = 1 n2 = 1
di(n1,n2) #兩數相加繼續迴圈
di(0,1) #執行函式 裡的引數值
d:\python3.5\python.exe d:/untitled/python2/denglu.py01
1235
8132134
5589
144process finished with exit code 0
def digui(q,q1):print(q,q1)
if q == 10:
return
w = q2 = q + q1
return w
s = digui(34,324)
print(s)
d:\python3.5\python.exe d:/untitled/python2/lianxi.py
34 324
358process finished with exit code 0
裝飾器:
裝飾器是函式,只不過該函式可以具有特殊的含義,裝飾器用來裝飾函式或類,使用裝飾器可以在函式執行前和執行後新增相應操作。
def func(x):print(x)
x =123 # 實參 x 代指123
func(x) 執行函式
巢狀一層的裝飾器:def quan(yuan):#1 #定義裝飾器函式, 這的引數代指的是原來(yuan1)函式
def xin(): #2 #4 裝飾器的內建函式//// 被原函式重新賦值的
print('新的') #5 執行函式前的操作
ret = yuan() #6 執行原來的函式
print('後來的') #10 執行後的操作
return ret #11 原函式的返回值
return xin #3 返回的新函式的返回值
@quan #5 #7 自動應用執行裝飾器的引數就是(yuan1)
def yuan1(): #原來的函式被重新賦值給了新的函式 定義為xin()
print('原來') #8 輸出原來的值
return 'yes' #9 返回乙個結果
s = yuan1() #執行函式結果
print(s)
巢狀兩層的裝飾器:
def quan_0(gun): #原來的yuan 函式做了兩次賦值 把quan函式呼叫成自己的內建函式
# 被quan_0代指 而這個gun引數等於quan內建函式裡的gun引數
def xin(*args,**kwargs): #xin函式等於第二個裝飾器的原來yuanl數重新第二次的賦值
print('123')
r = gun(*args,**kwargs)
return r
return xin
def quan(gun):
def xin(*args,**kwargs):
print("小伙")
r = gun(*args,**kwargs) #gun引數等於yuan函式裡的引數
print('好')
return r
return xin
@quan_0
@quan
def yuan(q1,q2):
print('火了')
return q1 + q2
s = yuan(12,21)
print(s)
day10 裝飾器 遞迴
一 裝飾器 作用 不修改模組原 的情況下給模組新增新功能 關鍵字 from functools import wraps defouter fn wraps fn 用於保留原函式的屬性,不使用則被修飾函式的屬性變成inner函式的屬性 wraps fn definner args,kwargs pr...
小技巧 裝飾器裝飾乙個遞迴函式
在python中裝飾器可以為原函式新增一些功能。但如果函式本身是遞迴定義的,則不會僅裝飾最外層,而是在每次遞迴的時候都呼叫裝飾器。這樣會導致原函式無法被直觀的裝飾。首先定義乙個裝飾器 隨便定義乙個裝飾器 defmy decorator fun def decorator args,kwargs fu...
Python之遞迴函式與裝飾器
遞迴函式 在函式內部,可以呼叫其他函式。如果乙個函式在內部呼叫自身本身,這個函式就是遞迴函式。遞迴函式特性 必須有乙個明確的結束條件 每次進入更深一層遞迴時,問題規模相比上次遞迴都應有所減少 相鄰兩次重複之間有緊密的聯絡,前一次要為後一次做準備 通常前一次的輸出就作為後一次的輸入 遞迴效率不高,遞迴...