Python实用的高级特性——装饰器和迭代器

在 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 语言的精华,合理使用可以显著提升代码的可读性和性能。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值