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