Python闭包和装饰器详解
1. 闭包(Closure)
闭包是Python中一个重要的概念,涉及嵌套函数和变量的作用域。
概念:
- 内外函数嵌套:闭包的形成通常涉及到一个外部函数和一个内部函数。
- 内函数引用外函数作用域下的非全局变量:内部函数可以访问外部函数作用域内的变量,即使外部函数已经执行完毕。
-
外函数返回内函数对象:外部函数返回内部函数的引用,使得内部函数可以访问并操作外部函数作用域内的变量。
定义: - 第一种方式:返回内函数引用。例如:
def outer(): a = 10 def inner(): print(a) return inner outer()() # 输出10
- 第二种方式:返回内函数调用。例如:
def outer1(a): def inner(): print(a) return inner() outer1(20) # 输出20
2. 装饰器(Decorator)
装饰器是Python中另一个强大的功能,它可以在不修改原函数的基础上增加新功能。
概念:
- 装饰器可以在不改变原函数的基础上给函数增加新的功能,利用了闭包的思路。
使用: - 装饰器的使用方法是在原函数上方使用
@装饰器名字
。
简单装饰器: - 例如,以下是一个简单装饰器,用于在函数执行前打印一条消息:
def outer(f): def inner(): print("请进行自我介绍") f() return inner @outer def func(): print("我是函数func") func() # 先打印"请进行自我介绍",然后打印"我是函数func"
装饰器的实现:
- 装饰器分为无参装饰器和有参装饰器两种,都是通过函数嵌套和闭包实现的。
- 例如,以下是一个计算函数执行时间的装饰器:
import time def timer(func): def wrapper(*args, **kw): start_time = time.time() func(*args, **kw) stop_time = time.time() cost_time = stop_time - start_time print("花费时间:{}秒".format(cost_time)) return wrapper @timer def test(): time.sleep(3) test() # 输出函数执行花费的时间