生成器
# Generators help you make lazy code.
def double_numbers(iterable):
for i in iterable:
yield i + i
for i in double_numbers(range(1, 900000000)): # `range` is a generator.
print(i)
if i >= 30:
break
yield是生成器的关键特性,它允许函数在每次调用时返回一个值,而不是一次性返回所有值。每次调用生成器时,它会从上次 yield 的地方继续执行,而不是从头开始。range()本身也是一个生成器
生成器表达式
values = (-x for x in [1,2,3,4,5])
for x in values:
print(x) # prints -1 -2 -3 -4 -5 to console/terminal
装饰器
装饰器基于闭包实现,用于增强函数行为而不修改原函数代码。
- 基本结构
- 接收函数,返回增强后的新函数(常结合
functools.wraps保留元数据)
from functools import wraps def log_decorator(func): @wraps(func) def wrapper(*args, **kwargs): print(f"调用 {func.__name__}") return func(*args, **kwargs) return wrapper - 接收函数,返回增强后的新函数(常结合
- 类型扩展
- 带参装饰器:嵌套三层(参数→装饰器→包装函数)
def repeat(n): def decorator(func): def wrapper(): for _ in range(n): func() return wrapper return decorator - 类装饰器:通过
__call__方法实现
- 带参装饰器:嵌套三层(参数→装饰器→包装函数)
- 典型场景
- 日志/性能监控:记录函数执行时间和参数
- 权限校验:在敏感操作前检查用户权限
- 结果缓存:存储函数返回值避免重复计算