迭代器(iterator)
迭代
- 科学概念:是一个重复反馈过程的活动,每一次迭代得到的结果会作为下一次迭代的初始值。
- python概念
- 迭代是访问集合元素的一种方式,迭代器是一个可以记住遍历的位置的对象。迭代器对象从集合的第一个元素开始访问,知道所有的元素被访问完才结束。迭代器只能往前不会后退。
- 对tuple、list、dictionary、set、str等类型的数据使用for可以进行遍历,这样的过程也叫迭代
什么叫迭代器
- 如果一个类继承于object,并且实现了__iter__方法和__next__方法,那么这个类的实例对象就叫做迭代器。
# 判断一个对象是否是迭代器 isinstance(对象,Iterator) # True代表是 False代表不是
什么叫可迭代对象
- 如果一个类(这个类继承于object)里面实现了__iter__方法,那么这个类的实例对象就是一个可迭代的对象。但此时还不能实现迭代。
# 判断一个对象是否是可以迭代的对象 isinstance(对象,Iterable) # True代表是 False代表不是
- 如果__iter__方法返回的是一个对象,并且这个对象是一个迭代器,那么这个类的实例对象就是一个真正的可迭代对象。
for x in 对象:
-
1.在for循环开始之前,python会自动调用isinstance方法判断对象是否是一个可迭代的对象。即isinstance(对象,Iterable)
- True,代表是。进入第二步
- False,返回异常。TypeError:‘对象’ object is not iterable -
2.传入对象调用iter方法,获得__iter__的返回值,python并自动调用isinstance方法判断返回值是否是一个迭代器。即isinstance(对象,Iterator)
- True,代表是。进入第三步
- False,返回异常。TypeError:iter() returned non-iterator of type ‘NoneTpye’ -
3.调用迭代器的__next__方法,每for一次调用一次__next__方法,并把返回值赋值给变量x
自定义一个可迭代对象
class Color(object):
def __init__(self):
self.colors = list()
self.count = 0
def add(self,name):
self.colors.append(name)
def __iter__(self):
return self
def __next__(self):
if self.count < len(self.colors):
ret = self.colors[self.count]
self.count += 1
return ret
else:
self.count = 0
raise StopIteration
color = Color()
color.add("red")
color.add("blue")
color.add("yellow")
for x in color:
print(x)
# red
# blue
# yellow
完成!
总结:
-
如果一个类实现了__iter__方法和__next__方法,那么这个类的实例对象就叫做一个迭代器。
-
如果一个类实现了__iter__方法,并且__iter__方法返回的对象是一个迭代器,那么这个类的实例对象就是一个真正可以迭代的对象。