Python进阶:如何自定义可迭代的类
本文深入解析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
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持本站。
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













