通過列表表示式可以直接生成列表,不過列表一旦生成就需要為所有元素分配記憶體,有時候會很消耗資源。
所以,如果列表元素可以按照某種演算法推算出來,這樣就不必建立完整的list,從而節省大量的記憶體空間。
在python中,這種一邊迴圈一邊計算的機制,稱為生成器(generator)。
法一:test = range(10)
type(test)
#法二:
test = [item for item in range(10)]
type(test)
#
test = (item for item in range(10))type(test)
#
生成器是乙個可以自動推導後續元素的物件,為了得到其元素,我們可以直接通過 next() 方法:
test = (item for item in range(10))type(test)
test.next()
test.next()
test.next()##
0#1#
2
另外一種方式是用 for 可以直接迭代生成器的所有元素:
test = (item for item in range(10))type(test)
for item in
test:
item##
0#1#
2#3#
4#5#
6#7#
8#9
test = (item for item in range(10))type(test)
test.next()
test.next()
#至此,生成器中只還有8個元素
for index, item in
enumerate(test):
print index, '='
, item##
0#1#
0 = 2
#1 = 3
#2 = 4
#3 = 5
#4 = 6
#5 = 7
#6 = 8
#7 = 9
如果函式中包含 yield ,那麼該函式就變成了乙個生成器。
函式型別的生成器的特點是:在每次呼叫 next() 的時候執行,遇到 yield 語句就完成乙個元素的推導並返回,再次執行 next() 時從上次返回的 yield 語句處繼續向後執行:
def func(): deffunc():
'one
'one
'yield 1 yield 1
'two
'two
'yield 2 yield 2
'three
'three
'yield 3 yield 3test = func() test =func()
test.next() test.next()
test.next() test.next()
for item in test: for item in
test:
item item
#one # one
#two # two
#three # three
#3 # 此時並沒有列印生成器的最後乙個元素值
用生成器產生斐波拉契數列(fibonacci),除第乙個和第二個數外,任意乙個數都可由前兩個數相加得到:
直接列印元素:
deffunc(max):
before =0
after = 1
while after print
before
before, after = after, before +after
func(10)#0
#1#1
#2#3
#5
使用列表儲存結果:
deffunc(max):
list =
before =0
after = 1
while after before, after = after, before +after
return
list
my_list = func(10)
my_list
#[0, 1, 1, 2, 3, 5]
使用生成器:
deffunc(max):
before =0
after = 1
while after yield
before
before, after = after, before +after
test = func(10)
test
for item in
test:
item##
0#1#
1#2#
3#5
Python學習筆記 生成器(Generator)
python學習筆記 生成器 generator 擁有迭代序列的一致方式,比如列表裡的物件或檔案裡的行,是python的一項重要特性。這是通過迭代器協議的方式來完成的,一種生成可迭代物件的通用方式。例如,迭代乙個字典會生成字典鍵構成的集合。當我們書寫for key in mydict語句時,pyth...
Python基礎 Python語法基礎
關鍵字是python語言的關鍵組成部分,不可隨便作為其他物件的識別符號 andas assert break class continue defdel elif else except exec finally forfrom global ifimport inis lambda notor p...
Python程式設計基礎之Python基礎
1.只能是乙個詞 2.包含字母,數字和下劃線 3.不能以數字開頭 this program syas hello and asks for your name print hello world1 print what is your name?ask for their name myname i...