Python生成器generator用法示例

2022-10-04 19:06:13 字數 2440 閱讀 2474

l = [x * 2 for x in range(10)] # 列表生成式

g = (x * 2 for x in range(10))

print(l,g) # l列印的是乙個列表,g則是乙個generator的記憶體位址

一次性列印獲取generator的所有元素:

for index in g:

print(index)

逐步獲取generator的元素:

print(g.__next__()) # 0

print(g.__next__()) # 2

print(g.__next__()) # 4

print(g.__next__()) # 6

print(g.__next__()) # 8

yield關鍵字

通常我們做乙個列印0-50的數時,會定義乙個函式,只要呼叫這個函式,它就會自定列印0-50的數

def fib(num):

n = 0

while n < num:

print(n)

n+=1

fib(50)

其實我們只需要改動那麼一丟丟,就可以將上面那個函式改變成乙個generator

def fib(num):

n = 0

while n < num:

yield n # 在使用yield關鍵字時,需在前面先定義乙個變數n

n+=1

g = fib(50) # 此時的g是乙個generator

generator原理:通過某一種特定的演算法,在乙個特定的條件下,不斷向下推算,得出後續的元素。因為generator不必建立list,所以可以大大的節約記憶體空間。舉個栗子:

def fib():

print("step 1")

yield 1

print("step 2")

yield 2

print("step 3")

yield 3

g = fib()

g.__next__() # 結果:step 1

g.__next__() # 結果:step 2

g.__next_程式設計客棧_() # 結果:step 3

根據結果可以看出,每次執行next(),都會列印一句,而遇到yield就直接跳出,並記錄位置,再次執行next()時,會從記錄的那個位置開始往下執行,再次遇到yield時跳出。

此時我們不經會想,如果我們不斷的呼叫next(),該如何判斷是否已經完畢,如果越界了,是否會報錯?

# -* coding:utf-8 -*-

#! python3

'''created on 2023年8月10日

@author: administrator

'''def fib(num):

n = 0

while n < num :

yield n

n+=1

g = fib(10)

while true:

print(g.__next__())

執行結果:

可以看出當遍歷完畢之後,如果在此呼叫next()將會報錯,我們是無法獲取到遍歷的下標程式設計客棧的,那麼我們該如何規避這個錯誤呢?對next()拋異常處理

def fib(num):

n = 0

while n < num :

yield n

n+=1

g = iqmxxhfib(10)

while true:

try:

print(g.__next__())

except stopiteration:

print("已經完畢")

break

此時將不再報錯,當越界的時候,系統會自動捕捉該異常,並且列印你想要輸出的資訊

send方法

在單執行緒下實現乙個簡單的並行效果

# -*- coding:utf-8 -*-

#! python3

'''created on 2023年8月10日

@author: administrator

'''import time

def starteat(name):

print("%s準備開始吃包子了"%name)

while true:

b = yield

print("%s被%s吃了"%(b,name))

def startmake():

laowang = starteat("laowang")

laowang.__next__()

for index in range(10):

time.sleep(1)

print("已經做好了包子%d號"%index)

laowang.send("包子%d號"%index)

start程式設計客棧make()

執行結果:

python3學習筆記 生成器generator

跟著廖大學python3一段日子了,這裡簡單了解下生成器generator,主要是yield的返回值和send的傳參,記錄下。generator 函式 yield 簡單說,就是乙個函式,裡面用到了關鍵字yield,就成為了乙個生成器 生成器和函式的不同主要在於 每次執行,會暫時中斷在yield關鍵字...

python 生成器作用 Python生成器

生成器介紹 在函式內部包含yield關鍵字,那麼該函式執行的結果是生成器,生成器就是迭代器。生成器的功能 把函式結果做成迭代器 以一種優雅的方式封裝好iter,next 提供了一種自己定義迭代器的方式。使用生成器建立乙個迭代器 def a print a yield 11 使用yield,執行後返回...

python生成器好處 Python生成器筆記

python中三大器有迭代器,生成器,裝飾器,本文主要講述生成器。主要從生成器的概念,本質,以及yield關鍵字的使用執行過程。本質 生成器是一類特殊的迭代器,使用了yield關鍵字的函式不再是函式,而是生成器。使用了yield的函式就是生成器 1.yield關鍵字有兩點作用 1.1 yield語句...