python --> 递归 以及装饰器
一、递归知识
函数迭套执行,逐层执行之后,满足某个条件之后就会停止执行,将return值返回上层的函数,上层函数再逐层返回,最终返回给最初始函数。
递归在斐波那契数列的应用【斐波那契数列特点:前两个数字相加之和等于下一个数字】
例一、打印出小于10000的斐波那契数列
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 def f(a1,a2): 2 if a1 > 10000: 3 return 4 print(a1) 5 a3 = a1 + a2 6 f(a2,a3) 7 8 res = f(0,1) 9 print(res)
例二、获得斐波那契数列第10个数字
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 def f(a1,a2,tries): 2 if tries == 10: 3 return a1 4 a3 = a1 + a2 5 f(a2,a3,tries+1) 6 7 result = f(0,1,1) 8 print(result)
二、装饰器
装饰器用来装饰函数,可以让函数在执行之前后做一些操作,让调用者的执行方式不改变,并且不再函数内部进行修改,把原函数封装在新函数里,执行的时候都执行掉
装饰器的原理: @ 符号在python中有特殊意义,后面可加函数名,例outer,就是代表执行函数outer(),并且将其下面的函数名,例如 f1(原来的函数) ,当作参数传递给outer函数,并将outer函数的返回值赋值 例如 inner 给下面的函数f1,即下面的函数变成了 inner 函数
# python从上到下进行执行,如果2个函数名一样,那么调用的时候,就是执行下面的函数,所以 @outer 之后,执行函数,下面被装饰的函数 f1()就变成了 inner(),以后再调用 f1 函数就是在调用 inner 函数
简单装饰器示例如下:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 def outer(func): 2 def inner(*args,**kwargs): 3 print('hello') 4 res = func(*args,**kwargs) 5 print('End') 6 return res 7 return inner 8 9 @outer 10 def f1(*arg): 11 print('nice to meet you') 12 return 'F1' 13 14 r = f1() 15 print(r)
总结:只要函数应用了装饰器,函数就会变成了装饰器的内层函数,以后执行此函数时,就是在执行内层函数,给某个函数使用多个装饰器,先执行最上面的装饰器,最上面的装饰器也要包含inner内容的,inner里肯定也要包含原函数的
双层装饰器示例如下:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 def outer2(fuc): 2 def outer1(*args,**Kwargs): 3 print('hello again') 4 res = fuc(*args,**kwargs) 5 print('goodbye') 6 return res 7 return outer1 8 9 def outer(func): 10 def inner(*args,**kwargs): 11 print('hello') 12 res = func(*args,**kwargs) 13 print('have a nice day') 14 return res 15 return inner 16 17 @outer2 18 @outer 19 def f1(*arg): 20 print('goodday') 21 return 'F1' 22 23 result = f1() 24 print(result)