我不知道python中的__iter__,谁能给我一个很好的代码示例

时间:2009-12-24 04:08:26

标签: python iterator

我的代码运行错误

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

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

4 个答案:

答案 0 :(得分:17)

一个。拼写正确:

   def __iter(self):

但:

   def __iter__(self):

__之后的iter和<{1}}之后的。

湾使身体正确:

return 33

但:

yield 33

或     返回它([33])

如果return来自__iter__的值,则返回迭代器( iterable ,如return [33]中所示,几乎同样好但不完全... );或者,yield 1+值,使__iter__成为生成器函数(因此它本质上返回生成器迭代器)。

℃。称之为正确:

a().itervalues()

但是,例如:

for x in a(): print x

print list(a())

itervalues是一种dict方法,与__iter__无关。

如果你修复了所有三个(!)错误,代码效果会更好; - )。

答案 1 :(得分:5)

关于您的代码的一些事项:

  1. __iter应为__iter__
  2. 您在__iter__函数中返回'33'。您应该实际返回迭代器对象。迭代器是一个在调用next()函数时保持返回不同值的对象(可能是[0,1,2,3 etc]之类的值序列)。
  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()函数,所以这是一个迭代器对象

    当调用下一个函数时,它会保持返回连续值,直到它达到零,然后它发送StopIteration异常,(适当地)停止迭代。

    如果这看起来有点朦胧,我建议您尝试使用代码,然后在此处查看文档:{​​{3}}

答案 2 :(得分: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

答案 3 :(得分:0)

您使用的语言功能不正确。

http://docs.python.org/library/stdtypes.html#iterator-types

上面的链接将解释该功能应该用于什么。

您可以尝试使用您的母语查看文档:{​​{3}}