代码之家  ›  专栏  ›  技术社区  ›  lprsd

python中的iterability

  •  4
  • lprsd  · 技术社区  · 16 年前

    我试图理解Python中的Iterability。

    据我所知, __iter__() 应返回具有 next() 定义的方法,必须返回值或引发 StopIteration 例外。所以我写了这个类,它同时满足这两个条件。

    但它似乎不起作用。怎么了?

    class Iterator:
        def __init__(self):
            self.i = 1
    
        def __iter__(self):
            return self
    
        def next(self):
            if self.i < 5:
                return self.i
            else:
                raise StopIteration
    
    if __name__ == __main__:
        ai = Iterator()
        b  = [i for i in ai]
        print b
    
    5 回复  |  直到 9 年前
        1
  •  1
  •   SingleNegationElimination    16 年前

    您当前的代码似乎有效。相反,我将向您展示更多的迭代器/生成器。

    最简单的内置与您的行为。

    Iterator2 = xrange(2,5)
    

    将类直接转换为生成器

    def Iterator3():
        i = 1
        while i < 5:
            i += 1
            yield i
    

    由Python标准库中的生成器组成的生成器

    import itertools
    Iterator4 = itertools.takewhile( 
                            lambda y : y < 5, 
                            itertools.count(2) )
    

    一个简单的生成器表达式(不太令人兴奋…)

    Iterator5 = ( x for x in [2, 3, 4] )
    
        2
  •  9
  •   Haes    16 年前

    迭代器类是正确的。你在这句话中有错别字:

    if __name__ ==' __main__':
    

    在“uu main”字符串中有一个前导空格。这就是为什么您的代码根本不被执行的原因。

        3
  •  4
  •   cobbal    16 年前

    i 如果你不增加它,永远不会超过5 next()

        4
  •  4
  •   Michael Kuhn    16 年前

    我认为在大多数情况下,写一个 generator function that uses yield 而不是编写一个成熟的迭代器。

        5
  •  0
  •   Ethan Furman    9 年前

    您的代码有两个问题:

    • if name == '__main__' :(缺少引号)
    • def next . . . :不递增 i 在任何地方