1 生成器:
為什麼要有生成器?
就拿列表來說吧,假如我們要建立乙個list,這個list要求格式為:[1,4,9,16,25,36……]這麼一直持續下去,直到有了一萬個元素的時候為止。如果我們要建立這個list,那麼應該是這樣的:
[i*i for i in range(1,10001)] #這樣的話,這個list會占用極多的記憶體,如果我們能只將演算法儲存在list中,那麼這個list所佔的記憶體會大大減小,等我們需要用到list的值的時候,這個list會自動執行其中的演算法,將第乙個值輸出,再次執行時,就會自動輸出第二個值,以此類推…… 這個特殊的list就被我們稱之為生成器(generator)。列表生成式,不要忘了
#結果就不列出來了
如何建立生成器?
建立生成器有很多方法:
1 第一種方法:
#2第二種方法:將list生成式中的『[』換為『(』
>>> (i*i for i in range(1,10001))
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
"", line 1, in
stopiteration
#實際上,我們不推薦用next()函式,較為常用的是用for迴圈,實際上for迴圈的本質就是呼叫了next()函式。即:首先通過iter()將可迭代的資料轉換為可迭代物件,然後呼叫next()
g=(i for i in range(1,11))
for i in
g:
(i)#
結果為:12
3456
78910
#這樣當沒有值可供返回的時候就會退出迴圈並不會報錯。
這種方法用在函式中,比如說用函式實現楊輝三角:
1個人實現該函式的**:1 1
1 2 1
1 3 3 1
1 4 6 4 1
1 5 10 10 5 1
1……………………………………………………………1
def這裡有乙個yield關鍵字!,yield就是定義generator的關鍵字,yield類似於return,當函式執行到這裡就會結束,但不同的是,當下次繼續執行該函式時,就會從yield下方開始,也就是接續上次執行的地方繼續執行。yh():
l=[1]
n=[1]
while
true:
yield
n #這裡有乙個yield關鍵字!,yield就是定義generator的關鍵字,yield類似於return,
#當函式執行到這裡就會結束,但不同的是,當下次繼續執行該函式時,就會從yield下方開始,也就是接續上次執行的地方繼續執行。
n=copy.copy(l) #
注意這裡為什麼要用copy功能!!!!
for i in
range(len(l)):
n[i]=l[i]+l[i-1]
l=nimport
copy
n=0for i in
yh():
if n==10:
break
(i) n=n+1
另外摘抄了乙個比較短小精悍的**:
def2 迭代器yh():
n = [1]
while
true:
yield
n n = [n[i-1] + n[i] for i in
range(len(n))]
…………
…………
迭代器有什麼用途?
生成器儲存了演算法,而迭代器則負責一次輸出乙個該演算法的結果。迭代器類似於生成器(事實上,並不僅僅只是生成器)與迴圈的結合,只不過這個迴圈「很懶」,一次只輸出乙個值。
迭代和迭代器的區別:
迭代:
幾乎所有的python物件都是可迭代的,像str dict list tuple generator set……等都是可迭代的。
判斷乙個物件是否可迭代:
>>> from collections import迭代器:iterable
>>>isinstance(, iterable)
true
可以被next()
函式呼叫並不斷返回下乙個值的物件稱為迭代器:iterable
判斷乙個物件是否為迭代器物件:
>>> from collections import生成器就是乙個迭代器物件,他可以被next()函式呼叫。而像其他型別的物件,例如list,dict……需要使用iter()函式將其轉換為迭代器物件。iterator
>>> isinstance((x for x in range(10)), iterator)
true
>>>isinstance(, iterator)
false
>>>isinstance({}, iterator)
false
>>> isinstance('
abc'
, iterator)
false
>>>isinstance(iter(), iterator)本文參考了廖雪峰大神的python教程。true
>>> isinstance(iter('
abc'
), iterator)
true
Python之生成器 迭代器
利用 建立generator a x x for x in range 10 列表生成式 a 0,1,4,9,16,25,36,49,64,81 b x x for x in range 10 用 建立乙個generator b at 0x7f62455db258 next b 利用 next 呼叫...
python之迭代器 生成器
迭代器 迭代器是訪問集合元素的一種方式。迭代器物件從集合的第乙個元素開始訪問,直到所有的元素被訪問完結束。迭代器提供了統一的訪問集合的介面,只要定義 iter 方法物件,就可以使用迭代器訪問。迭代器有兩個基本的方法 iter 方法 返回迭代器物件本身 按我自己比較土的理解方法就是,每呼叫一次iter...
Python之生成器 迭代器
生成器類似返回值為陣列的乙個函式,這個函式可以接受引數,可被呼叫,但只能產生乙個值,所以大大節省記憶體。生成器表示式的語法非常簡單,只需要將列表推導式的中括號改成小括號就可以了 1 x x for x in range 10 if x 2 0 會列印出整個列表 0,4,8,12,16 1 x x f...