python 迭代器详解

基本概念

迭代器是python最强大的功能之一,是访问集合元素的一种方式

1.迭代器协议是指:对象必须提供一个next方法,执行该方法要么返回迭代中的下一项,要么就引起一个stoplteration异常,以终止迭代(只能往后走,不能往前退)

2.可迭代对象:实现了迭代器协议的对象(如何实现:对象内部定义一个__iter__()方法)

3.协议是一种约定,可迭代对象实现了迭代器协议,python的内部工具(如for循环,sum,min,max函数等)使用迭代器协议访问对象。

当我们看到这些概念的时候是不是觉得很抽象?那么在搞清楚迭代器之前到底什么是迭代?

迭代:顾名思义就是指一个重复的过程,每一次重复都是基于上一次结果而来,迭代提供了一种通用的不依赖索引的迭代取值方式。

我们可以把它理解为一种只能从前往后进行比遍历的过程,但是可以进行多次遍历,例如我们的for循环。

可迭代对象:在python中一切皆对象,那么哪些是可迭代对象呢?其实很容易理解可以遍历的对象例如:字符串,list,tuple,dic,set等都属于。

如果我们无法判断,就只需要记住在python中,但凡内部有__iter__方法的对象,都是可迭代对象。

可迭代对象的优点:可以直观查看里面的对象,如直接查看列表的内容

可迭代对象缺点:1. 全部内容要加载至内存中,故占用内存;2. 可迭代对象不能迭代取值(除了索引,key外)

那么到底什么是迭代器呢?

顾名思义就是可以迭代取值的工具。从专业的角度来说:迭代器就是实现了__next__方法,返回序列的下一个元素,如果没有元素了,

就会抛出StopIteration异常,python中的迭代器还实现了__iter__方法,因此迭代器也是可以迭代的。

所以简单地说:在python中,内部含有__iter__方法并且含有__next__方法的对象就是迭代器。

如何判断一个对象是不是迭代器,通过dir方法查看其是否具备iter和next方法,如下判断str,list,tuple,dic和文件哪个是迭代器

示例代码

print('__iter__' in dir(list), '__next__' in dir(list))
print('__iter__' in dir(str), '__next__' in dir(str))
file = open('test_scq.py')
print('__iter__' in dir(file), '__next__' in dir(file))

运行结果

True False

True False

True True

由结果可知,list,str属于可迭代对象,但不是迭代器。file文件是可迭代对象,也是迭代器

迭代器优点:

1. 提供了一种通用不依赖索引的迭代取值方式;

2. 节省内存,迭代器在内存中相当于只占一个数据的空间:因为每次取值都上一条数据会在内存释放,加载当前的此条数据。

迭代器缺点:

1. 因为有next方法,即只能往后取值,不能往前,取值不如按照索引的方式灵活,不能取指定的某一个值;

2. 无法预测迭代器的长度。

你可能感兴趣的:(python,python)