Python 闭包 & 装饰器
发布人:shili8
发布时间:2025-01-30 04:17
阅读次数:0
**Python闭包与装饰器**
在 Python 中,闭包(Closure)和装饰器(Decorator)是两个非常重要的概念,它们可以帮助我们编写更高效、更易维护的代码。
###1.闭包闭包是一种特殊的函数,它可以访问外部作用域中的变量,并在内部作用域中使用这些变量。闭包通常用于实现回调函数或高阶函数。
**示例:**
def outer(x): def inner(y): return x + y return innerf = outer(5) print(f(3)) # 输出:8
在这个例子中,`outer` 函数返回了一个闭包 `inner`。`inner` 函数可以访问外部作用域中的变量 `x`,并使用它来计算结果。
###2. 装饰器装饰器是一种特殊的函数,它可以修改或扩展另一个函数的行为。装饰器通常用于实现日志记录、缓存、认证等功能。
**示例:**
def decorator(func): def wrapper(*args, **kwargs): print("Before calling the function") result = func(*args, **kwargs) print("After calling the function") return result return wrapper@decoratordef add(a, b): return a + bprint(add(3,4)) # 输出: Before calling the function, After calling the function,7
在这个例子中,`decorator` 函数返回了一个装饰器 `wrapper`。`wrapper` 函数可以修改或扩展 `add` 函数的行为。
###3. 装饰器的应用装饰器有很多应用场景,例如:
* **日志记录**:使用装饰器来记录函数的执行时间、参数和返回值。
* **缓存**:使用装饰器来缓存函数的结果,以减少重复计算。
* **认证**:使用装饰器来检查函数的调用者是否具有合法权限。
###4. 使用装饰器实现日志记录
import loggingfrom functools import wrapslogging.basicConfig(level=logging.INFO) def log(func): @wraps(func) def wrapper(*args, **kwargs): try: result = func(*args, **kwargs) logging.info(f"Function {func.__name__} executed successfully") return result except Exception as e: logging.error(f"Error occurred in function {func.__name__}: {str(e)}") return wrapper@logdef add(a, b): return a + bprint(add(3,4))
在这个例子中,`log` 函数是一个装饰器,它可以记录函数的执行结果和错误信息。
###5. 使用装饰器实现缓存
from functools import wrapsdef cache(func): cache_dict = {} @wraps(func) def wrapper(*args, **kwargs): key = str(args) + str(kwargs) if key in cache_dict: return cache_dict[key] else: result = func(*args, **kwargs) cache_dict[key] = result return result return wrapper@cachedef fibonacci(n): if n <=1: return n else: return fibonacci(n-1) + fibonacci(n-2) print(fibonacci(10))
在这个例子中,`cache` 函数是一个装饰器,它可以缓存函数的结果,以减少重复计算。
###6. 使用装饰器实现认证
from functools import wrapsdef authenticate(func): @wraps(func) def wrapper(*args, **kwargs): if kwargs.get("username") == "admin" and kwargs.get("password") == "123456": return func(*args, **kwargs) else: raise Exception("Authentication failed") return wrapper@authenticatedef get_data(username, password): return {"data": "Hello, world!"} try: print(get_data(username="admin", password="123456")) except Exception as e: print(str(e))
在这个例子中,`authenticate` 函数是一个装饰器,它可以检查函数的调用者是否具有合法权限。
###7. 总结闭包和装饰器是 Python 中非常重要的概念,它们可以帮助我们编写更高效、更易维护的代码。通过使用闭包和装饰器,我们可以实现回调函数、缓存、认证等功能,提高代码的可读性和可维护性。
###8. 参考* [Python闭包]( />* [Python 装饰器]( />* [Python functools.wraps()](