魔法方法之__iter__(self) && __next__(self)

__iter__

__iter__(self) 是一个特殊方法,用于返回一个迭代器对象,使得自定义的类可以支持迭代操作。

最佳实践:

  • 在自定义类中实现 __iter__() 方法时,应该返回一个迭代器对象,通常是自身的实例。
  • 迭代器对象应该实现 __next__() 方法,用于返回容器中的下一个元素,并在没有更多元素可供迭代时引发 StopIteration 异常。
复制代码
 1 class MyIterable:
 2     def __init__(self):
 3         self.data = ['A', 'B', 'C']
 4 
 5     def __getitem__(self, index):
 6         print(f"__getitem__,index={index}")
 7         return self.data[index]
 8 
 9     def __iter__(self):
10         print("__iter__() is called")
11         return iter(self.data)
12 
13 
14 my_iterable = MyIterable()
15 
16 # 使用 for 循环迭代对象
17 for item in my_iterable:
18     print(item)  # 输出:A  B  C
19 
20 # 调用 iter() 函数获取迭代器对象
21 my_iterator = iter(my_iterable)
22 print(next(my_iterator))  # 输出:A
23 print(next(my_iterator))  # 输出:B
24 print(next(my_iterator))  # 输出:C
复制代码

__next__

__next__() 是一个特殊方法,用于定义迭代器对象的行为。它在迭代器对象中被调用,用于返回容器中的下一个元素。下面是关于 __next__() 方法的详解、最佳实践、示例以及可能遇到的一些坑:

  • 详解:

    • __next__() 方法应该返回容器中的下一个元素,并在没有更多元素可供迭代时引发 StopIteration 异常。
    • 如果没有显式地引发 StopIteration 异常,那么迭代器将永远不会停止并进入无限循环状态。
    • 在每次调用 __next__() 方法时,迭代器应该更新自身的状态以追踪迭代位置。
  • 最佳实践:

    • 在 __iter__() 方法中返回迭代器对象时,迭代器对象本身应该实现 __next__() 方法。
    • 迭代器对象的 __next__() 方法应该返回容器中的下一个元素,并更新状态。
复制代码
 1 class MyIterable:
 2     def __init__(self):
 3         self.data = ['A', 'B', 'C']
 4         self.index = 0
 5 
 6     def __iter__(self):
 7         print("__iter__() is called")
 8         return self
 9 
10     def __next__(self):
11         print(f"__next__() is called,index={self.index}")
12         if self.index >= len(self.data):
13             raise StopIteration
14         value = self.data[self.index]
15         self.index += 1
16 
17         return value
18 
19 my_iterable = MyIterable()
20 for item in my_iterable:
21     print(item)  # 输出:A B C
22 
23 #  只能迭代1次:TypeError: iter() returned non-iterator of type 'MyIterable'
24 for item in my_iterable:
25     print(item)  # 输出:A B C
26 
27 
28 # 因为上面已经迭代 index已经3,如果进行调用,使用next方法就会抛StopIteration异常。
29 # my_iterator = iter(my_iterable)
30 # print(next(my_iterator))  # 输出:A
31 # print(next(my_iterator))  # 输出:B
32 # print(next(my_iterator))  # 输出:C
复制代码

 

posted @   Allen_Hao  阅读(36)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
点击右上角即可分享
微信分享提示