- 实现了 __iter__ 方法的对象称为可迭代对象
- 实现了 __iter__ 和 __next__ 方法的对象称为迭代器对象,官方文档称为迭代器协议
- for...in...语句可以自动将可迭代对象变为迭代器,当 in 后的对象为一个迭代器时,会调用该对象的 __iter__ 两次
- str,list,turpe,dict等均为可迭代对象
关系图
class MyIter: # 这是一个迭代器
# 实现了 iter 和 next 两个方法的对象称为迭代器对象
def __init__(self):
"""初始化跌代的值,也可以直接写在—__iter__内"""
self.a = 1
def __iter__(self):
"""使用类成为一个可迭代对象
不写 return self 会报如下错
TypeError: iter() returned non-iterator of type 'NoneType'
"""
print('iter')
return self
def __next__(self):
"""跌代的实现,返回值是输出的值"""
if self.a <=20:
x=self.a
self.a += 1
print("next")
return [x]+["1",]
else:
raise StopIteration
class MyList: # 这是一个可迭代对象
def __init__(self):
pass
def __iter__(self):
# 实现了 iter 方法的对象称为可迭代对像
return MyIter()
if __name__ == '__main__':
c=MyList() # 实例可迭代对象
# a=MyList() # 实例可迭代对象
# c=iter(a) #返回迭代器对象
# print(c.next()) # 可迭代对象只有变成迭代器对象才能调用next方法
# print(c.__next__())
# print(c.__next__())
# print(c.__next__())
for x in c: # for可以调用可迭代对象,自动将可迭代对象变为迭代器对象
print(x)
参考:
Python可迭代对象,迭代器,生成器的区别_LiangJishengBlog-CSDN博客_可迭代对象