关于迭代器:Python中的可迭代性

Iterability in Python

我试图理解Python中的Iterability。

据我所知,__iter__()应该返回一个定义了next()方法的对象,该方法必须返回值或引发StopIteration异常。所以我写了这个类,它同时满足这两个条件。

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
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


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

1
if __name__ ==' __main__':

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


我认为在大多数情况下,编写一个使用yield的生成器函数,而不是编写一个成熟的迭代器就足够了。


如果不在EDOCX1[1]中增加,EDOCX1[0]将永远不会大于5。


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

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

1
Iterator2 = xrange(2,5)

将类直接转换为生成器

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

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

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

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

1
Iterator5 = ( x for x in [2, 3, 4] )

您的代码有两个问题:

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