昨日内容回顾
-
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
标签:index,return,函数,递归函数,器及,kwargs,装饰,def
From: https://www.cnblogs.com/akazukis/p/16786242.html