python迭代器與生成器詳解

迭代器與生成器

迭代器(iterator)與生成器(generator)是 Python 中比較經常使用又很容易混淆的兩個概念,今天就把它們梳理一遍,並舉一些經常使用的例子。python

for 語句與可迭代對象(iterable object):git

obj = {"a": 123, "b": 456}
for k in obj:
    print(k)

1、迭代器github

這些能夠用在 for 語句進行循環的對象就是可迭代對象。除了內置的數據類型(列表、元組、字符串、字典等)能夠經過 for 語句進行迭代,咱們也能夠本身建立一個容器,包含一系列元素,能夠經過 for 語句依次循環取出每個元素,這種容器就是迭代器(iterator)函數

除了用 for 遍歷,迭代器還能夠經過 next() 方法逐一讀取下一個元素。要建立一個迭代器有3種方法,其中前兩種分別是:this

  1. 爲容器對象添加 __iter__() 和 __next__() 方法(Python 2.7 中是 next());__iter__() 返回迭代器對象自己 self__next__() 則返回每次調用 next() 或迭代時的元素;
  2. 內置函數 iter() 將可迭代對象轉化爲迭代器

建立迭代器對象的好處是當序列長度很大時,能夠減小內存消耗,由於每次只須要記錄一個值即刻(常常看到人們介紹 Python 2.7 的 range 函數時,建議當長度太大時用 xrange 更快,在 Python 3.5 中已經去除了 xrange 只有一個相似迭代器同樣的 range)。spa

2、生成器

前面說到建立迭代器有3種方法,其中第三種就是生成器(generator)code

生成器經過 yield語句快速生成迭代器,省略了複雜的 __iter__() & __next__() 方式:對象

簡單來講,yield 語句可讓普通函數變成一個生成器,而且相應的 __next__() 方法返回的是 yield 後面的值。blog

一種更直觀的解釋是:程序執行到 yield 會返回值並暫停,再次調用 next() 時會從上次暫停的地方繼續開始執行:ip

相關文章
相關標籤/搜索