python --> 递归 以及装饰器

一、递归知识

  函数迭套执行,逐层执行之后,满足某个条件之后就会停止执行,将return值返回上层的函数,上层函数再逐层返回,最终返回给最初始函数。

  递归在斐波那契数列的应用【斐波那契数列特点:前两个数字相加之和等于下一个数字】

  例一、打印出小于10000的斐波那契数列

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)
View Code

  例二、获得斐波那契数列第10个数字

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)
View Code

二、装饰器

  装饰器用来装饰函数,可以让函数在执行之前后做一些操作,让调用者的执行方式不改变,并且不再函数内部进行修改,把原函数封装在新函数里,执行的时候都执行掉

  装饰器的原理: @ 符号在python中有特殊意义,后面可加函数名,例outer,就是代表执行函数outer(),并且将其下面的函数名,例如 f1(原来的函数) ,当作参数传递给outer函数,并将outer函数的返回值赋值 例如 inner 给下面的函数f1,即下面的函数变成了 inner 函数

  # python从上到下进行执行,如果2个函数名一样,那么调用的时候,就是执行下面的函数,所以 @outer 之后,执行函数,下面被装饰的函数 f1()就变成了 inner(),以后再调用 f1 函数就是在调用 inner 函数

  简单装饰器示例如下:

 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)
View Code

  总结:只要函数应用了装饰器,函数就会变成了装饰器的内层函数,以后执行此函数时,就是在执行内层函数,给某个函数使用多个装饰器,先执行最上面的装饰器,最上面的装饰器也要包含inner内容的,inner里肯定也要包含原函数的

  双层装饰器示例如下:

 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)
View Code


  

  

原文地址:https://www.cnblogs.com/ethancui/p/5581609.html