python容器迭代器生成器
阿新 • • 發佈:2020-12-30
title: python之容器迭代器生成器
data: 2018-4-7
categories:
- python
tags: - python
放張圖片
容器(container)
容器是用來儲存元素的一種資料結構,容器將所有資料儲存在記憶體中,Python中典型的容器有:list,set,dict,str等等。
class test(): def __init__(self,data=1): self.data = data def __iter__(self): return self def __next__(self): if self.data > 5: raise StopIteration else: self.data+=1 return self.data for item in test(3): print(item)
4
5
6
1234
for … in… 這個語句其實做了兩件事。第一件事是獲得一個可迭代器,即呼叫了__iter__()函式。
第二件事是迴圈的過程,迴圈呼叫__next__()函式。
對於test這個類來說,它定義了__iter__和__next__函式,所以是一個可迭代的類,也可以說是一個可迭代的物件(Python中一切皆物件)。
迭代器
含有__next__()函式的物件都是一個迭代器,所以test也可以說是一個迭代器。如果去掉__itet__()函式,test這個類也不會報錯。如下程式碼所示:
class test(): def __init__(self,data=1): self.data = data def __next__(self): if self.data > 5: raise StopIteration else: self.data+=1 return self.data t = test(3) for i in range(3): print(t.__next__())
4
5
6
1234
生成器
生成器是一種特殊的迭代器。當呼叫fib()函式時,生成器例項化並返回,這時並不會執行任何程式碼,生成器處於空閒狀態,注意這裡prev, curr = 0, 1並未執行。然後這個生成器被包含在list()中,list會根據傳進來的引數生成一個列表,所以它對fib()物件(一切皆物件,函式也是物件)呼叫__next()__
方法,
def fib(end = 1000): prev,curr=0,1 while curr < end: yield curr prev,curr=curr,curr+prev print(list(fib()))
[1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987]