生成器與迭代器

1、生成器 (generator)
       經過列表生成式,咱們能夠直接建立一個列表,但列表在內存中受到容量的限制,好比咱們建立一個100萬個元素的列表,佔用很大的存儲空間;若是咱們僅僅須要訪問前面幾個元素,後面的元素佔用的空間就白白浪費了。
若是列表元素能夠按照某種算法推算出來,按照這種算法在循環過程當中不斷推算出後續的元素,這樣就沒必要建立完整的list,從而節省大量的空間,python中這種一邊循環一邊計算的機制,就稱爲生成器(generator)
例:
g = ( i for i in range(10) )
print(g.__next__())
print(g.__next__())
print(g.__next__())
print(g.__next__())

生成器特性:python

  1. 只有在調用時纔會生成相應的數據
  2. 經過next方法調用。 #2.x中next的使用方法爲next()
  3. 生成器(generator)保存的是算法,每次調用next(g),就計算出g的下一個元素的值,直到計算到最後一個元素,沒有更多的元素時,拋出StopIteration的錯誤。
生成器定義的方法:
  1. 只要把一個列表生成式的[]改爲(),就建立了一個generator
  2. 若是一個函數定義中包含yield關鍵字,那麼這個函數就再也不是一個普通函數,而是一個generator
 一般基本不會使用next方法來調用,而是經過for循環來來迭代。
g = ( i for i in range(10) )
for gen in g:
    print(gen)

 

2、迭代器
能夠直接做用於for循環的數據類型有:
  1. 集合數據類型,如list、tuple、dict、set、str等
  2. generator,包括生成器和帶yield的generator function這些能夠直接做用於for循環的對象統稱爲可迭代對象(Iterable),也能夠理解爲可循環對象。可使用內置函數isinstance()判斷一個對視是不是可迭代對象:
例:
>>> from collections import Iterable
>>> isinstance([], Iterable)
True
>>> isinstance({}, Iterable)
True
>>> isinstance('abc', Iterable)
True
>>> isinstance((x for x in range(10)), Iterable)
True
>>> isinstance(100, Iterable)
False

 

迭代器的定義:算法

     **能夠被next()函數調用並不斷返回下一個值的對象稱爲迭代器(Iterator)。函數

一樣以使用內置函數isinstance()判斷一個對視是不是迭代對象
例:
>>> from collections import Iterator
>>> isinstance((x for x in range(10)), Iterator)
True
>>> isinstance([], Iterator)
False
>>> isinstance({}, Iterator)
False
>>> isinstance('string', Iterator)
False

生成器都是迭代器對象,但list、dict、str雖然是可迭代對象,卻不是迭代器spa

 
小結:
  • 凡是可做用於for循環的對象都是可迭代對象(Iterable);
  • 凡是可做用於next()函數的對象都是迭代器(Iterator)類型,他們表示一個惰性的計算序列;
  • 集合類型如list、dict、str等雖然是Iterable但不是Iterator ; 但能夠經過Iter()函數得到一個Iterator對象。
**python的for循環本質上就是經過不斷調用next()函數實現的。
如:
for x in [1,2,3,4,5]:
    pass
實際徹底等價於:
it = iter([1,2,3,4,5])
while True:
    try:	# 得到下一個值:
        x = next(it)
    except StopIteration: # 遇到StopIteration就退出循環
        break
相關文章
相關標籤/搜索