在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 此時生成乙個生...