yield關鍵字執行流程
注意:yield關鍵字的調用次數如果超過了任務執行次數會報錯,提示stopiteration異常,例如
正常范圍內的任務執行
# 定義一個任務(函數1)
def task1():for i in range(3):print(f'----task1 i = {i}----')# yield 關鍵字會造成當前函數稱為一個生成器對象# yield 會將當前任務函數掛起,不繼續向下執行,CPU不再回等待掛起結束的任務yield# 定義一個任務(函數2)
def task2():for i in range(3):print(f'----task2 i = {i}----')yieldif __name__ == '__main__':# 現在的程序只有一條主線程(IO并發操作)# 任務(函數)t1 = task1() # task1()不是調用函數,函數中只要有yield關鍵字,就變成了返回生成器對象t2 = task2()# <generator object task1 at 0x0000025C5A565A80># print(t1)# <generator object task2 at 0x0000025C5A567C40># print(t2)# 如果是一個生成器對象,函數如何執行?# yield關鍵字需要配合 next 內置函數實現調用next(t1)next(t2)# 第二次調用next(t1)next(t2)# 第三次調用next(t1)next(t2)# 第四次調用# next(t1)# next(t2)
執行結果
生成器取值的三種方式(next、循環+next、循環)
# 1,1,2,3,5,8,13,21,34...斐波那契數列,后面第三個數是前兩個數和# 生成器對象,使用了yield關鍵字,當前函數已經成為了生成器對象
def fibonacci(n):a,b = 1,1current_n = 0while current_n < n:yield aa, b = b, a + bcurrent_n += 1# 退出循環,已經完成了執行,讓函數返回一個結果# 最終生成器的返回結果是在發生異常的時候返回的return 'done'if __name__ == '__main__':v = fibonacci(5)print(v)print(next(v))print(next(v))print(next(v))print(next(v))print(next(v))# print(next(v)) StopIteration: doneprint('-' * 20)v2 = fibonacci(5)while True:try:g = next(v2)print(g)except StopIteration as e:print(e) # 這里的e就是生成器的一場結果break# 生成器對象就是一個可迭代對象print('-' * 20)for i in fibonacci(5):print(i)
執行結果