在 Python 中,装饰器和迭代器是两个非常实用的高级特性,它们分别为代码的复用和高效数据处理提供了强大支持。下面从概念、用法和应用场景三个方面详细解释:
一、装饰器(Decorators)
1. 概念
装饰器是一种特殊的函数,它可以接受一个函数作为参数,并返回一个新的函数,用于增强原函数的功能。本质上,装饰器是一种语法糖,让代码更简洁优雅。
2. 核心原理
- 函数作为对象:在 Python 中,函数可以作为参数传递、赋值给变量或作为返回值。
- 闭包(Closure):装饰器通常利用闭包来保存原函数的状态。
3. 基本语法
python
运行
def decorator(func):
def wrapper(*args, **kwargs):
# 执行装饰前的操作
result = func(*args, **kwargs) # 调用原函数
# 执行装饰后的操作
return result
return wrapper
@decorator # 等价于:func = decorator(func)
def func():
pass
4. 示例:计时装饰器
python
运行
import time
def timer(func):
def wrapper(*args, **kwargs):
start_time = time.time()
result = func(*args, **kwargs)
end_time = time.time()
print(f"{func.__name__} 运行时间: {end_time - start_time} 秒")
return result
return wrapper
@timer
def calculate_sum(n):
return sum(range(n))
calculate_sum(1000000) # 输出运行时间
5. 带参数的装饰器
需要嵌套三层函数:
python
运行
def repeat(n):
def decorator(func):
def wrapper(*args, **kwargs):
for _ in range(n):
result = func(*args, **kwargs)
return result
return wrapper
return decorator
@repeat(3) # 执行3次
def say_hello():
print("Hello!")
6. 内置装饰器
@staticmethod
:静态方法,不依赖类或实例。@classmethod
:类方法,第一个参数是类本身。@property
:将方法转换为属性调用。
二、迭代器(Iterators)
1. 概念
迭代器是实现了迭代器协议的对象,即包含两个核心方法:
__iter__()
:返回迭代器自身。__next__()
:返回下一个元素,若没有元素则抛出StopIteration
异常。
2. 与可迭代对象的区别
- 可迭代对象(Iterable):实现了
__iter__()
方法的对象(如列表、元组、字典)。 - 迭代器(Iterator):同时实现
__iter__()
和__next__()
的对象。
3. 手动实现迭代器
python
运行
class Counter:
def __init__(self, max_num):
self.max_num = max_num
self.current = 0
def __iter__(self):
return self # 返回迭代器自身
def __next__(self):
if self.current < self.max_num:
value = self.current
self.current += 1
return value
else:
raise StopIteration # 终止迭代
# 使用迭代器
counter = Counter(3)
for num in counter:
print(num) # 输出 0, 1, 2
4. 生成器(Generator)
生成器是一种特殊的迭代器,使用 yield
关键字简化代码:
python
运行
def counter_generator(max_num):
current = 0
while current < max_num:
yield current # 暂停并返回当前值
current += 1
# 使用生成器
gen = counter_generator(3)
for num in gen:
print(num) # 输出 0, 1, 2
5. 内置迭代器函数
iter()
:将可迭代对象转换为迭代器。next()
:获取迭代器的下一个元素。range()
、enumerate()
、zip()
等返回的都是迭代器。
三、应用场景对比
装饰器 | 迭代器 |
---|---|
增强函数功能(日志、权限、缓存) | 高效处理大量数据(避免一次性加载) |
代码复用和横切关注点(AOP) | 自定义遍历逻辑 |
函数执行前 / 后插入额外逻辑 | 惰性计算(按需生成数据) |
四、总结
- 装饰器是函数的 "包装器",用于无侵入式地增强功能。
- 迭代器是数据的 "遍历器",用于高效处理大规模数据。
两者都是 Python 语言的精华,合理使用可以显著提升代码的可读性和性能。