迭代(Iteration): 对一组序列进行遍历的过程本身就是迭代,
可迭代对象(Iterable):python中任意对象,只要能返回一个迭代器方法__iter__的对象,或者有下标索引__getitem__方法的对象就是一个可迭代对象。
迭代器(Iterator):python中任意对象,只要拥有__next__方法,就是一个迭代器。
想知道一个对象是否是可迭代对象,是否拥有迭代器,可以使用 collections 包下的 Iterable(可迭代对象)、Iterator(迭代器) 通过isinstance()方法来查看。
class MyList: """创建一个向空列表里面添加数据的类""" def __init__(self): """初始化,创建实例对象""" self.mylist = list() def add(self, num): """向列表里面添加数据""" self.mylist.append(num) nums = MyList() nums.add(1) nums.add(2) nums.add(3) nums.add(4)for num in nums: print(num)
输出结果:
Traceback (most recent call last): File "D:/iteration.py", line 18, in <module> for num in nums: TypeError: ‘MyList‘ object is not iterable
为什么会出现这个错误呢?
因为Mylist对象不是一个可迭代对象
怎么让他成为一个可迭代对象呢?如下代码:
class MyList: """创建一个向空列表里面添加数据的类""" def __init__(self): """初始化,创建实例对象""" self.mylist = list() def add(self, num): """向列表里面添加数据""" self.mylist.append(num) def __iter__(self):
""" pass
nums = MyList() nums.add(1) nums.add(2) nums.add(3) nums.add(4) for num in nums: print(num)
运行结果:
Traceback (most recent call last): File "D:/iteration.py", line 22, in <module> for num in nums: TypeError: iter() returned non-iterator of type ‘NoneType‘
此时的错误提示为:iter()方法返回一个空类型,并且这个类型没有迭代器
也就是说,可迭代对象里面必须有一个__next__方法
如下代码:
class MyList: """创建一个向空列表里面添加数据的类""" def __init__(self): """初始化,创建实例对象""" self.mylist = list() self.current = 0 def add(self, num): """向列表里面添加数据""" self.mylist.append(num) def __iter__(self): return self def __next__(self): # 记录上一个数据 if self.current < len(self.mylist): last = self.mylist[self.current] self.current += 1 return last else: # 抛出异常 raise StopIteration nums = MyList() nums.add(1) nums.add(2) nums.add(3) nums.add(4) for num in nums: print(num)
运行结果:
1 2 3 4
Process finished with exit code 0
至此,该可迭代对象完成。
原文:https://www.cnblogs.com/zhirou/p/11972759.html