• Python中的迭代器、生成器和装饰器


    当谈到Python中的迭代器、生成器和装饰器时,这三个概念都是与函数和数据处理密切相关的。让我们逐个深入了解它们。

    1. 迭代器(Iterators):

    迭代器是一个可以逐个访问元素的对象。在Python中,迭代器实现了两个方法:__iter__()__next__()。一个对象如果实现了这两个方法,就可以被称为迭代器。

    这两个方法一起定义了一个对象的迭代行为。当使用 for...in 循环时,实际上是在每次迭代中调用迭代器的 __next__ 方法,直到 StopIteration 被抛出,表示迭代结束。
     对于可迭代对象,它们只需要实现 __iter__ 方法,而迭代器则需要同时实现 __iter____next__ 方法。在实际编程中,很多情况下我们会使用生成器(通过 yield 关键字)来简化迭代器的实现。

    1. class MyIterator:
    2. def __init__(self):
    3. self.current = 0
    4. def __iter__(self):
    5. return self
    6. def __next__(self):
    7. if self.current < 5:
    8. result = self.current
    9. self.current += 1
    10. return result
    11. else:
    12. self.current = 0 # 重置迭代器状态
    13. raise StopIteration
    14. # 创建 MyIterator 的实例
    15. my_iterator = MyIterator()
    16. # 使用 next() 函数手动获取下一个值
    17. print(next(my_iterator)) # 输出: 0
    18. print(next(my_iterator)) # 输出: 1
    19. # 重新创建 MyIterator 的实例,以便重新开始迭代
    20. my_iterator = MyIterator()
    21. # 在 for 循环中自动迭代
    22. for item in my_iterator:
    23. print(item)

    2. 生成器(Generators):

    生成器是一种更简单、更便捷创建迭代器的方式。它使用 yield 关键字,每次调用 yield 时,函数会暂停执行并返回结果,下次调用时会从上次暂停的地方继续执行。

    生成器的优势在于它们在需要时生成值,而不是一次性生成整个序列。这对于处理大量数据或者在有限内存条件下工作非常有用。 

    1. def my_generator():
    2. for i in range(5):
    3. yield i
    4. gen = my_generator()
    5. for item in gen:
    6. print(item)

    3. 装饰器(Decorators):

    装饰器是一种用于修改函数行为的工具。它们允许你在不修改原始函数代码的情况下,增加、修改或者包装函数的功能。装饰器允许你在函数执行前后添加额外的逻辑。

    1. def my_decorator(func):
    2. def wrapper():
    3. print("Something is happening before the function is called.")
    4. func()
    5. print("Something is happening after the function is called.")
    6. return wrapper
    7. @my_decorator
    8. def say_hello():
    9. print("Hello!")
    10. say_hello()

    4.组合:迭代器、生成器和装饰器:

    这三个概念可以很好地结合使用。例如,你可以使用生成器来创建一个简单的迭代器,同时可以使用装饰器来增强生成器的功能。

     这个例子中,square_numbers 是一个生成器,产生前 n 个数字的平方。print_square_numbers 函数使用 @my_decorator 装饰器,以在输出前后添加额外的逻辑。

    1. def square_numbers(n):
    2. for i in range(n):
    3. yield i**2
    4. @my_decorator
    5. def print_square_numbers(n):
    6. for num in square_numbers(n):
    7. print(num)
    8. print_square_numbers(5)

    ----------------------------

    • iter() 函数的基本用法可以总结如下:

    iterable = iter(iterable_object)

    其中,iterable_object 是一个可迭代对象,iter() 函数返回该对象的迭代器。迭代器是一个实现了 __iter__()__next__() 方法的对象,通过调用 __next__() 方法,可以逐个访问可迭代对象的元素。

    具体步骤如下:

    1. 创建可迭代对象。
    2. 使用 iter() 函数获取该对象的迭代器。
    3. 使用 next() 函数或 for 循环逐个访问可迭代对象的元素。

    下面是一个简单的例子:

    1. # 创建一个列表作为可迭代对象
    2. my_list = [1, 2, 3, 4, 5]
    3. # 使用 iter() 函数获取迭代器
    4. my_iterator = iter(my_list)
    5. # 使用 next() 函数手动获取下一个值
    6. print(next(my_iterator)) # 输出: 1
    7. print(next(my_iterator)) # 输出: 2
    8. # 在 for 循环中自动迭代剩余的值
    9. for item in my_iterator:
    10. print(item)

     

    可迭代对象(Iterable):

    1. 定义: 可迭代对象是具有 __iter__() 方法的对象,或者实现了 __getitem__() 方法的对象(例如,序列类型如列表、元组、字符串等)。

    2. 特点: 可迭代对象可以通过迭代协议(实现 __iter__() 方法)提供一个迭代器。它表示一个数据集合,可以使用 for 循环或 iter() 函数获取一个迭代器。

  • 相关阅读:
    QT之QString的用法介绍
    git 上传文件到gitlab
    linux上搭建sftp服务器
    面试官:集合使用时应该注意哪些问题?我:应该注意该注意的问题!
    《算法导论》第14章-数据结构的扩张 14.1-动态顺序统计 14.2-如何扩张数据结构
    壁挂式新风机市场现状及未来发展趋势分析
    PROFINET 建立连接的原理
    Maven高级
    为什么在listview上只显示一行,不论list有几个数据,都只显示第一行的
    Mybatis日期检索格式报错
  • 原文地址:https://blog.csdn.net/book_dw5189/article/details/134498239