zoukankan      html  css  js  c++  java
  • 装饰器&递归

    装饰器

    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)
    
  • 相关阅读:
    小数化分数2
    Sum of divisors
    Subsequence
    Lowest Bit
    Specialized Four-Digit Numbers
    Hunters
    Pet
    测试你是否和LTC水平一样高
    Bank Interest
    bzoj 1295
  • 原文地址:https://www.cnblogs.com/albert0823/p/11087810.html
Copyright © 2011-2022 走看看