python核心 生成器

2021-09-26 15:15:39 字數 2132 閱讀 5143

生成器也是一種迭代器,但是它有迭代器的其他功能。那它有什麼特殊的功能呢?我們不妨舉個例子。

如果我們要產生乙個很大的列表,但是又不全拿出來,這時候列表所有資料都在記憶體中,大量資料的話將會非常耗記憶體。這時候如果列表元素按照某種演算法推算出來,我們需要時,就提出來,這樣就會省去大量的空間。

判斷生成器,也就是看生成器的標誌: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 語句的函式,就是生成器函式,呼叫後返...