在python中,這種一邊迴圈一邊計算的機制,稱為生成器:
結論: 生成器本質是乙個函式,不同於函式的是它生成的是乙個物件,不執行函式內的**
列表生成器:列表是直接生成數字在記憶體,可以隨時呼叫
元組顯示的型別是生成器,只儲存在記憶體中,但是只有在呼叫的時候生成
1. c = (x for x in range(10)), 利用 ()來生成利用()生成2. 利用yield()方法
c = (x for x in range(10))利用yield建立:如果乙個函式定義中包含yield關鍵字,那麼這個函式就不再是乙個普通函式,而是乙個generator# print(c.next) 在py2中的方法
print(c.__next__()) # 輸出0,__next__()是乙個私有方法,不建議用
print(next(c)) # 輸出1, 利用next內建函式迭代輸出,當輸出到最有乙個元素的時候,就不會輸出資料
for i in c: # for呼叫c裡面的next去迭代輸出,節約記憶體空間
print(i, end='\t') # 2 3 4 5 6 7 8 9 ,因為前面輸出了0,1,所以指標指向了下一位,所以從2開始
最難理解的就是generator和函式的執行流程不一樣。函式是順序執行,遇到return語句或者最後一行函式語句就返回。而變成generator的函式,在每次呼叫next()的時候執行,遇到yield語句返回,再次執行時從上次返回的yield語句處繼續執行。
def fun():生成器的send()方法:使用之前必須先進入到生成器裡面,然後利用send()賦值給上次返回處print('ok')
yield 1 # 有yield關鍵字,代表fun()非函式,是乙個生成器
# 此時作為return 直接結束了函式
g = fun() # 此時的fun()是乙個生成器物件,而非函式
print(g) # a = next(g)
print('a', a) # 接收了傳遞回來的值1
# next(g) # ok, 當遇到yield1的時候,可以認為是return 1,結束了函式的執行,g釋放,所以後面的print在執行會報錯
print(next(g)) # print()裡面是乙個可迭代物件,yield 1返回乙個1被print捕捉到,所以 迭代輸出 ok 和 1
def fun():print('ok1')
count = yield 1
print(count)
yield 2
b = fun()
b.send(none) # 等價於 next(b),開始進入到函式, 直到遇到了yield 1後返回到此處,執行後面的b.send('hello world')
tt = b.send('hello world') # 進入到退出的yield 1的位置,將'hello world'賦值給count進行列印,遇到yield 2後返回結果到此處
print(tt) # 將yield 2的結果賦給tt, 然後進行列印
還可通過yield實現在單執行緒的情況下實現併發運算的效果
import time利用生成器實現斐波那契def consumer(name):
print("%s 準備吃包子啦!" %name)
while true:
baozi = yield
print("包子[%s]來了,被[%s]吃了!" %(baozi,name))
def producer(name):
c = consumer('a')
c2 = consumer('b')
c.__next__()
c2.__next__()
print("老子開始準備做包子啦!")
for i in range(10):
time.sleep(1)
print("做了2個包子!")
c.send(i)
c2.send(i)
producer("ftl1012")
def fib(max):【學習參考】n, b, a = 0, 0, 1
while n <= max:
# print(b, end='\t')
yield b # 等價於 print(b),將我們需要的結果先存放起來
b, a = a, b+a # 賦值是同時執行的
n += 1
gen = fib(6)
print(next(gen))
print(next(gen))
print(next(gen))
print(next(gen))
【學習參考】
Python學習筆記 生成器
有時候乙個列表裡的元素過多,多到計算機記憶體存不下來,我們就需要想乙個辦法解決這個問題,如果能在需要的時候生成新元素就好了,可以用生成器。生成器 一種邊迴圈邊根據某種演算法計算生成元素的機制 如何建立乙個生成器呢,最簡單的方法通過修改一下列表生成器建立。n n for n in range 10 d...
Python生成器學習筆記
生成器在python中首先是乙個物件,用於建立python序列。使用生成器可以迭代龐大的序列,且不需要在記憶體中建立和儲存整個序列。通常,生成器是為迭代器產生資料的。典型的使用用例是range 函式。每次迭代生成器時,生成器會記住上一次呼叫的內容,並且返回下乙個值。生成器函式和普通函式類似,但是它的...
今日學習 python生成器
學習python的生成器 generator 生成器是返回1個迭代器的函式。總結 發現乙個方法,先抄寫一遍,再默寫1遍,2遍,3遍.每次默寫的過程中發現對各函式,語法的理解更深入了,3遍之後基本就能有條理的寫出 後續都按照這個方法學習。steps python git deep ai def my ...