闭包函数
闭包,又称闭包函数或者闭合函数,其实和前面讲的嵌套函数类似,不同之处在于,闭包中外部函数返回的不是一个具体的值,而是一个函数。一般情况下,返回的函数会赋值给一个变量,这个变量可以在后面被继续执行调用。
| |
| 1.闭:定义在函数内部的函数 |
| 2.包:内部函数使用了外层函数名称空间中的名字 |
| |
| def outer(): |
| x = 999 |
| def inner(): |
| print('from outer>>>inner',x) |
| return inner |
| x = 666 |
| res = outer() |
| res() |
闭包函数的实际应用
| '''闭包函数是给函数体传参的另外一种方式''' |
| |
| |
| def info(username) |
| print(usernam) |
| |
| info('张三') |
| |
| |
| def outer(username): |
| |
| def index(): |
| print(username) |
| return index |
| res = outer('kevin') |
| res() |
| res1 = outer('jason') |
| res1() |
装饰器简介
装饰器是 Python 的一个重要基础部分。简单地说:他们是修改或实现其他函数的功能的函数(工具)。他们有助于让我们的代码更简短,也更能体现程序员的基础是否牢固(写的好的就是“装杯”)。大多数初学者不知道在哪儿使用它们,所以我将要分享下,哪些区域里装饰器可以让你的代码更简洁。
| """ |
| 装饰器并不是一个新的知识点 而是由前两天所有的函数知识点整合到一起的产物 |
| 名称空间 函数名 闭包函数... |
| """ |
| 装饰器的本质 |
| 在不改变被装饰对象原有的'调用方式'和'内部代码' |
| 的情况下给被装饰对象添加新的功能 |
| |
| 装饰器的原则 |
| 对扩展开放 |
| 对修改封闭 |
| |
| |
| import time |
| |
| '''上述的数字是时间戳:1970年1月1日0时0分0秒距离刚刚代码运行间隔的秒数''' |
| |
| import time |
| def outer(func_name): |
| def get_time(*args, **kwargs): |
| start_time = time.time() |
| res = func_name(*args, **kwargs) |
| end_time = time.time() |
| print(end_time - start_time) |
| |
| return res |
| return get_time |
简易版装饰器
| |
| def fly(): |
| time.sleep(2) |
| print('两秒真男人!!') |
| |
| import time |
| def outer(func_name): |
| def get_time(*args, **kwargs): |
| start_time = time.time() |
| func_name(*args, **kwargs) |
| end_time = time.time() |
| print(end_time - start_time) |
| return get_time |
| |
| fly = outer(fly) |
| fly() |

完整版装饰器
| |
| def fly(): |
| time.sleep(2) |
| print('两秒真男人!!') |
| return '哈哈哈 伟啦' |
| |
| import time |
| def outer(func_name): |
| def get_time(*args, **kwargs): |
| start_time = time.time() |
| res = func_name(*args, **kwargs) |
| end_time = time.time() |
| print(end_time - start_time) |
| |
| return res |
| return get_time |
| |
| |
| fly = outer(fly) |
| res = fly() |
| print(res) |
| |

装饰器模板
对于装饰器不太理解的其实不用太过于担心,只要记住下面的这个模板直接使用就行了
| '''编写装饰器其实有一套固定的代码 不需要做任何理解''' |
| def outer(func_name): |
| def inner(*args, **kwargs): |
| print('执行被装饰函数之前 可以做的额外操作') |
| res = func_name(*args, **kwargs) |
| print('执行被装饰函数之后 可以做的额外操作') |
| return res |
| return inner |

装饰器语法糖
| '''可以使代码更整洁''' |
| 语法糖的用法就比较简单了,只要把编写好的装饰器 |
| 在函数前或某些代码前一行写 @ + 装饰器名(装饰器的外层函数的函数名) |
| import time |
| def outer(func_name): |
| def get_time(*args, **kwargs): |
| start_time = time.time() |
| res = func_name(*args, **kwargs) |
| end_time = time.time() |
| print(end_time - start_time) |
| |
| return res |
| return get_time |
| |
| |
| @outer |
| def play(): |
| time.sleep(1) |
| print('玩个寄吧游戏') |
| return '你给我叫爸爸!' |
| res = play() |
| print(res) |
装饰器修复技术
函数的装饰器修复技术,可以使被装饰的函数在增加了新的功能的前提下,不改变原来函数的函数名,还继续使用原函数的注释内容。让人很难发现是被装饰器修改过函数名。
| |
| ''' |
| 装饰器修复技术关键在于 from functools import wraps |
| 和 @wraps() 的连用 |
| ''' |
| |
| import time |
| |
| from functools import wraps |
| def outer(func_name): |
| @wraps(func_name) |
| def get_time(*args, **kwargs): |
| start_time = time.time() |
| res = func_name(*args, **kwargs) |
| end_time = time.time() |
| print(end_time - start_time) |
| |
| return res |
| return get_time |
| |
| @outer |
| def play(): |
| '''玩游戏不?''' |
| time.sleep(1) |
| print('玩个寄吧游戏') |
| return '你给我叫爸爸!' |
| |
| help(play) |
| |

【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· winform 绘制太阳,地球,月球 运作规律
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人