容器(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
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
生成器
生成器是一種特殊的迭代器。當調用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]