失败且常态 发表于 2023-1-7 14:33:12

迭代器问题

for循环每遍历一次他会经过myiterator自动调用__next__方法,为什么不是自动调用其他的方法呢,比如调用__iter__
或者说是for循环每遍历一次会经过myiterator找到__next__为什么不是找到__iter__呢

hrpzcf 发表于 2023-1-7 14:43:03

for 循环通过 __iter__ 获取一个迭代器(就是里面定义了 __next__ 方法的对象),然后重复调用这个迭代器的 __next__ 方法直到抛出异常,这两个方法分工不同,明白吧?

失败且常态 发表于 2023-1-7 15:21:34

hrpzcf 发表于 2023-1-7 14:43
for 循环通过 __iter__ 获取一个迭代器(就是里面定义了 __next__ 方法的对象),然后重复调用这个迭代器的 ...

是通过__iter__来获取,但是__iter__的返回值是MyIterator(self)这个的实例对象myiterator,但是这个实例对象没有指定调用哪一个方法,那么为什么他会调用到__next__方法而不是__iter__方法

阿奇_o 发表于 2023-1-7 15:27:30

本帖最后由 阿奇_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

hrpzcf 发表于 2023-1-7 15:32:38

失败且常态 发表于 2023-1-7 15:21
是通过__iter__来获取,但是__iter__的返回值是MyIterator(self)这个的实例对象myiterator,但是这个实 ...

获取迭代器下一个元素约定调用 __next__ 方法,这是 Python 设计规定的,不需要指定。就像 for 循环获取迭代器对象调用 __iter__ 方法而不调用其他方法一样,也是这么设计的
页: [1]
查看完整版本: 迭代器问题