__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
标签:__,迭代,self,iter,next,my From: https://www.cnblogs.com/allenxx/p/17561564.html