在Python进阶记录之基础篇(十)中,我们介绍了Python中字典dict的相关知识点,介绍了字典的基本概念和各种操作方法字典与列表、元组、集合都是Python中常用的数据结构,需要重点掌握它们之间的关联与区别,熟练使用各个数据结构今天我们来讲一下Python中的迭代器与生成器,下面我们就来说一说关于python迭代器?我们一起去了解并探讨一下这个问题吧!

python迭代器(Python中的迭代器与生成器)

python迭代器

回顾

在Python进阶记录之基础篇(十)中,我们介绍了Python中字典dict的相关知识点,介绍了字典的基本概念和各种操作方法。字典与列表、元组、集合都是Python中常用的数据结构,需要重点掌握它们之间的关联与区别,熟练使用各个数据结构。今天我们来讲一下Python中的迭代器与生成器。

迭代器

在之前介绍的列表、元组等内容中,我们都通过for-in循环遍历了其中的元素,这种遍历我们称之为迭代,而迭代器就是一个可以记住遍历位置的对象。迭代器对象从序列的第一个元素开始访问,直到所有的元素被访问完结束。

创建迭代器

Python中通过 iter() 函数创建迭代器。将列表、元组、字典、集合分别传入 iter() 函数,即可生成对应的迭代器。

创建迭代器

列表、元组、字典、集合生成的迭代器类型分别为list_iterator(列表迭代器)、 tuple_iterator(元组迭代器)、dict_keyiterator(字典迭代器)、set_iterator(集合迭代器)。

迭代器的遍历

当我们使用for-in循环时,只要作用于一个可迭代对象,for循环就可以正常运行,而我们不太关心该对象究竟是list还是其他数据类型。因此,我们可以使用for-in循环对迭代器进行遍历。

for-in循环遍历迭代器

这里需要注意的是,遍历字典迭代器时默认是遍历字典的key。

除了for-in循环,迭代器还可以通过自身的 next() 方法来进行遍历。

next()方法遍历迭代器

next() 方法每调用一次,都会获取当前遍历位置上的元素,同时记录下一个遍历位置。

请注意,迭代器只能往前不会后退。因此,当迭代器遍历结束时(不管是for-in循环遍历还是 next() 方法遍历),如果继续调用 next() 方法,Python会抛出一个 StopIteration 异常。

生成器

在介绍生成器前,我们先补充一个列表中的知识点——列表生成式。列表生成式是指可以生成 list 列表的表达式,并且使用中括号 [] 来去表示。

列表生成式

上述代码中,使用列表生成式只需要一行代码就可以代替for-in循环生成所需的列表,可以快速生成 list。列表生成式可以通过一个 list 推导出另一个 list ,而代码却十分简洁。此外,列表生成式还支持for-in循环后跟if条件语句,增加了可操作性。

生成器的基本概念

由于列表生成式生成列表的时候是一下子就把列表生成好的,而列表容量是有限的,虽然一般而言,这个容量是足够大的,但始终会受到内存限制。并且,有时候我们并不需要访问所有列表元素,例如有一个包含100万个元素的列表,但我们只需要访问前面几个元素,此时若创建这个列表,那后面绝大多数元素占用的空间岂不是白白浪费了?

因此Python为我们提供了一种边循环边计算的机制,就是生成器。生成器使我们可以在循环遍历的过程中不断推算出后续的元素,从而不必创建完整的列表。

生成器的简单创建

将列表生成式的中括号换成小括号,得到的并不是元组,而是一个简单的生成器,我们可以通过for-in循环来遍历这个生成器。生成器也有 next() 方法,但是这种方式生成的生成器我们基本上不会去调用 next() 方法,

yield关键字

上述方法虽然也可以生成一个生成器,但我们用得并不多。Python中我们常用的生成器主要是使用带有 yield 关键字的函数。

跟普通函数不同的是,生成器是一个返回迭代器的函数,只能用于迭代操作。在调用生成器运行的过程中,每次遇到 yield 时函数会暂停并保存当前所有的运行信息,返回 yield 的值, 并在下一次执行 next() 方法时从当前位置继续运行。

yield生成器的基本用法

以上代码中,我们将斐波拉契数列通过 yield 关键字的生成器实现,该生成器会返回一个迭代器。例如我们将fibonacci(10)赋给变量f,那么f就是一个包含斐波拉契数列前10个元素的迭代器,通过 next() 方法可以遍历这10个元素。

总结

以上内容介绍了Python中迭代器与生成器的基本概念与用法,其中,通过带 yield 关键字函数生成的生成器可能比较难理解,我们会在日后使用的过程中逐渐消化。简单来讲可以这样理解,生成器遇到 yield 语句或者执行到函数体最后一行语句,就是结束生成器的指令。感谢大家的支持与关注,欢迎一起学习交流~