zoukankan      html  css  js  c++  java
  • 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


      

      

  • 相关阅读:
    【BZOJ】1076: [SCOI2008]奖励关(状压dp+数学期望)
    【COGS & USACO】896. 圈奶牛(凸包)
    【wikioi】1553 互斥的数(hash+set)
    【wikioi】1229 数字游戏(dfs+水题)
    【COGS】714. USACO 1.3.2混合牛奶(贪心+水题)
    【wikioi】1403 新三国争霸(dp+kruskal)
    【wikioi】1108 方块游戏(模拟)
    [LeetCode] 270. Closest Binary Search Tree Value 最近的二叉搜索树的值
    [LeetCode] 261. Graph Valid Tree 图是否是树
    [LeetCode] 486. Predict the Winner 预测赢家
  • 原文地址:https://www.cnblogs.com/ethancui/p/5581609.html
Copyright © 2011-2022 走看看