Python学习【23】:迭代器与生成器

一、学前花絮

这几天又是忙碌中度过,家人生病,忙着去医院挂号、缴费、取药。中间还要去检测各种指标。看着医院那么多人在看病,真心觉得人这一生属实不易。

又想到杨振宁老先生,百岁高龄,而且一直头脑清楚,又一直有人陪伴。真的是幸福人生!

我们普通人,能活到七八十岁就很不错了。关键是,即便活到了八十岁以上,还能身体健康、头脑清晰吗?

珍惜健康的时候吧,在我们有能力有条件学习的时候,加强学习。让自己人生过得更充实吧。

二、python3的迭代器与生成器

2.1 迭代器

迭代是 Python 最强劲的功能之一,是访问集合元素的一种方式。

迭代器是一个可以记住遍历的位置的对象。

迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束。迭代器只能往前不会后退。

迭代器有两个基本的方法:iter() 和 next()。

字符串,列表或元组对象都可用于创建迭代器:

Python学习【23】:迭代器与生成器

输出结果:

Python学习【23】:迭代器与生成器

迭代器对象可以使用常规for语句进行遍历:

Python学习【23】:迭代器与生成器

执行以上程序,输出结果如下:

Python学习【23】:迭代器与生成器

也可以使用 next() 函数:

Python学习【23】:迭代器与生成器

输出结果:

Python学习【23】:迭代器与生成器

2.1.1 创建一个迭代器

把一个类作为一个迭代器使用需要在类中实现两个方法 __iter__() 与 __next__() 。

如果你已经了解的面向对象编程,就知道类都有一个构造函数,Python 的构造函数为 __init__(), 它会在对象初始化的时候执行。

__iter__() 方法返回一个特殊的迭代器对象, 这个迭代器对象实现了 __next__() 方法并通过 StopIteration 异常标识迭代的完成。

__next__() 方法(Python 2 里是 next())会返回下一个迭代器对象。

创建一个返回数字的迭代器,初始值为 1,逐步递增 1:

Python学习【23】:迭代器与生成器

输出结果:

Python学习【23】:迭代器与生成器

2.1.2 停止迭代器:StopIteration

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

在 20 次迭代后停止执行:

Python学习【23】:迭代器与生成器

不知道大家是否注意到print函数里面的参数end,如果不用这个参数缺省是输出一个之后自动回车换行,而上述写法让输出在一行,节省空间。

输出结果:

Python学习【23】:迭代器与生成器

2.2生成器

在 Python 中,使用了 yield 的函数被称为生成器(generator)。

yield 是一个关键字,用于定义生成器函数,生成器函数是一种特殊的函数,可以在迭代过程中逐步产生值,而不是一次性返回所有结果。

跟普通函数不同的是,生成器是一个返回迭代器的函数,只能用于迭代操作,更简单点理解生成器就是一个迭代器。

当在生成器函数中使用 yield 语句时,函数的执行将会暂停,并将 yield 后面的表达式作为当前迭代的值返回。

然后,每次调用生成器的 next() 方法或使用 for 循环进行迭代时,函数会从上次暂停的地方继续执行,直到再次遇到 yield 语句。这样,生成器函数可以逐步产生值,而不需要一次性计算并返回所有结果。

调用一个生成器函数,返回的是一个迭代器对象。

下面是一个简单的示例,展示了生成器函数的使用:

Python学习【23】:迭代器与生成器

输出结果:

Python学习【23】:迭代器与生成器

以上实例中,countdown 函数是一个生成器函数。它使用 yield 语句逐步产生从 n 到 1 的倒数数字。在每次调用 yield 语句时,函数会返回当前的倒数值,并在下一次调用时从上次暂停的地方继续执行。

通过创建生成器对象并使用 next() 函数或 for 循环迭代生成器,我们可以逐步获取生成器函数产生的值。在这个例子中,我们第一使用 next() 函数获取前三个倒数值,然后通过 for 循环获取剩下的两个倒数值。

生成器函数的优势是它们可以按需生成值,避免一次性生成大量数据并占用大量内存。此外,生成器还可以与其他迭代工具(如for循环)无缝配合使用,提供简洁和高效的迭代方式。

以下实例使用 yield 实现斐波那契数列:

Python学习【23】:迭代器与生成器

输出结果:

Python学习【23】:迭代器与生成器

三、小结

今天学习了python语言最具特色之一的迭代器与生成器,我们常用的for循环本身不是迭代器,但依赖迭代器工作。很容易理解for循环的工作结果。而当我们自己用类来写迭代器与生成器之后,会发现不容易理解了。

还是回到之前说过的那句话,多做练习。在不断地上机实操中,会逐渐深入体会python学习乐趣。

让我们保持学习热烈,多做练习。我们下期再见!

Python学习【23】:迭代器与生成器

快乐学习

© 版权声明

相关文章

6 条评论

您必须登录才能参与评论!
立即登录
  • 头像
    伪文艺的虚假人生 读者

    学习是让自己过得从从容容游刃有余,而不是匆匆忙忙连滚带爬

    无记录
  • 头像
    我果木迟早会是人生赢家 读者

    for x in list 不就行了,为啥要多此一举,有点不是很懂

    无记录
  • 头像
    一个米小米 读者

    在数据大的时候可以节省内存

    无记录
  • 头像
    无差别攻击everyone非特指的one 投稿者

    哦哦,原来这样啊,受教了

    无记录
  • 头像
    雨竹 读者

    学习迭代器收获很多

    无记录
  • 头像
    田田alliswell 投稿者

    收藏了,感谢分享

    无记录