【Python快速上手(十一)】

目录

Python快速上手(十一)

Python3 迭代器与生成器

迭代器(Iterator)和生成器(Generator)是 Python 中用于处理可迭代对象的重要概念,它们可以帮助你高效地处理大量数据或无限序列。

迭代器(Iterator)

迭代器是一个对象,它实现了迭代器协议(Iterator Protocol),即实现了 iter () 和 next() 方法。迭代器可以逐个返回元素,直到没有元素可返回为止。迭代是 Python 最强大的功能之一,是访问集合元素的一种方式。迭代器是一个可以记住遍历的位置的对象。迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束。迭代器只能往前不会后退。

** 创建和使用迭代器**

把一个类作为一个迭代器使用需要在类中实现两个方法__iter__() __next__() 。__iter__() 方法返回一个特殊的迭代器对象, 这个迭代器对象实现了__next__() 方法并通过StopIteration异常标识迭代的完成。__next__() 方法(Python 2 里是next())会返回下一个迭代器对象。StopIteration 异常用于标识迭代的完成,防止出现无限循环的情况,在 __next__() 方法中我们可以设置在完成指定循环次数后触发StopIteration 异常来结束迭代。

python 复制代码
# 创建一个迭代器
class MyIterator:
    def __init__(self, data):
        self.data = data
        self.index = 0

    def __iter__(self):
        return self

    def __next__(self):
        if self.index >= len(self.data):
            raise StopIteration
        value = self.data[self.index]
        self.index += 1
        return value

# 使用迭代器
my_iterator = MyIterator([1, 2, 3, 4, 5])
for item in my_iterator:
    print(item)

生成器(Generator)

生成器是一种特殊的迭代器,它使用函数来生成值,并且只在需要时才生成值,节省了内存空间。生成器使用 yield 关键字来暂停函数执行并返回值,然后在下一次调用时从上一次暂停的位置继续执行。yield 是一个关键字,用于定义生成器函数,生成器函数是一种特殊的函数,可以在迭代过程中逐步产生值,而不是一次性返回所有结果。跟普通函数不同的是,生成器是一个返回迭代器的函数,只能用于迭代操作,更简单点理解生成器就是一个迭代器。当在生成器函数中使用 yield 语句时,函数的执行将会暂停,并将 yield 后面的表达式作为当前迭代的值返回。然后,每次调用生成器的 next() 方法或使用 for 循环进行迭代时,函数会从上次暂停的地方继续执行,直到再次遇到 yield 语句。这样,生成器函数可以逐步产生值,而不需要一次性计算并返回所有结果。调用一个生成器函数,返回的是一个迭代器对象。

python 复制代码
# 创建一个生成器
def my_generator(data):
    for item in data:
        yield item

# 使用生成器
gen = my_generator([1, 2, 3, 4, 5])
for item in gen:
    print(item)

区别

  1. 实现方式:
  • 迭代器可以通过定义一个类来实现,需要手动编写 iter () 和 next() 方法。
  • 生成器可以通过定义一个函数来实现,使用 yield 关键字来暂停函数执行并返回值。
  1. 内存占用:
  • 迭代器需要一次性生成所有的元素并保存在内存中。
  • 生成器只在需要时生成元素,节省了内存空间。
  1. 语法简洁性:
  • 生成器通常比迭代器更简洁易读,因为它们使用函数的形式定义,避免了显式编写 iter () 和 next() 方法。

注意事项

  • 当处理大量数据或需要节省内存空间时,推荐使用生成器来处理数据。
  • 生成器在处理无限序列时特别有用,因为它们只在需要时生成值。
相关推荐
Juchecar14 小时前
解惑:NumPy 中 ndarray.ndim 到底是什么?
python
用户83562907805114 小时前
Python 删除 Excel 工作表中的空白行列
后端·python
Json_14 小时前
使用python-fastApi框架开发一个学校宿舍管理系统-前后端分离项目
后端·python·fastapi
数据智能老司机21 小时前
精通 Python 设计模式——分布式系统模式
python·设计模式·架构
数据智能老司机1 天前
精通 Python 设计模式——并发与异步模式
python·设计模式·编程语言
数据智能老司机1 天前
精通 Python 设计模式——测试模式
python·设计模式·架构
数据智能老司机1 天前
精通 Python 设计模式——性能模式
python·设计模式·架构
c8i1 天前
drf初步梳理
python·django
每日AI新事件1 天前
python的异步函数
python
这里有鱼汤1 天前
miniQMT下载历史行情数据太慢怎么办?一招提速10倍!
前端·python