在编程语言中,涉及到集合类型的数据,我们总会需要进行对数据的遍历,这时候,就会涉及到三个概念:可迭代对象、迭代器和迭代协议。今天的这篇文章就来介绍一下Python中的这三个概念的实现,以及背后的魔术方法。
本文的主要内容有:
1、可迭代对象与迭代器
2、迭代协议
3、自定义实现迭代器
可迭代对象与迭代器在Python中,可迭代对象(Iterable)和迭代器(Iterator)是实现遍历的核心概念。它们都与迭代协议(Iteration Protocol)密切相关。理解这些概念可以帮助我们更好地掌握Python中的遍历机制和实现我们自己的迭代器。
可迭代对象(Iterable)
一个对象如果实现了__iter__()方法,并且通过该方法返回了一个迭代器,那么该对象就是可以迭代的,也就是可迭代对象了。
Python中的列表、元组、字典、集合和字符串等,其实都是可迭代对象。
Python的collections.abc中有抽象基类Iterable,可以看到只有一个抽象方法__iter__():
迭代器(Iterator)
如果一个对象实现了__iter__()方法,返回自身,并且实现了__next__()方法,返回遍历的下一个元素,在没有更多元素时,通常会引发StopIteration异常,那么这个对象就是一个迭代器。
Python的collections.abc中有抽象基类Iterator,可以看到其中有两个抽象方法:
我们可以通过代码来验证下内置类型是可迭代对象,而非迭代器:
运行结果:
迭代协议迭代协议是Python中为遍历对象定义的一组规则。具体来说,一个对象要遵循迭代协议,它需要实现以下方法:
1、__iter__():返回一个迭代器对象。
2、__next__():返回下一个元素,如果没有更多地元素,则抛出StopIteration异常。
迭代协议,更多的是一种约定,约定了从原则上来说,一个对象必须实现上面两个方法,才可以被遍历(当然,不是很严谨)。
而Python内部实现中,也是通过对这两个方法的调用,来实现对一个对象的遍历操作。
自定义实现迭代器接下来,我们通过代码,演示一个简单的迭代器的实现:
执行结果:
从代码执行结果中,可以看出:
1、在for循环开始之初,迭代器的__iter__()方法会被调用一次,之后就不再调用了。
2、在对迭代器进行遍历的过程中,每次是通过__next__()方法的调用,获取其中的元素的。
需要说明的是,上面的代码只是用于演示迭代器的自定义实现,本身没有实用意义,毕竟我们通过for循环可以直接对列表进行遍历的。
但是,当我们传入的对象不再是简单的列表、元组等,而是自定义类型时,遍历会更加具有实用意义。
此外,关于for循环真正是如何执行的,我们还需要进一步深入探究,当然,这部分内容就放到下一篇文章中了。
总结本文主要介绍了Python中的可迭代对象、迭代器与迭代协议这三个概念,及对应的Python中的实现。然后,通过实际代码演示了一个自定义的迭代器的实现。
以上,就是本文的全部内容,希望对您有所帮助。