Python进阶:如何自定义可迭代的类

苏见山
苏见山
发布时间:2026-10-13| 6人浏览过
原创

本文深入解析Python中自定义可迭代类的实现原理。通过对比列表与迭代器的内存消耗差异,阐明迭代器按需加载的优势。详细讲解__iter__和__next__特殊方法的定义与调用机制,并结合直角三角形与斐波那契数列两个代码实例,展示如何构建无限迭代器及控制迭代边界,帮助开发者优化大数据处理性能。

Python自定义可迭代的类

自定义可迭代的类

迭代器与列表的内存机制对比

列表支持获取长度并通过索引变量i进行循环,也能直接获取集合所有元素,这种写法直观且易于理解。然而,使用列表并非没有代价。列表之所以能通过索引快速定位任意元素,是因为它在创建时将所有数据一次性加载到一块连续的内存空间中。当数据规模较小时,这种实现方式尚可接受;但当数据量极大时,会消耗巨大的内存资源。相比之下,迭代机制则更为高效:它遵循“读多少、加载多少”的原则,不读取的数据不会占用内存。这类似于处理XML文档的两种模式:DOM模式会将整个XML文档一次性载入内存,从而实现快速随机访问,但内存开销大;而SAX模式则是顺序读取文档,未读取的内容不会进入内存,因此更节省内存,但仅支持从前向后的顺序访问。

__iter__与__next__方法的实现

若要在类中实现迭代功能,需定义__iter__方法,使该类的实例成为迭代器。__iter__方法必须返回一个迭代器对象,通常直接返回对象自身(即self)。在每次迭代过程中,解释器会调用迭代器的另一个特殊方法__next__,该方法负责返回当前迭代的值。以下通过一个简单示例演示:自定义一个迭代器,用于逐行生成由星号*组成的直角三角形,并通过for循环输出指定行数的三角形。

示例:自定义直角三角形迭代器


# 可无限迭代直角三角形的行
class righttriangle:
  def __init__(self):
    # 定义一个变量n,表示当前的行数
    self.n = 1
  def __next__(self):
    # 通过字符串的乘法获取直接三角形每一行的字符串,每一行字符串的长度是2 * n -1
    result = '*' * (2 * self.n - 1)
    # 行数加1
    self.n += 1
    return result
  # 该方法必须返回一个迭代器
  def __iter__(self):
    return self

rt = righttriangle()
# 对迭代器进行迭代
for e in rt:
  # 限制输出行的长度不能大于20,否则将会无限输出行
  if len(e) > 20:
    break
  print(e)

输出结果:


*
***
*****
*******
*********
***********
*************
***************
*****************
*******************

[例10.10] 接下来看一个更具实用性的例子,定义一个名为Fibonacci的迭代器类,用于无限制地迭代生成斐波那契数列。

示例:斐波那契数列无限迭代


# 可以无限制迭代斐波那契数列
class Fibonacci:
  # 在构造方法中定义两个变量a和b,用来表示斐波那契数列的最开始的两个值
  def __init__(self):
    self.a = 0
    self.b = 1
  def __next__(self):
    # self.a就是当前要迭代的值
    result = self.a
    # 计算斐波那契数列的下一个值,并将a变成原来的b,将b变成下一个值
    self.a, self.b = self.b, self.a + self.b
    # 返回当前迭代的值
    return result
  # 该方法必须返回一个迭代器
  def __iter__(self):
    return self

fibs = Fibonacci()
# 对斐波那契数列进行迭代
for fib in fibs:
  print(fib,end = ' ')
  # 迭代的值不能超过500
  if fib > 500:
    break

输出结果:


0 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持本站。

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。