1.闭包案例
在函数嵌套的前提下,内部函数使用了外部函数的变量,并且外部函数返回了内部函数,我们把这个使用外部函数变量的内部函数称为闭包. 外层函数: config_name(),外层函数中的变量是 name 内层函数: inner(),inner()使用了外层函数的变量name. 内层函数闭包了name变量.延长了name的声明周期. 调用外层函数,返回了内层函数.此时.内层函数中有name变量.def config_name(name): age = 19 def inner(info): print(f"{name}:{info}") return inner if __name__ == '__main__': # 调用外层函数,返回了内层函数,此时fun1 就是 内层函数inner() fun1 = config_name("小明") fun1('你好') fun1('交个朋友吧') fun2 = config_name('小红') fun2('不想和你玩') # 闭包可以让变量更安全 # g_name = '小明' # 此时其它模块也可以访问和修改. def outer(): g_name = '小明' #被闭包的g_name 其它模块无法直接访问. def say_info(info): print(f"{g_name}:{info}") return say_info if __name__ == '__main__': aaa = outer() aaa('你好')
2.装饰器案例
@classmethod 装饰类方法.
@staticmethod 装饰静态方法.
""" 需求: 有一个函数 sleep(),在函数执行前打印 '准备睡觉.',在函数执行后打印'休息完毕-元气满满' """#装饰器实际就是闭包 def outer(fun): def inner(): print('准备睡觉') fun() print('休息完毕-元气满满') return inner #1.被装饰的函数会当做参数传递给装饰器. outer(sleep) #2.被装饰的函数最终会被装饰器的返回值替换.sleep() = inner() #3.以后调用sleep函数 其实执行的是inner()函数. @outer def sleep(): print("休息6小时就够了") if __name__ == '__main__': #方案1 --不够优雅 # print('准备睡觉') # sleep() # print('休息完毕-元气满满') #方案2: 使用闭包来完成 # inner = outer(sleep) # inner() # 方案3: 使用装饰器来完成 sleep()
3.通用装饰器[了解]
#需求: 在计算求和函数之前输出一句话.'正在努力计算中....'# 装饰器名称简明之意: logging -- 打印日志的意思 def logging(func): #内层函数即使用来替换被装饰的函数用的. def inner(*args): print('正在努力计算中....') result = func(*a