1.生成器:利用迭代器:我們可以在每次迭代獲取資料(通過next()方法)時按照特定的規律進行生成
但是我們在實現乙個迭代器,關於當前迭代到的狀態需要我們自己記錄,進而才能根據當前狀態生成下乙個資料
為了達到記錄當前狀態,並配合next()函式進行迭代使用,我們可以採用更簡便的語法,即生成器是一類特殊的迭代器
最簡單的生成器建立:
num = [i for i in range(100)] # 普通的列表推導式,返回乙個列表
num = (i for i in range(100)) # 生成器,返回的是資料的生產方式
將函式變成生成器:yield next()啟動生成器
使用next()send()都可以啟動生成器:send(「das」)啟動可以傳遞引數
迭代器特點利用極少的空間生產你想要的資料的方式
生成器特點,可以讓yield讓函式暫停執行,下一次繼續執行
def
main
(all_num)
: a, b =0,
1 current_num =
0while current_num# 使用yield會讓**停留在這裡把a返回給下面的i然後列印,然後在就來,這次進來不是從開頭執行
# 而是繼續往下走然後走到yield這裡然後停住返回(暫停而不是結束,return則 是結束)
yield a # 如果乙個函式中有yield語句,那麼這個就不再是函式,而是乙個生成器
a,b = b, a+b
current_num +=
1return
"ok..."
# 如果在呼叫main的時候,發現這個函式中有yield那麼此時不會呼叫函式,而是建立生成器物件(和類物件類似)
if __name__ ==
"__main__"
: obj = main(20)
# for i in obj: # 使用for會先判斷obj是否是可迭代物件,(因為生成器是特殊的迭代器所以滿足)
# print(i)
while
true
:try
(next
(obj)
)except exception as rev:
(rev.value)
# 獲取return返回的值,上面while結束才會執行return,又因為while結束會出現異常所以在rev裡面的value屬性獲取
break
def
main
(all_num)
: a, b =0,
1 current_num =
0while current_num# 執行流程:
# **從上到下執行,執行到ret = yield a
# 先執行右邊的yield a 暫停,然後把a的值返回出去
# 此時列印a的值
# obj.send() 呼叫生成器,此時**在12行繼續執行他的下一條**,他的下一條也就是ret = yield a
# 因為你呼叫了send方法此時yield a的值就是你send方法傳遞過來的引數
ret =
yield a
(ret)
a,b = b, a+b
current_num +=
1if __name__ ==
"__main__"
: obj = main(20)
# 建立完乙個生成器物件
a =next
(obj)
# 呼叫生成器
(a) a = obj.send(
1000
)# send同樣是呼叫生成器,還可以傳遞引數 不要放到第一次呼叫
(a)# a = next(obj) # 呼叫生成器
# print(a)
python3生成器 Python3 生成器
python3 生成器 閱讀 125 發布於 2020 05 19 14 29 25 在python中,一邊迴圈一邊計算出元素的機制,稱為生成器 generator。生成器的優點 一次返回乙個結果,延遲計算。這對於大資料量處理,是個非常有用的優勢。占用記憶體量是工程師必須考慮的乙個問題。提高 可讀性...
Python(九)生成器
該系列文章用來記錄一下自己在b站學習python時,進行上機練習用的 使用 pycharm 2020.3.3 慕課 python語言基礎與應用 北京大學 陳斌 字幕校對 編寫程式,輸入兩個數,輸出它們的商,採用例外處理來處理兩種錯誤,給出使用者友好的提示資訊 1 除數為0 2 輸入了非數值 try ...
Python筆記003 生成器和生成器表示式
以下是我學習 流暢的python 後的個人筆記,現在拿出來和大家共享,希望能幫到各位python學習者。生成器使用yield做關鍵字,一次只返回乙個值給呼叫者,然後暫停執行,其作用是 節省記憶體空間。生成器可以用next 函式,也可以用for迭代的方式獲取元素值,中間還可以用close 來隨時終止生...