迭代器问题
for循环每遍历一次他会经过myiterator自动调用__next__方法,为什么不是自动调用其他的方法呢,比如调用__iter__或者说是for循环每遍历一次会经过myiterator找到__next__为什么不是找到__iter__呢 for 循环通过 __iter__ 获取一个迭代器(就是里面定义了 __next__ 方法的对象),然后重复调用这个迭代器的 __next__ 方法直到抛出异常,这两个方法分工不同,明白吧? hrpzcf 发表于 2023-1-7 14:43
for 循环通过 __iter__ 获取一个迭代器(就是里面定义了 __next__ 方法的对象),然后重复调用这个迭代器的 ...
是通过__iter__来获取,但是__iter__的返回值是MyIterator(self)这个的实例对象myiterator,但是这个实例对象没有指定调用哪一个方法,那么为什么他会调用到__next__方法而不是__iter__方法 本帖最后由 阿奇_o 于 2023-1-7 15:32 编辑
其实,for循环 会先调用 iter(mylist) 即 mylist.__iter__() ,这返回了一个你自定义的MyIterator实例对象(迭代器),然后为了遍历元素,则需要反复调用这个对象的 __next__()
甚至,你不用另外自定义的MyIterator,只要MyList里的__iter__() 返回的是一个合理的 迭代器或生成器 (能遍历元素),就可以,比如:
class MyList2:
def __init__(self):
self.items = []
def __iter__(self):
print("__iter__ was called.")
return (i for i in self.items)# 返回能遍历元素的生成器对象
def add(self, val):
self.items.append(val)
ml2 = MyList2()
ml2.add(1)
ml2.add(2)
for i in ml2:
print(i)
__iter__ was called.
1
2
失败且常态 发表于 2023-1-7 15:21
是通过__iter__来获取,但是__iter__的返回值是MyIterator(self)这个的实例对象myiterator,但是这个实 ...
获取迭代器下一个元素约定调用 __next__ 方法,这是 Python 设计规定的,不需要指定。就像 for 循环获取迭代器对象调用 __iter__ 方法而不调用其他方法一样,也是这么设计的
页:
[1]