1.迭代器(Iterator): 可以被next()函數調用並不斷返回下一個值的對象,成為迭代器:Iterator 可以直接用於for 迴圈的對象統稱為可迭代對象:Iterable 迭代,顧名思義就是重覆做一些事很多次(就現在迴圈中做的那樣)。迭代器是實現了__next__()方法的對象(這個方法在 ...
1.迭代器(Iterator):
可以被next()函數調用並不斷返回下一個值的對象,成為迭代器:Iterator
可以直接用於for 迴圈的對象統稱為可迭代對象:Iterable
迭代,顧名思義就是重覆做一些事很多次(就現在迴圈中做的那樣)。迭代器是實現了__next__()方法的對象(這個方法在調用時不需要任何參數),它是訪問可迭代序列的一種方式,通常其從序列的第一個元素開始訪問,直到所有的元素都被訪問才結束。但是迭代器只能前進不能後退
優點:
使用迭代器不要求事先準備好整個迭代過程中的所有元素。迭代器僅僅在迭代到某個元素時才計算該元素,而在這之前或之後元素可以不存在或者被銷毀。因此迭代器適合遍歷一些數量巨大甚至無限的序列。
2.生成器:
只有調用時才會生成相應的數據,且只有一個__next__()方法
如果列表元素可以按照某種演算法推算出來,那我們是否可以在迴圈的過程中不斷推算出後續的元素呢?這樣就不必創建完整的list,從而節省大量的空間。在Python中,這種一邊迴圈一邊計算的機制,稱為生成器(Generator)。
創建方法:
1)最簡單的是把一個列表生成式的[]改成(),就創建了一個generator
2)可以把函數變成generator object,只需要把print()改為yield 即可。
3.
yeild 作用:保存當前狀態並返回
send()作用:喚醒並傳遞一個值
__next__()作用:只是喚醒
4.
生成器都是Iterator對象,但是list、低產田、str雖然是Iterable,卻不是Iterator,把list、dict、str等Iterable變成Iterator可以使用iter()函數。
5.通過yield將斐波那契函數變成生成器
1 def fib(max): 2 n,a,b = 0,0,1 3 while n < max: 4 yield b #將函數變成生成器 5 a,b = b,a+b 6 n += 1 7 return 'lalalalal' 8 9 f = fib(10) 10 11 while True: 12 try13 x = next(f) #相當於執行一次函數fib() 14 print(x) 15 except StopIteration as e: 16 print('Generator return value is %s '%e.value) #e的value是函數返回值如fib函數的返回值'lalalalal' 17 break