首页 新闻 会员 周边 捐助

自定义迭代器中__iter__里面必须return 自身吗?

0
[已解决问题] 解决于 2025-09-04 16:59
自定义迭代器de

    def __iter__(self):     # 返回自身的迭代器
        return self
中__iter__里面必须return 自身吗
_java_python的主页 _java_python | 小虾三级 | 园豆:984
提问于:2025-09-04 16:53
< >
分享
最佳答案
0

不是必须,而是取决于你想让对象扮演什么角色。

“自己就是迭代器” —— 才 return self
此时类里还得再实现 __next__()(或 Python2 的 next)。
典型写法:

class CountDown:
    def __init__(self, n):
        self.n = n
    def __iter__(self):      # 迭代器协议 ①
        return self          # 自己就是迭代器
    def __next__(self):      # 迭代器协议 ②
        if self.n <= 0:
            raise StopIteration
        self.n -= 1
        return self.n + 1

“只是可迭代对象,但迭代器另有其人” —— __iter__ 返回一个新的迭代器实例
常见于“容器类”想支持多次独立遍历,例如:

class MyRange:
    def __init__(self, start, stop):
        self.start = start
        self.stop  = stop
    def __iter__(self):
        # 返回一个全新的迭代器对象
        return MyRangeIterator(self.start, self.stop)

class MyRangeIterator:
    def __init__(self, cur, stop):
        self.cur  = cur
        self.stop = stop
    def __iter__(self):
        return self
    def __next__(self):
        if self.cur >= self.stop:
            raise StopIteration
        val = self.cur
        self.cur += 1
        return val

甚至可以让 __iter__ 直接返回别的可迭代对象
例如内置列表:

class Wrapper:
    def __init__(self, data):
        self.data = data
    def __iter__(self):
        return iter(self.data)  # 把迭代职责交给列表
  • 想让实例“既是可迭代对象,又是迭代器” → __iter__ return self 并同时实现 __next__。每次都是it = iter(obj),it是迭代器对象,然后next(it)
  • 只想让它“可迭代” → __iter__ 可以返回任何遵循迭代器协议的对象(包括新建的迭代器实例、生成器、甚至内置容器)。
_java_python | 小虾三级 |园豆:984 | 2025-09-04 16:55
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册