迭代器和生成器

##迭代器## 迭代的意思是重复作一些事情不少次,到如今为止只是在for循环中对序列和字典进行迭代,但实际上也能对其余的对象进行迭代:实现__iter__方法的对象。python

__iter__方法返回一个迭代器,所谓迭代器就是具备next方法(这个方法在调用时不须要任何参数)的对象。在调用next方法时,迭代器会返回它的下一个值。若是next方法被调用,但迭代器没有值能够返回,就会引起一个StopIteration异常。
为何不用列表?列表是一次性获取全部值的,若是有不少值,列表会占用太多的内存,可是迭代器能够在使用时计算一个值时获取一个值,使用迭代器更通用,简单,优雅函数

<!-- lang: python -->
class TestIterator(object):
    value = 0
    def next(self):
        self.value += 1
        if self.value > 10:
            raise StopIteration
        return self.value

    def __iter__(self):
        return self
if __name__ == '__main__':
    ti = TestIterator()
    print list(ti)

迭代器实现了__iter__方法,这个方法实际上返回迭代器自己。不少状况下,__iter__会放到其余的会在for循环中使用的对象中。这样一来,程序就能返回所需的迭代器。此外,推荐使用迭代器实现它本身的__iter__方法,而后就能直接在for循环中使用迭代其自己了。
若是一个对象没有__iter__方法但定义了__getitem__方法,那么这个对象仍然是可迭代的。在这种状况下,当Python的内建函数iter将会返回一个对应此对象的迭代器类型,并使用__getitem__方法遍历list的全部元素。若是StopIteration或IndexError异常被抛出,则迭代中止。让咱们看看如下的例子: class SimpleList(object): def init(self, *items): self.items = itemscode

def __getitem__(self, i):
        return self.items[i]

>>> a = SimpleList(1, 2, 3)
>>> it = iter(a)
>>> next(it)
1
>>> next(it)
2
>>> next(it)
3
>>> next(it)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
StopIteration

##生成器##对象

<!-- lang: python -->
def main(starttime, endtime):
    starttime = datetime.datetime.strptime(starttime, "%Y-%m-%d")
    endtime = datetime.datetime.strptime(endtime, "%Y-%m-%d")

    if starttime > endtime:
        yield starttime
    else:
        while starttime <= endtime:
            yield starttime
            starttime += datetime.timedelta(days=1)

if __name__ == '__main__':
    for i in main("2012-3-1", "2012-4-1"):
        print i
相关文章
相关标签/搜索