关于这次帖子,如果有错误的地方,还请各位指正,不胜感激。初次接触迭代器,故仅作为一篇笔记而发表。
[Python] 纯文本查看 复制代码 '''
迭代器: 一种访问数据的方式。
迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束.
两个方法:
(1)__iter__(). 含有这个方法的对象可以迭代,只有这个方法的对象不能称为迭代器。
它返回一个类(比如A),然后A类调用__next__()方法返回想要获取的值。
(2)__next__(). 这个方法用于返回A类实例的某个属性值。有__iter__()和__next__()的类才能称为迭代器。
注意:我的教材上计数器self.cur是公有方法,而且最后计数器没有置零。但是这样,我觉得有问题:
(1)只能访问一次;
(2)self.cur被修改后可能遗漏访问,或者重复访问
所以我修改了两个地方
(1)计数器self.cur设置为 self.__cur私有属性,禁止被对象直接操作;
(2)迭代结束,计数器清零。
简单的模型:
class A(){
init():
self.date
iter():
return A
next():
return self.date
}
main():
a= A()
for item in a:
pass1
"for item in a " 这句话执行应该是这样的:
(1) a.__iter__(),返回类A
(2)类A调用__next__(),返回a对象的某些属性值给item
(3) pass1执行。
(1)(2)(3)循环,直到访问结束
'''
class iter():
def __init__(self):
#类的属性,用于保存对象数据
self.name= list()
self.id= list()
#在迭代器中使用的计数器,
# 建议:设置为私有属性
self.__cur = 0
def add(self, name,id):
self.name.append(name)
self.id.append(id)
#__iter__()方法,迭代时对象调用它,它调用类
def __iter__(self):
return self
#__next__()方法,类调用它
def __next__(self):
#有可访问的数据
if self.__cur<len(self.name):
ans = self.name[self.__cur],self.id[self.__cur]
#计数器加一
self.__cur += 1
return ans
#数据访问结束
else:
#计数器清零,不然下次没有办法迭代
self.__cur = 0
raise StopIteration
def main():
it = iter()
names = ["熊大", "熊二", "张三", "李四", "王五", "张六"]
for item in range( len( names) ):
it.add(item, names[item])
for name in it:
print(name)
#如果self.__cur不置零,那么下面没有输出
for name in it:
print(name)
if __name__ == '__main__':
main()
|