生成器也是一種迭代器,但是它有迭代器的其他功能。那它有什麼特殊的功能呢?我們不妨舉個例子。
如果我們要產生乙個很大的列表,但是又不全拿出來,這時候列表所有資料都在記憶體中,大量資料的話將會非常耗記憶體。這時候如果列表元素按照某種演算法推算出來,我們需要時,就提出來,這樣就會省去大量的空間。
判斷生成器,也就是看生成器的標誌:yield 。 有了它就就變成了生成器
我們來舉個例子看一下。
# 生成器
def num(): # 斐波那契數列
a, b = 0,1
for i in range(5):
yield b
a,b = b,a+b
print(num) # 在這裡顯示是函式
c = num()
print(type(c)) # 在這裡顯示的就是生成器了
輸出結果:generator'>
乙個是函式,乙個是生成器。當把函式賦給乙個值的時候,它就成為了生成器。
b = (x*2 for x in range(10))
print(type(b))
這種方法是根據列表推導式來產生的生成器。因為已經是生成器了,所以就可以用 next(b)的方法來執行,獲取其中第乙個元素。
也可以用for迴圈來取出其中的元素。
b = (x*2 for x in range(10))
for num in b:
print(num)
輸出結果:0 2 4 6 8 10 12 14 16 18
def num(): # 斐波那契數列
a, b = 0,1
for i in range(5):
yield b
a,b = b,a+b
c = num()
next(c)
for i in c:
print(i)
用生成器寫乙個斐波那契數列。輸出結果是:輸出乙個值,不斷使用next(c)方法,直到輸出5再next(c),會報出stopiteration錯誤。如果想要不報錯的,那就使用for迴圈,這樣就不會出錯。就是我上面注釋掉的。
列表推到式屬於生成器
舉個例子:
a = [x for x in range(10)]
print(a)
結果:[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
再拿這個例子公升級一下:
a = [x**2 for x in range(10)]
print(a)
結果:[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
解釋:
說明前面x是後面那個x的結果,我們同時也可以對後面的數進行操作
高階例子:
vec = [(1,2,3), (4,5,6), (7,8,9)]
a = [x for list in vec for x in list]
print(a)
結果:[1, 2, 3, 4, 5, 6, 7, 8, 9]
解釋:
for迴圈後面還可以新增for迴圈,同時裡面的可以是元組、列表。
再高階例子:
print([x for x in range(1,8) if x%2 == 0])
結果:[2, 4, 6]
解釋:說明還可以對for迴圈得到的子專案進行判斷以及其他操作
關於生成器我自己覺得我還理解的不夠,這篇文章我還是會補充的,希望到時候能夠有了更深的理解。
python 生成器作用 Python生成器
生成器介紹 在函式內部包含yield關鍵字,那麼該函式執行的結果是生成器,生成器就是迭代器。生成器的功能 把函式結果做成迭代器 以一種優雅的方式封裝好iter,next 提供了一種自己定義迭代器的方式。使用生成器建立乙個迭代器 def a print a yield 11 使用yield,執行後返回...
python生成器好處 Python生成器筆記
python中三大器有迭代器,生成器,裝飾器,本文主要講述生成器。主要從生成器的概念,本質,以及yield關鍵字的使用執行過程。本質 生成器是一類特殊的迭代器,使用了yield關鍵字的函式不再是函式,而是生成器。使用了yield的函式就是生成器 1.yield關鍵字有兩點作用 1.1 yield語句...
python生成器函式 Python 生成器函式
一 生成器 生成器指的是生成器物件,可由生成器表示式得到,也可使用 yield 關鍵字得到乙個生成器函式,呼叫這個函式得到乙個生成器物件 生成器物件,是乙個可迭代物件,是乙個迭代器 生成器物件,是延遲計算 惰性求值的 1.1 生成器函式 函式體重包含 yield 語句的函式,就是生成器函式,呼叫後返...