方法一: iter和next
for語句調用 iter()
, iter()
返回 __next__()
方法。返回所有的之后,引發 StopIteration
異常來終止。
於是可以自己寫一個 __iter__()
函數,返回 self
, 寫一個 __next__()
方法,每次返回下一個值,直到結束。
實例
class Student():
def __init__(self,name,age):
self.stu_list={}
self.add_stu(name,age)
self.index=len(self.stu_list)
def add_stu(self,name,age):
self.stu_list[name]=[name,age]
self.index=len(self.stu_list)
def __iter__(self):
return self
def __next__(self):
if self.index == 0:
raise StopIteration
self.index=self.index-1
return self.stu_list[list(self.stu_list.keys())[self.index]]
實現了一個學生類,將學生名字作為key,value則是一個list,list中包含姓名和年齡。
s=Student('張華',19)
s.add_stu("李曉明",29)
s.add_stu("張茂",19)
此時s中是:
{'張華': ['張華', 19], '李曉明': ['李曉明', 29], '張茂': ['張茂', 19]}
經過使用for語句:
for i in s:
print(i)
輸出內容:
['張茂', 19]
['李曉明', 29]
['張華', 19]
方法二:使用生成器 Generator
class Student():
def __init__(self,name,age):
self.stu_list={}
self.add_stu(name,age)
self.index=len(self.stu_list)
def add_stu(self,name,age):
self.stu_list[name]=[name,age]
self.index=len(self.stu_list)
def itertool(self):
for i in self.stu_list:
yield self.stu_list[i]
同樣是剛剛的用例,只是把其中的迭代工具改為itertool
注意其中的寫法,yield
會記住上次到哪里了。
s=Student('張華',19)
s.add_stu("李曉明",29)
s.add_stu("張茂",19)
輸入數據后,調用如下:
for i in s.itertool():
print(i)
結果是:
['張華', 19]
['李曉明', 29]
['張茂', 19]