简-理解Python的装饰器、迭代器和生成器底层原理

本文介绍了Python中的装饰器、迭代器和生成器,装饰器用于扩展函数功能,迭代器用于遍历容器元素,生成器则提供简洁的迭代方式。它们各自利用了闭包、__iter__和__next__方法,以及yield关键字的特性。
摘要由CSDN通过智能技术生成

        装饰器、迭代器和生成器是 Python 中的高级功能,它们分别用于扩展函数或方法的功能、遍历容器元素和创建简洁的迭代器。

装饰器

        装饰器是一个用于修改或扩展函数或方法的功能的函数。装饰器接受一个函数作为参数,并返回一个新的函数,新函数通常会在原函数的基础上添加一些额外的功能。装饰器的常见用途包括日志记录、性能测试、权限检查等。

def demo_decorator(func):
    def hh(*args, **kwargs):
        print("Before function call")
        result = func(*args, **kwargs)
        print("After function call")
        return hh

    return wrapper

@demo_decorator
def a_function():
    print("Inside function")

a_function()

'''
结果:
Before function call
Inside function
After function call
'''

        底层:本质上是一个高阶函数,作为闭包,内部函数调外部函数引用,并返回内部函数。在调用被修饰的函数时,实际上是在调用装饰器返回的新函数。

        闭包是指一个函数即使离开作用域后,也能够记录并访问其定义的作用域中的局部变量。常用于创建具特定行为的函数,允许不用全局变量保留函数的状态。Python 中,闭包可通过定义嵌套函数并捕获外部作用域变量来实现。

迭代器

        迭代器是 Python 中用于遍历容器(如列表、元组、集合等)元素的对象。迭代器实现了 __iter__() 和 __next__() 方法,提供了一种统一的遍历容器元素的接口,使得你可以在 for 循环和其他迭代方法中使用它。

class DemoIterator:
    def __init__(self, data):
        self.data = data
        self.index = 0

    def __iter__(self):
        return self

    def __next__(self):
        if self.index < len(self.data):
            result = self.data[self.index]
            self.index += 1
            return result
        else:
            raise StopIteration

# 使用自定义的迭代器遍历列表
my_list = [1, 2, 3, 4, 5]
iterator = DemoIterator(my_list)

for item in iterator:
    print(item)

'''
1
2
3
4
5
'''

        底层:依赖于 __iter__() 和 __next__() 方法。当在 for 循环中使用迭代器时,Python 首先调用 __iter__() 方法获取迭代器对象,然后反复调用 __next__() 方法获取容器的下一个元素,直到遇到 StopIteration 异常,表示迭代已完成。

        大多数情况下,不需手动实现迭代器。只有创建自定义容器类型时,可能需实现迭代器接口。

        可迭代对象(Iterable)是 Python 中具一定遍历规则的对象,可以在 for 循环或其他迭代方法中使用。

  1. 可迭代对象实现了 __iter__() 方法。当 for 循环或其他迭代方法中使用可迭代对象时,Python 会自动调用该方法。__iter__() 方法返回一个迭代器对象,用于遍历容器的元素

  2. 迭代器对象实现了 __next__() 方法。每次迭代时,Python 会调用这个方法来获取容器的下一个元素。当没更多的元素可供迭代时,__next__() 方法应抛出一个 StopIteration 异常,通知 Python 结束迭代。

生成器

        生成器是一种特殊的迭代器,它允许使用更简洁的方式创建迭代器。生成器使用 yield 语句生成一系列的值,而不是显式地实现 __iter__() 和 __next__() 方法。当生成器函数被调用时,它会返回一个生成器对象,该对象可用于遍历生成的值。

def demo_generator(n):
    i = 0
    while i < n:
        yield i
        i += 1

for item in demo_generator(5):
    print(item)

'''
0 
1 
2 
3 
4
'''

        底层:依赖于 yield 语句和生成器函数。生成器函数被调用时,会返回一个生成器对象,实际上是一个迭代器,它会在每次迭代时自动保存函数的状态(包括局部变量、指令指针等),并在下一次迭代时从上次中断的地方继续执行。遇到 yield 语句时,生成器会暂停函数的执行,并将 yield 语句后的值作为迭代的当前值返回。当再次调用 next() 函数时,生成器会从上次暂停的地方恢复执行,直到遇到下一个 yield 语句或抛出 StopIteration 异常。

   yield 是 Python 中的一个关键字,用于实现生成器。在底层,yield 的实现依赖于 Python 的协程(coroutine)机制。当一个生成器函数包含 yield 语句时,它会被编译器识别为一个生成器,而不是普通的函数。生成器函数的执行不同于普通函数,它可以在执行过程中暂停和恢复,保持当前的状态。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值