生成器

# 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

装饰器

装饰器基于闭包实现,用于增强函数行为而不修改原函数代码。

  1. 基本结构
    • 接收函数,返回增强后的新函数(常结合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
    
  2. 类型扩展
    • 带参装饰器:嵌套三层(参数→装饰器→包装函数)
      def repeat(n):
          def decorator(func):
              def wrapper():
                  for _ in range(n):
                      func()
              return wrapper
          return decorator
      
    • 类装饰器:通过__call__方法实现
  3. 典型场景
    • 日志/性能监控:记录函数执行时间和参数
    • 权限校验:在敏感操作前检查用户权限
    • 结果缓存:存储函数返回值避免重复计算