Python的闭包和装饰器你真的了解吗
程序员文章站
2022-03-02 11:32:30
目录闭包装饰器总结闭包闭包就是能够读取其他函数内部变量的函数。def test1(k, b): def test1_1(x): print(k*x+b) return tes...
闭包
闭包就是能够读取其他函数内部变量的函数。
def test1(k, b): def test1_1(x): print(k*x+b) return test1_1 t1 = test1(1, 2) t1(0) t1(1) t1(2)
闭包中修改数据
x = 300 def test1(): x = 200 def test2(): nonlocal x print("----1----x = {}".format(x)) x = 100 print("----2----x = {}".format(x)) return test2 t1 = test1() t1()
装饰器
实现对无参数函数的装饰器
def set_func(func): def call_func(): print("装饰器执行") func() return call_func @set_func # 等价于sumnum = set_func(sumnum) def sumnum(): print("sumnum") sumnum()
实现对有参数函数的装饰器
# 对有参数、无返回值的函数进行装饰 def set_func(func): def call_func(num): print("装饰器") func(num) return call_func @set_func def sumnum(num): print("sumnum = {}".format(num)) sumnum(100)
对不定长参数的函数进行装饰
def set_func(func): def call_func(*args, **kwargs): print("装饰器") func(*args, **kwargs) # 拆包 return call_func @set_func def sumnum(num, *args, **kwargs): print("sumnum = {}".format(num)) print("args = {}".format(args)) print("kwargs = {}".format(kwargs)) sumnum(100, 200, c=100)
对有返回值的函数进行装饰
def set_func(func): def call_func(*args, **kwargs): print("装饰器") return func(*args, **kwargs) # 拆包 return call_func @set_func def sumnum(num, *args, **kwargs): print("sumnum = {}".format(num)) print("args = {}".format(args)) print("kwargs = {}".format(kwargs)) return "200 ok" sumnum(100, 200, c=100)
多个装饰器对同一个函数装饰
def add_h1(func): def h1(): h1_str = "<h1>" + func() + "</h1>" return h1_str return h1 def add_a(func): def call_func(): a_str = "<a>" + func() + "</a>" return a_str return call_func @add_h1 @add_a def get_str(): return "haha" get_str()
输出为:<h1><a>haha</a></h1>
总结
本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注的更多内容!
上一篇: 用python登录带弱图片验证码的网站