生成器函式

2022-07-01 02:54:07 字數 2120 閱讀 6464

在python中,一邊迴圈一邊計算的機制,稱為生成器

當乙個列表中有很多元素,但是我們只需要前面幾個元素時,後面的絕大多數元素占用的空間就白白浪費了,這樣非常消耗記憶體

簡單來說:當我們需要得到龐大的資料時,又想它占用的記憶體空間少,這時就需要生成器

生成器是由函式+yield關鍵字創造出來的寫法,在特定的情況下,它可以用來幫我們節省記憶體空間

--生成器函式,當函式中存在yield時,該函式就是乙個生成器函式

例如:def func():

pring(11)

yield 1

1.生成器物件:在執行乙個生成器函式時,會返回乙個生成器物件

def func():

print(11)

yield 1

pring(22)

yield 2

data = func()

print(data)  # 輸出:

注意:當執行生成器函式時,函式裡面的**是不會執行的,這時會返回乙個生成器物件

2.當需要執行函式裡面的內容時需要使用next(執行的函式),當函式執行過程中遇到yield時就不往下執行了,記錄這次執行的位置,下次執行時繼續向下執行

def func():

print(11)

yield 1

pring(22)

yield 2

data = func()

# next(data)  # 這時會輸出:11  當v1 = next(data)  

v1 =next(data)  

print(v1)  # 這時會輸出:11,1;

注意:當遇到next()時,會執行yield之前的函式,當執行v1 = next()時,會執行yield,如果當程式中遇到return時,會報錯stopiteration 錯誤

3.生成器函式一般不會向上面那樣單獨執行,一般是進行for迴圈中使用,即解決了報錯的問題

def func():

print(11)

yield 1

pring(22)

yield 2

data = func()

for i in data:

print(i)

生成器特點:記錄在函式中的執行位置,當下次執行next()時,會從上次的位置基礎上在繼續往下執行

當以後需要我們在記憶體中建立很多資料時,可以想著用基於生成器來實現一點一點生成(用一點生產一點),以節省記憶體的開銷

擴充套件知識:

def func():

print(111)

v1 = yield 1

print(v1) # send所傳遞的值其實就是給 =號左邊的左值賦值

print(222)

v2 = yield 2

print(v2)

print(333)

v3 = yield 3

print(v3)

print(444)

data = func() # 執行生成器函式,返回乙個生成器物件

n1 = data.send(none) # 執行到第乙個yield(也是啟動生成器),這時會輸出:111

print(n1) # 或得第乙個yield的返回值,返回值為1,這時會輸出:1

n2 = data.send(6) # 執行到第二個yield,輸出print(v1)和print(222),print(v1)即為send(6)給v1 = yield 1左邊進行賦值,即v1=6

print(n2) # 或得第二個vield的返回值,返回值為2,這時會輸出:2

n3 = data.send(777)

print(n3)

n4 = data.send(888)

print(n4)

解釋以上**:

為什麼需要send(none),也很好理解,因為 生成器還沒有走到第乙個yield語句,如果我們發生乙個真實的值,這時是沒有人去「接收」它的。

一旦生成器啟動了,就物件接受(即=號左邊的左值xx接受了),之後就可以使用send(params)不斷傳入值了

▲注意,每次的send()都會執行到yield語句,但賦值不會執行,只會有返回值,相當於return後就退出函式了,所以在返回值之後的賦值就不會執行了

python生成器函式 Python 生成器函式

一 生成器 生成器指的是生成器物件,可由生成器表示式得到,也可使用 yield 關鍵字得到乙個生成器函式,呼叫這個函式得到乙個生成器物件 生成器物件,是乙個可迭代物件,是乙個迭代器 生成器物件,是延遲計算 惰性求值的 1.1 生成器函式 函式體重包含 yield 語句的函式,就是生成器函式,呼叫後返...

生成器函式

pyhon優雅的魔力使生成器函式很特殊,它們像定格相機一樣工作。當乙個標準函式遇到return語句時,它會返回值,然後函式會丟棄內部的所有資料。當下次呼叫時,一切從頭開始。yield語句會做不同的事情。它像return一樣返回乙個值,但是它不會使函式丟棄資料,相反所有資料都被儲存起來。usr bin...

生成器函式

什麼是生成器 生成器是能夠動態提供資料的物件,生成器物件也是可迭代物件 例項 生成器有兩種 生成器函式 生成器表示式 生成器函式的呼叫將返回乙個生成器的物件,生成器物件是乙個可迭代物件 defmyyield 此函式為生成器函式 yield 2yield 3yield 5yield 7 此時生成乙個生...