3分钟带你了解Python中的生成器和迭代器,离成为大佬又近了一步

3分钟带你玩转Python,用不了多久你也可以成为大佬

生成器(Generators)和迭代器(Iterators)是 Python 中用于处理序列数据的强大工具。它们可以帮助您以更高效和内存友好的方式处理大型数据集,同时提供了更方便的方式来访问和处理数据。它们都可以用于逐个处理序列中的元素,但它们在实现和工作方式上有所不同。

迭代器(Iterators):

迭代器是一个实现了迭代协议的对象,它可以在循环中逐个返回值,而不必将所有值一次性加载到内存中。迭代器具有两个主要方法:

1.__iter__() 方法:返回迭代器对象本身。

2.__next__() 方法:返回序列中的下一个元素。如果没有元素可以返回,会引发 StopIteration 异常。

迭代器通常用于处理大型数据集,使得只有在需要的时候才会从数据源加载数据。

举个🌰说明一下:

Python迭代器示例 复制代码
class MyIterator:
    def __init__(self, max_value):
        self.max_value = max_value
        self.current = 0

    def __iter__(self):
        return self

    def __next__(self):
        if self.current < self.max_value:
            value = self.current
            self.current += 1
            return value
        else:
            raise StopIteration

my_iterator = MyIterator(6)
for num in my_iterator:
    print(num)

运行结果如下:

生成器(Generators):

生成器是一种特殊的迭代器,它使用函数来产生序列中的元素。生成器函数使用 yield 关键字来暂停函数执行并产生一个值,然后在需要下一个值时再次恢复执行。这允许您按需生成值,而不必一次性将所有值加载到内存中。生成器在处理大型数据集时非常高效。

举个🌰说明一下:

Python生成器示例 复制代码
def my_generator(max_value):
    current = 0
    while current < max_value:
        yield current
        current += 1

gen = my_generator(6)
for num in gen:
    print(num)

代码说明:

在上面的生成器示例中,my_generator 函数使用了 yield 关键字来暂停函数的执行并生成值。每次循环迭代时,函数会从上次 yield 暂停的位置恢复执行,并继续执行直到下一个 yield

运行结果如下:

总结

生成器和迭代器是 Python 中处理序列数据的重要工具,它们在处理大数据集时可以提供显著的性能和内存优势。通过使用生成器和迭代器,您可以更加高效地处理数据,减少内存使用,并提高代码的可读性。

学习与反思

为什么我们要用迭代器和生成器,代码写了那么多不就是一个for循环的事情吗?

迭代器和生成器在处理序列数据时有许多优点,使得它比普通的 for 循环更加灵活和高效。以下是一些迭代器的优点以及与普通 for 循环的比较:

优点:

1.节省内存:迭代器一次只返回一个元素,而不会一次性将整个序列加载到内存中。这对于大型数据集非常有用,可以有效地减少内存占用。

2.懒惰求值(Lazy Evaluation) :生成器迭代器使用惰性求值,只在需要时生成值。这意味着您可以在不需要全部数据的情况下开始迭代,从而提高性能和效率。

3.支持无限序列:生成器可以用于表示无限序列,因为它们按需生成值,而不需要在内存中存储整个序列。

4.可复用性和模块化:通过封装生成器逻辑,您可以创建可重用的、模块化的生成器函数,以便在不同的上下文中使用。

缺点:

1.速度相对较慢 :与直接使用列表的 for 循环相比,迭代器可能会稍微慢一些,因为它们需要在每次迭代时执行一些附加操作。

2.不适合索引访问:由于迭代器是按需生成值的,所以无法通过索引访问特定位置的元素,需要从头开始迭代。

3.无法修改序列:迭代器一般是只读的,不能用于修改序列中的元素。

适用场景:

1.当您需要处理大型数据集时,迭代器可以节省大量内存,并提高性能。

2.当您需要按需生成值,或者处理无限序列时,生成器是一个非常好的选择。

3.当您需要创建可复用的、模块化的代码时,生成器函数能够提供更好的组织和抽象。

我该怎么选:

使用迭代器的主要优点是节省内存、支持惰性求值和无限序列,同时也提高了代码的可复用性和模块化。然而,对于需要快速索引和修改的情况,使用普通的 for 循环可能更为方便。在选择使用迭代器还是普通循环时,您应该根据具体的情况和需求进行权衡。

相关推荐
B站计算机毕业设计超人9 分钟前
计算机毕业设计hadoop+spark+hive民宿推荐系统 酒店推荐系统 民宿价格预测 酒店价格 预测 机器学习 深度学习 Python爬虫 HDFS集群
大数据·python·机器学习·spark·课程设计·数据可视化·推荐算法
计算机徐师兄21 分钟前
Python基于Django的web漏洞挖掘扫描技术的实现与研究(附源码,文档说明)
python·django·漏洞扫描·web漏洞挖掘扫描·python django·python漏洞挖掘扫描技术
m0_7482466122 分钟前
【论文投稿】Python 网络爬虫:探秘网页数据抓取的奇妙世界
开发语言·爬虫·python
minstbe26 分钟前
AI开发 - 算法基础 递归 的概念和入门(二)汉诺塔问题 递归的应用和使用注意 - Python
开发语言·python·算法
web1478621072341 分钟前
Python毕业设计选题:基于django+vue的疫情数据可视化分析系统
python·信息可视化·课程设计
GraduationDesign1 小时前
基于SpringBoot的在线文档管理系统的设计与实现
java·spring boot·后端
岁月如歌,青春不败1 小时前
HMSC联合物种分布模型
开发语言·人工智能·python·深度学习·r语言
susu10830189111 小时前
python中Windows系统使用 pywin32 来复制图像到剪贴板,并使用 Selenium 模拟 Ctrl+V 操作
python·selenium
Pocker_Spades_A1 小时前
阿里云-通义灵码:在 PyCharm 中的强大助力(下)
ide·python·阿里云·pycharm
chengxuyuan1213_1 小时前
Python有哪些常用的库
开发语言·python