装饰器&递归

装饰器

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)
posted on 2019-06-26 08:29  _albert  阅读(175)  评论(0编辑  收藏  举报