1. 程式人生 > >個人理解的python中生成器與迭代器

個人理解的python中生成器與迭代器

概念

可迭代物件:在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))