方法一: 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]