1 生成器:python
爲何要有生成器?算法
就拿列表來講吧,假如咱們要建立一個list,這個list要求格式爲:[1,4,9,16,25,36……]這麼一直持續下去,直到有了一萬個元素的時候爲止。若是咱們要建立這個list,那麼應該是這樣的:app
[i*i for i in range(1,10001)] #列表生成式,不要忘了 #結果就不列出來了
這樣的話,這個list會佔用極多的內存,若是咱們能只將算法保存在list中,那麼這個list所佔的內存會大大減少,等咱們須要用到list的值的時候,這個list會自動運行其中的算法,將第一個值輸出,再次運行時,就會自動輸出第二個值,以此類推…… 這個特殊的list就被咱們稱之爲生成器(generator)。函數
如何建立生成器?code
建立生成器有不少方法:對象
1 第一種方法:教程
#將list生成式中的‘[’換爲‘(’ >>> (i*i for i in range(1,10001)) <generator object <genexpr> at 0x7fb0a69dc6e0> >>> g=(i*i for i in range(1,10001)) #使用next()函數獲取g的下一個值 >>> g.next() 1 >>> g.next() 4 >>> next(g) 9 #當沒有元素可返回的時候,會報錯 >>> g=(i for i in range(1,3)) >>> g.next() 1 >>> g.next() 2 >>> g.next() Traceback (most recent call last): File "<stdin>", line 1, in <module> StopIteration #實際上,咱們不推薦用next()函數,較爲經常使用的是用for循環,實際上for循環的本質就是調用了next()函數。即:首先經過iter()將可迭代的數據轉換爲可迭代對象,而後調用next() g=(i for i in range(1,11)) for i in g: print(i) #結果爲: 1 2 3 4 5 6 7 8 9 10 #這樣當沒有值可供返回的時候就會退出循環並不會報錯。
2 第二種方法:內存
這種方法用在函數中,好比說用函數實現楊輝三角:generator
我的實現該函數的代碼:it
def yh(): l=[1] n=[1] while True: yield n #這裏有一個yield關鍵字!,yield就是定義generator的關鍵字,yield相似於return,
#當函數運行到這裏就會結束,但不一樣的是,當下次繼續運行該函數時,就會從yield下方開始,也就是接續上次運行的地方繼續運行。 l.append(0) n=copy.copy(l) #注意這裏爲何要用copy功能!!!! for i in range(len(l)): n[i]=l[i]+l[i-1] l=n import copy n=0 for i in yh(): if n==10: break print(i) n=n+1
這裏有一個yield關鍵字!,yield就是定義generator的關鍵字,yield相似於return,當函數運行到這裏就會結束,但不一樣的是,當下次繼續運行該函數時,就會從yield下方開始,也就是接續上次運行的地方繼續運行。
另外摘抄了一個比較短小精悍的代碼:
def yh(): N = [1] while True: yield N N.append(0) N = [N[i-1] + N[i] for i in range(len(N))] …………
…………
2 迭代器
迭代器有什麼用途?
生成器存儲了算法,而迭代器則負責一次輸出一個該算法的結果。迭代器相似於生成器(事實上,並不單單只是生成器)與循環的結合,只不過這個循環「很懶」,一次只輸出一個值。
迭代和迭代器的區別:
迭代:
幾乎全部的python對象都是可迭代的,像str dict list tuple generator set……等都是可迭代的。
判斷一個對象是否可迭代:
>>> from collections import Iterable >>> isinstance([], Iterable) True
迭代器:
能夠被next()
函數調用並不斷返回下一個值的對象稱爲迭代器:Iterable
判斷一個對象是否爲迭代器對象:
>>> from collections import Iterator >>> isinstance((x for x in range(10)), Iterator) True >>> isinstance([], Iterator) False >>> isinstance({}, Iterator) False >>> isinstance('abc', Iterator) False
生成器就是一個迭代器對象,他能夠被next()函數調用。而像其餘類型的對象,例如list,dict……須要使用iter()函數將其轉換爲迭代器對象。
>>> isinstance(iter([]), Iterator) True >>> isinstance(iter('abc'), Iterator) True
本文參考了廖雪峯大神的python教程。詳細請閱讀:http://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000