pyhon複習5 生成器 generator

2021-10-07 04:00:05 字數 2000 閱讀 8727

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

:print

(next

(obj)

)except exception as rev:

print

(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

print

(ret)

a,b = b, a+b

current_num +=

1if __name__ ==

"__main__"

: obj = main(20)

# 建立完乙個生成器物件

a =next

(obj)

# 呼叫生成器

print

(a) a = obj.send(

1000

)# send同樣是呼叫生成器,還可以傳遞引數 不要放到第一次呼叫

print

(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 來隨時終止生...