可迭代对象Iterable 迭代器Iterator

什么是迭代?

如果给定一个list或tuple,我们可以通过for循环来遍历这个list或tuple,这种遍历我们称为迭代(Iteration)。

在Python中,迭代是通过for … in来完成的,而很多语言比如C或者Java,迭代list是通过下标完成的

可以看出,Python的for循环抽象程度要高于Java的for循环,因为Python的for循环不仅可以用在list或tuple上,还可以作用在其他可迭代对象上。

list这种数据类型虽然有下标,但很多其他数据类型是没有下标的,但是,只要是可迭代对象,无论有无下标,都可以迭代,比如dict就可以迭代


什么是可迭代的对象?

如果对象实现了能返回迭代器的__iter__方法,那么对象就是可迭代的,如果没有实现__iter__方法,会继续查找是否实现了实现了__getitem__方法,其参数是从零开始的索引,如果实现了__getitem__,这种对象也可以迭代。(程序中的调用过程我们是看不到的,是在内部实现的)

了解了以上理论知识,下面看下list是Iterable还是Iterator??
这里写图片描述
这里写图片描述
所以list是可迭代对象

我们再创建一个公司类,初始化公司员工列表,实现了__getitem__方法,创建company对象进行迭代
这里写图片描述
可以迭代的原因:iter函数
当解释器需要迭代对象x时,会自动调用iter(x)。
内置的iter函数有以下作用。
(1) 检查对象是否实现了__iter__方法,如果实现了就调用它,获取一个迭代器。
(2) 如果没有实现__iter__方法,但是实现了__getitem__方法,Python 会创建一个迭代器,尝试按顺序(从索引 0 开始)获取元素。
(3) 如果尝试失败,Python 抛出TypeError异常,通常会提示“C objectis not iterable”(C 对象不可迭代),其中C 是目标对象所属的类。


什么是迭代器?

可以被next()函数调用并不断返回下一个值的对象称为迭代器:Iterator

Python的Iterator对象表示的是一个数据流,Iterator对象可以被next()函数调用并不断返回下一个数据,直到没有数据时抛出StopIteration错误。可以把这个数据流看做是一个有序序列,但我们却不能提前知道序列的长度,只能不断通过next()函数实现按需计算下一个数据,所以Iterator的计算是惰性的,只有在需要返回下一个数据时它才会计算。

可迭代对象和迭代器的关系?

这里写图片描述
Iterable和Iterator抽象基类。Iterator继承了Iterable
Iterable.__iter__方法返回了一个Iterator实例。
Iterator类必须实现__next__方法。Iterator.__iter__方法直接返回实例本身

下面两张图是使用pycharm查看的,是用python模拟C实现的类似源码的帮助文档。可以看到Iterator里的__next__方法,而Iterable没有实现该方法
这里写图片描述
这里写图片描述

我们要明确可迭代的对象和迭代器之间的关系:Python从可迭代的对象中获取迭代器。
这里写图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值