python Ai 應用開發基礎訓練,字串,字典,檔案,函式,裝飾品,生成器(下)

稷下元歌發表於2024-03-13

生成器的另一個示例,這個生成器功能是從大小生,生成斐波那契數列

def fib(max): # 定義一個函式fib,引數為max
    a, b = 0, 1 # 初始化兩個變數a和b,分別賦值為0和1
    n = 0 # 初始化計數變數n為0
    while b < max: # 當b小於max時繼續迴圈
        print(b) # 列印當前的斐波那契數列值b
        a, b = b, a + b # 更新a和b的值,使其依次向前推算斐波那契數列
        n += 1 # 計數變數n加1
    print('done') # 迴圈結束後列印'done'
    
fib(100) # 呼叫fib函式,設定max為100

  現在只需要在上面程式碼第五行,,print(b) 這一句改為 yield b 可以變為生成器生成 ,改變性存 # 使用yield關鍵字返回當前的斐波那契數列值,改成生成器後 在列印這個fib(100)時,只會返回結果,如果需要呼叫每一句值,就需要用到__next__()

python Ai 應用開發基礎訓練,字串,字典,檔案,函式,裝飾品,生成器(下)
def fib(max): # 定義一個生成器函式fib,引數為max
    a, b = 0, 1 # 初始化兩個變數a和b,分別賦值為0和1
    while b < max: # 當b小於max時繼續迴圈
        yield b # 使用yield關鍵字返回當前的斐波那契數列值b
        a, b = b, a + b # 更新a和b的值,使其依次向前推算斐波那契數列
    
    return 'done' # 迴圈結束後返回'done'

# 呼叫生成器函式並遍歷輸出結果
for num in fib(100): # 呼叫fib函式並傳入max為100
    print(num) # 列印每個斐波那契數列值
生成器完整示例
##呼叫生成器的元素
f = fib(100) print(f._next__())
##利用迴圈一次調取生成器的結果可以用for
for i in f:
  print(i)

但是利用for 列印不會列印迴圈後的語句,print(done)估記不線上程內,如果迴圈10次,調第十一次的時候內部有拋異常,只有抓住異常才會顯示如果要在生成器中列印出 "done" 語句,可以在生成器結束後迭代生成器物件。在迭代過程中,當生成器丟擲 StopIteration 異常時,我們可以捕獲該異常並在異常處理中新增列印 "done" 的操作。
def fib(max): # 定義一個生成器函式fib,引數為max
    a, b = 0, 1 # 初始化兩個變數a和b,分別賦值為0和1
    while b < max: # 當b小於max時繼續迴圈
        yield b # 使用yield關鍵字返回當前的斐波那契數列值b
        a, b = b, a + b # 更新a和b的值,使其依次向前推算斐波那契數列
    
    raise StopIteration('done') # 丟擲StopIteration異常,並附帶提示資訊 'done'

# 呼叫生成器函式並遍歷輸出結果
gen = fib(100) # 呼叫fib函式並傳入max為100
try:
    while True:
        num = next(gen) # 獲取生成器的下一個值
        print(num) # 列印每個斐波那契數列值
except StopIteration as e:
    print(e) # 列印異常中的提示資訊 'done'

  

相關文章