我們發現迭代器最核心的功能就是可以通過next()函式的呼叫來返回下乙個資料值。如果每次返回的資料值不是在乙個已有的資料集合中讀取的,而是通過程式按照一定的規律計算生成的,那麼也就意味著可以不用再依賴乙個已有的資料集合,也就是說不用再將所有要迭代的資料都一次性快取下來供後續依次讀取,這樣可以節省大量的儲存(記憶體)空間。
數學中有個著名的斐波拉契數列(fibonacci),數列中第乙個數為0,第二個數為1,其後的每乙個數都可由前兩個數相加得到,具體如下:
0, 1, 1, 2, 3, 5, 8, 13, 21, 34, ...
現在我們想要通過for...in...迴圈來遍歷迭代斐波那契數列中的前n個數。那麼這個斐波那契數列我們就可以用迭代器來實現,每次迭代都通過數學計算來生成下乙個數。
# 定義迭代器classfibonacci(object):
# num:表示生成fibonacci數列的個數
def__init__(self
, num):
self.num = num
# 儲存前兩個值
self.a = 0
self.b = 1
# 記錄生成數列的下標
self.current_index = 0
def__iter__(self):
returnself
# 生成下乙個資料
def__next__(self):
ifself.current_index < self.num:
result = self.a
self.a,
self.b = self.b,
self.a + self.b
self.current_index += 1
returnresult
else:
raisestopiteration
# 建立迭代器
fib = fibonacci(5)
# # 獲取迭代器中下乙個值
# result = next(fib)
# print(result)
# 直接遍歷迭代器
forvalueinfib:
print(value)
執行結果:
011當然如果你了解到了yield的工作原理了,我們就可以用特殊的迭代器,也就是生成器來完成這個看似複雜的斐波那契的迭代了23
可以使用next()函式讓生成器從斷點處繼續執行,即喚醒生成器(函式)
python3中的生成器可以使用return返回最終執行的返回值,而python2中的生成器不允許使用return返回乙個返回值(即可以使用return從生成器中退出,但return後不能有任何表示式)。
# 建立生成器的第二種方式->在def裡面看到yield關鍵字表示就是乙個生成器執行結果如下:# 定義生成器
deffibonacci(num):
# num: 表示斐波那契數列的個數
# 儲存前兩個值
a = 0
b = 1
# 記錄生成數列的下標
current_index = 0
print("----11----")
# 迴圈判斷條件是否成立
whilecurrent_index < num:
# 生成下乙個斐波那契數列
result = a
a, b = b, a + b
current_index += 1
print("----22----")
# **執行到yield會暫停,把結果返回出取,再次啟動生成器的時候會在暫停的位置繼續往下執行
yieldresult
print("----33----")
f = fibonacci(5)
# value = next(f)
# print(value)
## value = next(f)
# print(value)
forvalueinf:
print(value)
----11----在使用生成器實現的方式中,我們將原本在迭代器----22----0ok
----33----
----22----
1
__next__
方法中實現的基本邏輯放到乙個函式中來實現,但是將每次迭代返回數值的return換成了yield,此時新定義的函式便不再是函式,而是乙個
生成器了。
簡單來說:只要在def中有yield關鍵字的 就稱為 生成器
Python 迭代器 生成器
可以直接作用於for迴圈的物件,統稱為可迭代物件 iterable。iterator物件表示的是乙個資料流,iterator物件可以被next 函式呼叫並不斷返回下乙個資料,直到沒有資料時丟擲stopiteration錯誤。可以把這個資料流看做是乙個有序序列,但我們卻不能提前知道序列的長度,只能不斷...
python 迭代器,生成器
什麼事迭代 可直接用作與for迴圈的物件統稱為可迭代物件 可以被next 函式呼叫,並不斷返回下乙個值的物件稱為迭代器,所有的iterable均可以通過內建函式iter 來轉變為iterator。對於迭代器來講,有乙個next 就夠了。在你使用for和in語句時,程式就會自動呼叫即將被處理的物件的可...
python 迭代器 生成器
知識背景 1 呼叫乙個普通的python函式時,一般是從函式的第一行 開始執行,結束於return語句 異常或者函式結束 可以看作隱式的返回none 2 一旦函式將控制權交還給呼叫者,就意味著全部結束。函式中做的所有工作以及儲存在區域性變數中的資料都將丟失 3 再次呼叫這個函式時,一切都將從頭建立。...