随笔- 310  文章- 1  评论- 0  阅读- 86009 

1.闭包

闭包:如果在一个内部函数里,对在外部作用域(但不是在全局作用域)的变量进行引用,那么内部函数就被认为是闭包(closure)。

在Python中创建一个闭包可以归结为以下三点:

  • 闭包函数必须有内嵌函数
  • 内嵌函数需要引用该嵌套函数上一级namespace中的变量
  • 闭包函数必须返回内嵌函数
1 def fun(x):
2     def add(y):
3         return x+y
4     return add
5 d=  fun(2)
6 print(d(1)) # 3
7 print(d(3)) # 5

2.装饰器

  • 装饰器本身是一个函数,用于装饰其它函数,增强被装饰函数的功能,装饰器一般接受一个函数对象作为参数,已对其进行增强。
  • 装饰器是一个很著名的设计模式,经常被用于有切面需求的场景,较为经典的有插入日志、性能测试、事务处理等。装饰器是解决这类问题的绝佳设计,有了装饰器,我们就可以抽离出大量函数中与函数功能本身无关的雷同代码并继续重用。概括的讲,装饰器的作用就是为已经存在的对象添加额外的功能。
复制代码
import time  
def timeit(func):  
    # 定义一个计时器,传入一个,并返回另一个附加了计时功能的方法 
    def wrapper(): 
        # 定义一个内嵌的包装函数,给传入的函数加上计时功能的包装
        start = time.clock()  
        func()  
        end =time.clock()  
        print("time %.4f"%(end-start))

    # 将包装后的函数返回  
    return wrapper  
 
@timeit  
def fun(): 
    for i in range(10000):pass
    print("this test fun!")   

fun()
# --------------------------------------------------
# this test fun!
# time 0.0009
复制代码

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#我们可以使用 Python 内置模块functools中的wraps工具,实现“在使用装饰器扩展函数功#能的同时,保留原函数属性”这一目的。这里functools.wraps本身也是一个装饰器。运行效果如下
 
>>> import functools
>>> # 定义保留原函数属性的装饰器
... def IAmDecorator(fun):
...     @functools.wraps(fun)
...     def wrapper(*args, **kw):
...         print("我真的是一个装饰器")
...         return fun(*args, **kw)
...     return wrapper
...
>>> @IAmDecorator
... def func():
...     print("我是原函数")
...
>>> func.__name__
'func'

  

 posted on   boye169  阅读(139)  评论(0编辑  收藏  举报
编辑推荐:
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
· 如何调用 DeepSeek 的自然语言处理 API 接口并集成到在线客服系统
点击右上角即可分享
微信分享提示