個人理解的python中生成器與迭代器
阿新 • • 發佈:2018-11-27
概念
可迭代物件:在python中,列表,元組,字典,字串這些可以用for迴圈遍歷的物件稱為可迭代物件。
迭代器:我們建立一個容器,該容器中可以生成一些資料,這些資料可以遍歷,該容器被我們稱為迭代器。
生成器:生成器為迭代器的一種,使用yield返回函式,每次呼叫yield函式程式都會暫停,使用next()或send()函式恢復程式進行。
為什麼要建立迭代器:
通過列表等python一些內建資料函式生成,我們可以直接建立一個可遍歷物件,但是,受到記憶體限制,我們在建立一個很大的資料時,如果要把資料全部創建出來再進行操作,就會佔用很大的記憶體,這樣的設計方式是很不友好的,程式的使用效能也會大打折扣,因此,我們需要建立一個迭代器,讓我們需要哪個資料就建立哪個資料,不用一下子把資料全部創建出來,從而能節省大量空間。
建立迭代器的三種方式:
1 為容器物件新增__iter__()和__next__()方法,__iter__()返回迭代器物件本身,__next__()返回每次呼叫next()或迭代時的元素
舉例如下:
class Generator(): def __init__(self,start = 0,end = 0): self.start = start self.end = end def __iter__(self): print("建立一個迭代器") return self def __next__(self): print("呼叫next方法") if self.start < self.end: i = self.start self.start += 1 return i else: raise StopIteration() ex = Generator(1,10) for i in ex: print(i)
執行結果如下:
建立一個迭代器
呼叫next方法
1
呼叫next方法
2
呼叫next方法
3
呼叫next方法
4
呼叫next方法
5
呼叫next方法
6
呼叫next方法
7
呼叫next方法
8
呼叫next方法
9
呼叫next方法
2 使用內建函式iter()函式將可迭代物件轉換為迭代器
舉例如下
for i in iter(range(10)):
print(i)
3 生成器,使用yield函式建立一個迭代器,
斐波那契數列
def fib(max): n,a,b =0,0,1 while n < max: yield b a,b =b,a+b n = n+1 return 'done' a = fib(10) print(fib(10))