闭包
函数内部作用域定义的变量和函数,只能在函数内部使用(外部无法直接访问和修改)
函数外部要使用局部作用域内的数据,只能通过return返回出去
闭包函数 = 函数 + 保存引用数据的封闭作用域`
闭包的特征:
函数中嵌套一个函数
外层函数rertun返回 内层函数
内层函数有引用 **外部作用域** 的非全局变量
装饰器:
定义:本质是函数,(装饰其他函数)就是为其他函数添加附加功能
原则:
1、不能修改被装饰函数的源代码
2、不能修改被装饰的函数的调用方式
实现装饰器知识储备
1、函数既变量
2、高阶函数
把函数名当作一个实参传递给另一个函数
返回值中包含函数名
3、嵌套函数
高阶函数+嵌套函数=装饰器
"""
基础装饰器:
func_demo(2,3)
输出:
-----装饰器的扩展功能--1----
a除B的结果为: 0.6666666666666666
装饰器的副作用:
print(func_demo.__name__) 打印函数的名称
print(func_demo.__doc__) 打印函数的注释说明
在函数func_demo使用装饰器func后,打印func_demo的函数名,和函数说明,会打印出wrapper的函数名和函数说明
为了消除这一副作用,需要引入模块 :from functools import wraps
装饰器装饰类
注意:
在装饰类的时候在调用原来类的对象的时候,一定要用一个变量接受,然后对变量进行返回,不加return类就不能创建对象
可以传参数的装饰器
点击查看代码
def decorator(name):
"""最外层的参数是装饰器的参数"""
def wrapper1(func):
"""第二次定义的参数,接收被装饰的函数"""
def wrapper2(*args, **kwargs):
print("-----装饰器的扩展功能代码111")
print("装饰器传入的参数name:", name)
# 执行被装饰的函数
res = func(*args, **kwargs)
print("-----装饰器的扩展功能代码222")
return res
return wrapper2
return wrapper1
@decorator('musen') # work = decorator('musen')(work) decorator('musen')等于wrapper1
def work():
print('--------------work------------------')
缓存装饰器lru_cache:
对同一个函数相同的入参执行的结果进行缓存,通常用于提升递归函数的效率
例:用一个函数得,传一个int正整数,得到斐波那契数列的第几位数
输出:34