89、Python之鸭子类型:可迭代对象、迭代器与迭代协议

南宫理的日志录 2024-11-12 14:14:32
引言

在编程语言中,涉及到集合类型的数据,我们总会需要进行对数据的遍历,这时候,就会涉及到三个概念:可迭代对象、迭代器和迭代协议。今天的这篇文章就来介绍一下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中的实现。然后,通过实际代码演示了一个自定义的迭代器的实现。

以上,就是本文的全部内容,希望对您有所帮助。

0 阅读:0

南宫理的日志录

简介:深耕IT科技,探索技术与人文的交集