【问题标题】:i don't know __iter__ in python,who can give me a good code example我不知道python中的__iter__,谁能给我一个很好的代码示例
【发布时间】:2010-12-29 17:19:45
【问题描述】:

我的代码运行错误

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

请尽量使用代码,而不是文字,因为我的英文不是很好,谢谢

【问题讨论】:

    标签: python iterator


    【解决方案1】:

    一个。拼写正确:不是

       def __iter(self):
    

    但是:

       def __iter__(self):
    

    __之前iter之后。

    b.使身体正确:

    return 33
    

    但是:

    yield 33
    

    或 返回迭代器([33])

    如果您 return 来自 __iter__ 的值,则返回一个迭代器(一个 iterable,就像在 return [33] 中一样,几乎和 return [33] 一样好,但并不完全......);否则,yield 1+ 个值,使 __iter__ 成为生成器函数(因此它本质上返回生成器迭代器)。

    c。说得对:不是

    a().itervalues()
    

    但是,例如:

    for x in a(): print x
    

    print list(a())
    

    itervalues是dict的方法,与__iter__无关。

    如果您修复了所有三个 (!) 错误,代码会运行得更好;-)。

    【讨论】:

    • 但如果他只是返回(产生)33,那真的是一个 iterator 吗?
    • 好吧,如果你 yield 33,那么是的,然后该方法变成一个生成器表达式,它生成一个迭代器。当你返回 [33] 时,一个列表当然是可迭代的,所以它也可以工作。
    • @Goose 和 @Shylent,是的:yield 33 使 __iter__ 成为生成器函数(not generator expression - 这是一个不同的构造;-),所以它返回一个生成器,它是一个迭代器; return [33] 返回一个可迭代但不是迭代器,所以这有点不完美——编辑答案来解决这个问题!-)
    • 哦,关于生成器函数 vs 生成器表达式,你当然是对的,不知道我在写这篇文章时在想什么。
    【解决方案2】:

    关于你的代码的一些事情:

    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() 函数,所以这是一个迭代器对象。

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

    如果这看起来有点模糊,我建议您尝试一下代码,然后在此处查看文档:http://docs.python.org/library/stdtypes.html

    【讨论】:

      【解决方案3】:

      这是一个实现内置 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
      

      【讨论】:

      • 这告诉 Python 如果 skip 为 0,则抛出异常。如果 skip 为 0,迭代器将永远不会终止,并且总是会打印出相同的值。
      • 这不是必需的,只是为了让类更安全地使用。它可以被移除而不会造成伤害。
      【解决方案4】:

      您错误地使用了此语言功能。

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

      上面的这个链接将解释该函数的用途。

      您可以在此处尝试以您的母语查看文档:http://wiki.python.org/moin/Languages

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-07-27
        • 1970-01-01
        • 1970-01-01
        • 2010-10-04
        • 1970-01-01
        相关资源
        最近更新 更多