迭代器和生成器

##迭代器## 迭代的意思是重複作一些事情不少次,到如今爲止只是在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
相關文章
相關標籤/搜索