我不知道Python中的__iter__,谁能给个好代码示例?

6 投票
4 回答
10219 浏览
提问于 2025-04-15 17:19

我的代码运行出错了

class a(object):
    def __iter(self):
        return 33
b={'a':'aaa','b':'bbb'}
c=a()
print b.itervalues()
print c.itervalues()

请尝试使用代码,而不是文字,因为我的英语不是很好,谢谢

4 个回答

1

这里有一个代码示例,展示了如何实现内置的 xrange 功能:

class my_xrange(object):
    def __init__(self, start, end, skip=1):
        self.curval = int(start)
        self.lastval = int(end)
        self.skip = int(skip)
        assert(int(skip) != 0)

    def __iter__(self):
        return self

    def next(self):
        if (self.skip > 0) and (self.curval >= self.lastval):
            raise StopIteration()
        elif (self.skip < 0) and (self.curval <= self.lastval):
            raise StopIteration()
        else:
            oldval = self.curval
            self.curval += self.skip
            return oldval

for i in my_xrange(0, 10):
    print i
5

关于你的代码,有几点需要注意:

  1. __iter 应该是 __iter__
  2. 你在 __iter__ 函数中返回了 '33'。其实你应该返回一个 迭代器对象。迭代器是一个对象,当你调用它的 next() 函数时,它会不断返回不同的值(比如一系列值 [0,1,2,3 等等])。

下面是一个迭代器的工作示例:

class a(object):
    def __init__(self,x=10):
        self.x = x
    def __iter__(self):
        return self
    def next(self):
        if self.x > 0:
            self.x-=1
            return self.x
        else:
            raise StopIteration

c=a()

for x in c:
    print x

a 的任何对象都是一个迭代器对象。调用 __iter__ 函数应该返回这个迭代器,所以它返回的是它自己。正如你所看到的,a 类有一个 next() 函数,所以这就是一个迭代器对象。

当调用 next 函数时,它会不断返回连续的值,直到返回零,然后它会抛出 StopIteration 异常,这样就(恰当地)停止了迭代。

如果这听起来有点模糊,我建议你动手试试代码,然后查看这里的文档: http://docs.python.org/library/stdtypes.html

17

a. 拼写要正确:不是

   def __iter(self):

而是:

   def __iter__(self):

iter 前后加上 __

b. 代码主体要正确:不是

return 33

而是:

yield 33

或者

返回 iter([33])

如果你在 __iter__ 里返回一个值,那就返回一个迭代器(一个 可迭代对象,像 return [33] 这样几乎可以,但还是不完全一样...);否则,就用 yield 返回一个或多个值,这样 __iter__ 就变成了一个生成器函数(所以它本质上返回一个生成器迭代器)。

c. 调用要正确:不是

a().itervalues()

而是,比如:

for x in a(): print x

或者

print list(a())

itervalues 是字典的方法,和 __iter__ 没有关系。

如果你修正这三个 (!) 错误,代码就能更好地工作了;-)。

撰写回答