数据结构论坛

首页 » 分类 » 分类 » Python迭代器和C迭代器,最大的
TUhjnbcbe - 2024/7/13 15:32:00

作者

樱雨楼

责编

胡巍巍

前言

迭代器(Iterator)是Python以及其他各种编程语言中的一个非常常见且重要,但又充满着神秘感的概念。无论是Python的基础内置函数,还是各类高级话题,都处处可见迭代器的身影。

那么,迭代器究竟是怎样的一个概念?其又为什么会广泛存在于各种编程语言中?本文将基于C++与Python,深入讨论这一系列问题。

什么是迭代器?我们为什么要使用迭代器?

什么是迭代器?当我初学Python的时候,我将迭代器理解为一种能够放在“forxxxin…”的“…”位置的东西;后来随着学习的深入,我了解到迭代器就是一种实现了迭代器协议的对象;学习C++时,我了解到迭代器是一种行为和指针类似的对象…

事实上,迭代器是一个伴随着迭代器模式(IteratorPattern)而生的抽象概念,其目的是分离并统一不同的数据结构访问其中数据的方式,从而使得各种需要访问数据结构的函数,对于不同的数据结构可以保持相同的接口。

在很多讨论Python迭代器的书籍与文章中,我看到这样两种观点:1.迭代器是为了节约数据结构所产生的内存;2.遍历迭代器效率更高。

这两点论断都是很不准确的:首先,除了某些不定义在数据结构上的迭代器(如文件句柄,itertools模块的count、cycle等无限迭代器等),其他迭代器都定义在某种数据结构上,所以不存在节约内存的优势;其次,由于迭代器是一种高度泛化的实现,其需要在每一次迭代器移动时都做一些额外工作(如Python需要不断检测迭代器是否耗尽,并进行异常监测;C++的deque容器需要对其在堆上用于存储的多段不连续内存进行衔接等),故遍历迭代器的效率一定低于或几乎接近于直接遍历容器,而不太可能高于直接遍历原容器。

综上所述,迭代器存在的意义,不是为了空间换时间,也不是为了时间换空间,而是一种适配器(Adapter)。迭代器的存在,使得我们可以使用同样的for语句去遍历各种容器,或是像C++的algorithm模块所示的那样,使用同样的接口去处理各种容器。

这些容器可以是一个连续内存的数组或列表,或是一个多段连续内存的deque,甚至是一个完全不连续内存的链表或是哈希表等等,我们完全不需要

1
查看完整版本: Python迭代器和C迭代器,最大的