当前位置: 首页 > 科技观察

Python编程:可迭代对象和迭代器(Iterable&Iterator)

时间:2023-03-12 20:24:33 科技观察

前言在Python编程中,循环处理是不可避免的,这涉及到两个重要的概念,即可迭代对象和迭代器(Iterable&IteratorIterator)。迭代这个话题我会分成两三篇文章来帮助大家理解和应用到实际编程中。本文为第一篇。可迭代对象可迭代对象(Iterable)是一次可以返回一个成员的对象。可迭代对象的示例包括所有序列类型(例如list、str和tuple)和一些非序列类型,例如dict、文件对象,以及您定义的任何实现了__iter__()方法或__getitem__方法的类的对象序列语义由()方法和迭代协议指定(有关详细信息,请参见此处:)。可迭代对象可用于for循环和其他需要序列的地方(例如zip()、map()、filter()...)。当可迭代对象作为参数传递给内置函数iter()时,它会返回该对象的迭代器。该迭代器只适用于一次性遍历一组值。使用可迭代对象时,通常不需要调用iter()或自己处理迭代器对象。这是通过for语句自动完成的,该语句创建一个临时的未命名变量,用于在循环期间保存迭代器。简而言之,可迭代对象是任何实现了__iter__()方法或__getitem__()方法的类对象。迭代器迭代器(Iterator)是指代表数据流的对象。重复调用迭代器的__next__()方法(或将其传递给内置函数next())将返回流中的连续项。当没有更多数据可用时,将引发StopIteration异常。此时,迭代器对象已用完,任何对其__next__()方法的进一步调用都将再次引发StopIteration。迭代器必须有一个返回迭代器对象本身的__iter__()方法,因此每个迭代器也是可迭代的,并且可以在大多数接受其他可迭代对象的地方使用。简而言之,迭代器是一个数据流对象,它实现了__next__()和__iter__()两种迭代器协议方法。一个值得注意的例外是尝试多次迭代的代码(多次使用相同的迭代器)。每次传递给iter()函数或在for循环中使用时,容器对象(例如列表)都会生成一个新的迭代器。尝试使用迭代器进行此操作只会返回在上一次迭代过程中使用的耗尽迭代器对象,使其看起来像一个空容器。所以在写代码的时候要避免这样的情况。iter函数另一件需要理解的事情是内置函数iter()(它在幕后调用__iter__()方法)返回一个迭代器对象。所以我们可以说。可迭代对象是返回迭代器的对象。为了进一步理解迭代器和可迭代对象,后续我将通过讲解和代码示例进一步介绍以下重点内容:自定义迭代器的迭代器协议和循环实现。