有参装饰器及递归函数

昨日内容回顾

  • global与nonlocal关键字

    global 函数体内部调用全局名称空间内的变量。

    nonlocal 函数嵌套后,内部函数调用外部函数名称空间内的变量。

  • 闭包函数

    函数嵌套时,内部函数含有外部函数名称空间内的变量名。

    闭包函数主要用来为内部函数传参。

  • 装饰器简介

    装饰器本身是一个函数,主要功能是为原函数添加新的功能同时不改变原函数的调用方式。

  • 装饰器模板

    def outer(func_name):
        def inner(*args, **kwargs):
            res = func_name(*args, **kwargs)
            return res
        return inner
    
  • 装饰器语法糖

    语法糖可自动将下方紧跟的函数的函数名作为第一个参数传给@后的函数。

今日内容概要

  • 多层语法糖的执行顺序
  • 有参装饰器
  • 装饰器的修复
  • 递归函数

今日内容详细

多层语法糖的执行顺序

多重装饰器的形式如下:

def outter1(func1):
    print('加载了outter1')
    def wrapper1(*args, **kwargs):
        print('执行了wrapper1')
        res1 = func1(*args, **kwargs)
        return res1
    return wrapper1

def outter2(func2):
    print('加载了outter2')
    def wrapper2(*args, **kwargs):
        print('执行了wrapper2')
        res2 = func2(*args, **kwargs)
        return res2
    return wrapper2

def outter3(func3):
    print('加载了outter3')
    def wrapper3(*args, **kwargs):
        print('执行了wrapper3')
        res3 = func3(*args, **kwargs)
        return res3
    return wrapper3

@outter1
@outter2
@outter3
def index():
    print('from index')
index()

语法糖执行顺序如下:

@outer3 → index = outer3(index) → wrapper3
@outer2 → wrapper3 = outer2(wrapper3) → wrapper2
@outer1 → wrapper2 = outer1(wrapper2) → wrapper1
→  index = wrapper1

执行阶段顺序如下:

wrapper1() → wrapper2() → wrapper3()

有参装饰器

有参装饰器的主要功能是为装饰器内部函数传入额外的参数。有参装饰器模板如下:

def wrapper(parameter_name):
    def outer(func_name):
        def inner(*args, **kwargs):
            res = func_name(*args, **kwargs)
            return res
        return inner
    return outer

有参装饰器可以一次性传入多个参数,因此两层装饰器即可满足额外传参要求。

装饰器的修复

使用装饰器后,通过help方法可以查看函数的注释,使用help方法可查看两个函数的区别。装饰器的修复可以实现装饰器的以假乱真,造成新函数与原函数完全相同的假象。

修复装饰器的方法

装饰器函数定义上一行加上:

from functools import wraps

然后在装饰器内部函数定义上一行加上:

@wraps(func_name)

递归函数

函数的递归调用

一种是直接调用,函数直接调用自身:

def index():
    print('from index')
    index()

另一种是间接调用,通过调用其他函数间接调用自身:

def index():
    print('from index')
    func()
    
def func():
    print('from func')
    index()

python解释器默认的递归深度为1000,实际运行可能调用次数在995-1000之间。

递归函数的基本特点

  • 函数直接或间接调用自己。
  • 函数的调用每次调用均比上一次调用简单,且有明确的结束条件。

递归函数的基本格式

def func(n):
    if n == 1:	
        return res
    return func(n-1) +1
posted @ 2022-10-12 21:48  Akazukis  阅读(29)  评论(0)    收藏  举报