迭代器
想知道什么是迭代器 , 我们需要知道什么是迭代…
什么是迭代?
官方定义:
迭代 , 是访问集合元素的一种方式
听起来更难懂了,其实迭代可以理解为"循环"或者"重复"的意思.
迭代就是指一个重复的过程,每一次都重复都是基于上一次的结果而来
可迭代对象(iterable)
集合,列表,元组,字符串,都是可迭代对象
凡是可以循环的都是可迭代对象
可以通过iter()函数, 来获取可迭代对象的迭代器
如何判断一个对象是否是可迭代对象
通过 isinstance 这个函数判断 , 返回True就是可迭代的.
有个结论: 迭代器一定是可迭代对象,可迭代对象不一定是迭代器对象.
所以可迭代对象,和迭代器对象 还是有一点区别的.
迭代器
定义:
-
迭代器就是可以迭代取值的工具.
-
迭代器是一个可以记住遍历的位置 的对象
-
迭代器从集合的第一个元素开始访问, 直到所有的元素被访问结束.迭代器只能往前不能后退
-
迭代器不但可以作用于for循环,还可以被next()不断地调用并返回下一个值,知道最后抛出一个StopIteration错误 , 表示无法继续返回下一个值.
只要在类里,写了_iter_这个方法,这个类的对象就是一个迭代器,这还不够
当我们对迭代器使用next()函数的时候,迭代器会向我们返回它所记录位置的下一个位置的数据。
所以不光要写_iter_还要写一个_next_方法,那这个实例就一定是迭代器对象
iter()函数获取的迭代器,其实就是就是调用了_iter_这个方法,这个iter会返回一个迭代器(通常会return自己这个迭代器)
凡是可以作用于next()函数的对象,是迭代器类型(Iterator)
自己创建迭代器
from collections.abc import Iterable
class diedai():
def __init__(self):
self.mylist = [1, 2, 3, 4, 5]
# current用来记录当前访问到的位置
self.current = 0
def __iter__(self):
return self
def __next__(self):
# 判断是否全部迭代完毕
if self.current < len(self.mylist):
item = self.mylist[self.current]
self.current += 1
return item
else:
#这行代码可以自己理解一下
self.current = 0
raise StopIteration
d = diedai()
# print(isinstance([], Iterable)) # True
# print(isinstance({}, Iterable)) # True
# print(isinstance('abc', Iterable)) # True
# print(isinstance(100, Iterable)) # False
print(isinstance(d, Iterable)) #可以先把iter里面的内容pass,得到的也T
print(next(d))
print(next(d))
print(next(d))
print("----")
# 打印三次以后,next会记住下标,for循环的时候也是继续上面的
for i in d:
print(i)