所有Python程序员都知道,列表可以迭代。其实不止是列表,Python中的序列都可以迭代。所谓序列,指的是其中的元素按一定顺序排列,可通过每个元素所在位置的编 (称为索引)访问它们,序列都可以进行的操作包括索引,切片,加,乘,检查成员。在Python中,序列包括str、list、tuple、bytes、bytearray、collections.deque等。那么序列为什么能够迭代呢,跟着小编一起往下看吧。
壹-可迭代对象
贰-迭代器
对于迭代器:
1、调用__iter__(),返回自身。
2、不断调用__next__()方法,产生下一个元素。
3、迭代到最后,抛出StopIteration异常。
对于可迭代对象:
1、先判断对象是否实现了__iter__()或__getitem__()方法,没有实现就抛出TypeError异常,否则调用iter()方法,返回一个迭代器。
2、Python内部不断地调用迭代器的__next__方法,每次按序返回迭代器中的一个值。
3、迭代到最后,抛出StopItera异常。
注意,StopIteration异常表明迭代器要结束了。Python语言内部会自动处理 for循环和其他迭代上下文(如列表推导、元组拆包,等等)中的StopIteration异常。我们也可以如下方式来模拟for循环的工作机制。
肆-生成器和迭代器对比
在介绍完生成器跟迭代器之后,我们可以来对比一波了:
1、从接口方面
Python的迭代器协议定义了__next__()和__iter__()两个方法。生成器对象实现了这两个方法,因此从这方面来看,所有生成器都是迭代器。
2、从实现方式上
Python提供两种方式实现生成器:含有yield关键字的函数或生成器表达式。调用生成器函数或者执行生成器表达式得到的生成器对象属于语言内部的 GeneratorType(https://docs.python.org/3/library/types.html#types.GeneratorType)类型。从这方面来看,所有生成器都是迭代器,因为GeneratorType 类型的实例实现了迭代器接口。不过,我们可以编写不是生成器的迭代器,方法是实现经典的迭代器模式,就像下面这样:
伍-小结和补充
文章知识点与官方知识档案匹配,可进一步学习相关知识Python入门技能树首页概览212386 人正在系统学习中
声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!