Python3入门(六)迭代器和生成器

简介: python迭代器和生成器

本文介绍如何在python中使用迭代器和生成器

一、迭代器

迭代是Python最强大的功能之一,是访问集合元素的一种方式。迭代器是一个可以记住遍历的位置的对象。迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束。迭代器只能往前不会后退。迭代器有两个基本的方法:iter() 和 next()。字符串,列表或元组对象都可用于创建迭代器
示例:

list1 = ["a", "b", "c"]
# 创建迭代器对象
ll = iter(list1)
# 输出下一个元素
print(next(ll))
# 输出:a

1、创建一个迭代器

把一个类作为一个迭代器使用需要在类中实现两个方法 __iter__() 与 __next__() 。如果你已经了解的面向对象编程,就知道类都有一个构造函数,Python 的构造函数为 __init__(), 它会在对象初始化的时候执行,__iter__() 方法返回一个特殊的迭代器对象, 这个迭代器对象实现了 __next__() 方法并通过 StopIteration 异常标识迭代的完成。__next__() 方法(Python 2 里是 next())会返回下一个迭代器对象。

class MyClass:
    def __iter__(self):
        self.i = 1
        return self

    def __next__(self):
        n = self.i
        # 每次+1
        self.i += 1
        return n


testClass = MyClass()
testIter = iter(testClass)
print(next(testIter))
print(next(testIter))
print(next(testIter))

输出:

1
2
3

2、StopIteration

StopIteration 异常用于标识迭代的完成,防止出现无限循环的情况,在 __next__() 方法中我们可以设置在完成指定循环次数后触发 StopIteration 异常来结束迭代

class MyClass:
    def __iter__(self):
        self.i = 1
        return self

    def __next__(self):
        if self.i == 3:
            raise StopIteration
        n = self.i
        self.i += 1
        return n

testClass = MyClass()
testIter = iter(testClass)
print(next(testIter))
print(next(testIter))
print(next(testIter))

当迭代第三次的时候会抛出异常
stop

二、生成器

使用了 yield 的函数被称为生成器(generator)。跟普通函数不同的是,生成器是一个返回迭代器的函数,只能用于迭代操作,更简单点理解生成器就是一个迭代器。在调用生成器运行的过程中,每次遇到 yield 时函数会暂停并保存当前所有的运行信息,返回 yield 的值, 并在下一次执行 next() 方法时从当前位置继续运行。调用一个生成器函数,返回的是一个迭代器对象,每次调用next(),就计算出下一个元素的值,直到计算到最后一个元素,没有更多的元素时,抛出StopIteration的错误。当然,上面这种不断调用next()方法实在是太变态了,正确的方法是使用for循环

def testDef(num):
    a, b, c = 0, 0, 1
    while a < num:
        print(c)
        b, c = c, b + c
        a = a + 1

testDef(5)

输出:

1
1
2
3
5

好了本文到此结束了,如果有任何疑问或者错误,可以在下方评论留言,也希望得到大家的关注

目录
相关文章
|
3天前
|
Java UED Python
【10月更文挑战第4天】「Mac上学Python 4」入门篇4 - PyCharm高效开发环境配置与使用技巧
本篇将详细介绍如何高效地使用PyCharm进行Python开发,内容涵盖PyCharm的主题设置、字体调整、常用快捷键、虚拟环境的管理、库安装与调试技巧等。通过本篇的学习,用户将能够充分利用PyCharm的功能,提升Python开发效率。
98 2
【10月更文挑战第4天】「Mac上学Python 4」入门篇4 - PyCharm高效开发环境配置与使用技巧
|
3天前
|
机器学习/深度学习 Python
【10月更文挑战第5天】「Mac上学Python 6」入门篇6 - 安装与使用Anaconda
本篇将详细介绍如何在Mac系统上安装和配置Anaconda,如何创建虚拟环境,并学习如何使用 `pip` 和 `conda` 管理Python包,直到成功运行第一个Python程序。通过本篇,您将学会如何高效地使用Anaconda创建和管理虚拟环境,并使用Python开发。
39 4
【10月更文挑战第5天】「Mac上学Python 6」入门篇6 - 安装与使用Anaconda
|
3天前
|
机器学习/深度学习 数据可视化 数据挖掘
【10月更文挑战第4天】「Mac上学Python 5」入门篇5 - Jupyter 环境配置与高效使用技巧
本篇将介绍如何在Mac系统上安装和配置Jupyter,并详细介绍Jupyter Notebook的一些常用“神奇函数”。Jupyter是一个支持交互式计算的工具,广泛用于数据分析、机器学习等领域,通过学习本篇,用户将能够在Python项目中高效使用Jupyter Notebook。
49 3
【10月更文挑战第4天】「Mac上学Python 5」入门篇5 - Jupyter 环境配置与高效使用技巧
|
1天前
|
IDE 开发工具 Python
Python 编程入门:打造你的第一个程序
【10月更文挑战第6天】编程,这个听起来高大上又充满神秘感的领域,其实就像学习骑自行车一样。一开始你可能会觉得难以掌握平衡,但一旦你学会了,就能自由地穿梭在广阔的道路上。本文将带你走进 Python 的世界,用最简单的方式让你体验编写代码的乐趣。不需要复杂的理论,我们将通过一个简单的例子——制作一个猜数字游戏,来实践学习。准备好了吗?让我们开始吧!
|
2天前
|
机器学习/深度学习 人工智能 数据挖掘
机器学习基础:使用Python和Scikit-learn入门
【10月更文挑战第6天】在人工智能领域,机器学习已成为核心技术。本文指导初学者使用Python与Scikit-learn入门机器学习,涵盖基本概念、环境搭建、数据处理、模型训练及评估等环节。Python因简洁性及其生态系统成为首选语言,而Scikit-learn则提供了丰富工具,简化数据挖掘与分析流程。通过实践示例,帮助读者快速掌握基础知识,为进一步深入研究奠定坚实基础。
8 4
|
3天前
|
存储 人工智能 Java
Python编程入门:从基础到实战
【10月更文挑战第4天】本文旨在为初学者提供一个全面而深入的Python编程学习路径。我们将从Python的基本语法和概念开始,然后逐步深入到更复杂的主题,如数据结构、面向对象编程和异常处理等。最后,我们将通过一些实际的项目案例,帮助读者将理论知识应用到实践中去。无论你是编程新手,还是有一定经验的开发者,都可以在这篇文章中找到适合自己的学习内容。让我们一起开启Python编程的学习之旅吧!
|
3天前
|
存储 数据处理 Python
深入解析Python中的生成器:效率与性能的双重提升
生成器不仅是Python中的一个高级特性,它们是构建高效、内存友好型应用程序的基石。本文将深入探讨生成器的内部机制,揭示它们如何通过惰性计算和迭代器协议提高数据处理的效率。
|
3天前
|
数据可视化 Python
Python编程之数据可视化入门
【10月更文挑战第4天】在数字时代的洪流中,数据如同星辰般璀璨,而将它们绘制成图表,便是我们探索宇宙的方式。本文将带你启航,用Python这艘航船,驶向数据可视化的奥秘。我们将从安装必要的工具包开始,逐步深入到数据的呈现,最后通过代码示例点亮知识的灯塔,指引你在数据海洋中航行。让我们握紧舵盘,乘风破浪,揭开数据背后的故事吧!
|
3天前
|
数据采集 程序员 开发者
Python编程入门:从基础到实战
【10月更文挑战第5天】本文旨在为初学者提供一条清晰的Python学习路径,涵盖基础知识、关键概念、实战项目以及常见问题解答。我们将通过简单易懂的语言和实际代码示例,帮助读者快速掌握Python编程技能。无论你是零基础的新手还是有一定经验的开发者,都能在这篇文章中找到有价值的信息。让我们一起开启Python编程之旅吧!
|
1天前
|
Python
蓝桥杯练习题(一):Python组之入门训练题
这篇文章是关于蓝桥杯Python组的入门训练题,包括Fibonacci数列、圆的面积、序列求和和A+B问题的具体代码实现和样例输出。
16 0