装饰器&递归

装饰器

1.开放封闭原则

在源码不改变的情况下,增加一些额外的功能

对扩展是开放的,对修改是封闭的
1.1 开放原则:增加额外新功能
1.2 封闭原则:不要改变源码

2 装饰器

满足开放封闭原则,在不改变原函数代码及调用方式的前提下,增加新功能
# 基本装饰器
def wrapper(func):  # 1
    def inner(*args):  # 这里的* 是聚合  ## 5
        ret = func(*args)  # 这里的* 是打散  ## 6
        return ret   # 7
    return inner
@wrapper    # 2  func1 = wrapper(func1)  所以运行到这一步 wrapper函数执行
def func1(*args):  # 3
    ...      # 6
func1()   #  4
语法糖的作用
# 标准版的装饰器

@a
def b():
    pass

# 语法糖的那行  就等价于   b = a(b)  把那一行换成这一行 是一样的 所以这是执行操作,和下面调用没关系

## 带参数的装饰器

@c(1)
def b():
    pass

## 这个有两行操作  a = c(1)    b = a(b)
带参数装饰器
## 当装饰器装饰两个以上验证方式又不相同的函数时,就用到了带参数的装饰器
def outer(choose):  
    def wrapper(func):
        def inner(*args,**kwargs):
            if choose =='func1':
                print ('func1的判断条件')
                ret = func()
                return ret
            if choose=='func2':
                print ('func2的判断条件')
                ret = func()
                return ret
        return inner
    return wrapper
@outer('func1')   ## 这里的 outer('func1') 先执行  返回 wrapper 函数,所以就只比标准函数多一步操作
def func1():
    print('我是被装饰的函数1')
@outer('func2')    
def func2():
    
    print ('我是被装饰的函数2')
## 当然这样写很蠢;如果有操作的话可以直接对choose这个变量操作,不需要判断,因为相应的choose是不一样的

两个装饰器装饰一个函数

def wrapper1(func):    
    print(0)
    def inner1():
        print(111)
        func()
        print(222)
    return inner1



def wrapper2(func):
    print(9)
    def inner2():
        print(333)
        func()
        print(444)
    return inner2
@wrapper1
@wrapper2
def func0():
    print('********')
    
## 结果 
9
0
111
333
********
444
222
## 这个语法糖 等价于 func0  = wrapper1(wrapper2(func0))

递归

递归绝不是简单的自己调用自己,他是一种化繁为简的思想,请宏观的看问题,细节交给计算机

递归要满足两点要求

​ 1 递归条件:可以通过不断调用自身,缩小待解决问题的范围

​ 2 基线条件:出口,当不满足递归条件时

# 阶乘问题
def jc(n):
    if n==1:
        return 1
    else:
        return n*jc(n-1)
## 斐波那契数列 第n项的值
def fbnq(n):
    if n==1:
        return 1
    if n<=0:
        return 0
    return fbnq(n-1)+fbnq(n-2)

转载于:https://www.cnblogs.com/albert0823/p/11087810.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值