1、什么是迭代器
迭代,简单理解就是重复的做一些事。迭代器通过__next__()方法访问可迭代对象,从第一个元素开始访问,直到所有的元素都被访问才结束。迭代器只能前进不能后退。使用迭代器不需要事先准备好整个迭代过程中的所有元素。迭代器仅仅在迭代到某个元素时才计算该元素,而在这之前或之后元素可以不存在或者被销毁。因此迭代器适合遍历一些数量巨大序列。
2、可迭代对象
在Python中,内置有__iter__()或者__getitem__()方法的对象都可以称为可迭代对象。iter()的作用是可以通过for循环进行遍历,getitem()则可以让对象通过索引的方式访问对象中的元素。比如常用的,str,list,tuple,dict,set都是可迭代对象。 在Python中可以通过下面的方法判断一个对象是不是可迭代对象
from collections.abc import Iterable
li = [1,2,3,4]
print(isinstance(li,Iterable)) # li为可迭代对象,这里返回True
3、 迭代器
在Python中,内置有__iter__()方法和__next__()方法的对象都可以称为迭代器。next()方法是让对象可以通过next(obj)的方式访问对象中的下一个元素。常用的,str,list,tuple,dict,set都是可迭代对象,但不是迭代器,因为他们都没有__next__()方法。可以通过iter(Iterable)方法创建一个迭代器,在Python中可以通过下面的方法判断一个对象是不是迭代器
from collections.abc import Iterator
li = [1,2,3,4]
it = iter(li)
print(isinstance(li,Iterator)) # li是可迭代对象,不是迭代器,这里返回false
print(isinstance(it,Iterator)) # it是迭代器,这里返回True
由于Python鸭子类型的特性,我们只要在一个类中实现__iter__()方法和__next__()方法,这个类就可以当做一个迭代器
from collections.abc import Iterator,Iterable
class Animal(object):
def __iter__(self):
return self
def __next__(self):
return self
an = Animal()
print(isinstance(an,Iterable)) # 结果为True
print(isinstance(an,Iterator)) # 结果为True
通过next()方法可以访问迭代器中的元素,每次返回一个元素,迭代器有多少个元素就需要执行next()多少次。如果执行多了就会报StopIteration异常。,
from collections.abc import Iterable,Iterator
li = [1,2,3]
it = iter(li)
print(next(it))
print(next(it))
print(next(it))
print(next(it))
结果
1
2
3
Traceback (most recent call last):
File "C:/Users/Administrator/PycharmProjects/untitled/练习/Demo.py", line 8, in <module>
print(next(it))
StopIteration