##迭代器## 迭代的意思是重复作一些事情不少次,到如今为止只是在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