美文网首页
关于可迭代对象与迭代器的一点思考

关于可迭代对象与迭代器的一点思考

作者: Rokkia | 来源:发表于2017-06-04 22:02 被阅读19次

list ,dic ,str 都是可迭代对象

那么什么是可迭代对象呢?
很简单,可以理解为 可以直接作用于for循环的对象统称为可迭代对象

如:

l = [1, 2, 3, 4]
s = "abcd"
for x in l:
    print(x)
1
2
3
4

l 我们可以迭代循环

for x in 5:
    print(x)
TypeError: 'int' object is not iterable

但是int类型的5 就不是iterable
当然如果想要验证一个对象是否是一个可迭代对象可以通过isinstance

#记得要import Iterable哦 否则会报错哦!
In [20]: from collections import Iterable, Iterator

In [21]: isinstance(l, Iterable)

什么是迭代器呢?简单的可以理解为:
可以被next()函数调用并不断返回下一个值的对象称为迭代器。

怎么获得迭代器呢?
由可迭代对象获得迭代器
我们可以通过iter方法

In [22]: iter(l)
Out[22]: <listiterator at 0x103f72fd0>

可以看到out里我们返回的是一个listiterator类型,也就是一个迭代器对象。
我们如何获取验证一个对象是否是迭代器呢?同样,我们可以通过isinstance来验证。

In [46]: isinstance(iter(l), Iterator)
Out[46]: True
思考时间

for循环的时候 究竟都干了些什么 ?
很简单,首先将in后面的对象通过iter方法将对象转换成迭代器,然后再执行。
迭代器怎么执行呢?
通过next方法。

In [25]: i = iter(l)

In [26]: i.next()
Out[26]: 1

In [27]: i.next()
Out[27]: 2

In [28]: i.next()
Out[28]: 3

In [29]: i.next()
Out[29]: 4

In [30]: i.next()
---------------------------------------------------------------------------
StopIteration                             Traceback (most recent call last)
<ipython-input-30-e590fe0d22f8> in <module>()
----> 1 i.next()

调用next方法查看迭代器中是否还有值,如果没有了则抛出StopIteration异常。

下面我们来写一个可迭代对象与迭代器看一下。

迭代器,因为我们使用iterable的时候需要返回一个iterator所以我们先定义迭代器
In [43]: class DemoIterator(Iterator):
    ...:     def __init__(self, arr):
    ...:         self.arr = arr
    ...:         self.index = 0
             #注意这里是next哦  不是__next__开始写的时候就犯了这个错
    ...:     def next(self):
    ...:         if self.index == len(self.arr):
    ...:             raise StopIteration
    ...:         ob = self.arr[self.index]
    ...:         self.index += 1
    ...:         return ob

可迭代对象

In [40]: class DemoIterable(Iterable):
    ...:     def __init__(self, arr):
    ...:         self.arr = arr
             #实现这里的__iter__方法
    ...:     def __iter__(self):
    ...:         return DemoIterator(self.arr)

ok下面就需要验证了

In [44]: for x in DemoIterable([1,2,3,4]):
    ...:     print x
    ...:     
1
2
3
4

成功。

相关文章

网友评论

      本文标题:关于可迭代对象与迭代器的一点思考

      本文链接:https://www.haomeiwen.com/subject/zydvfxtx.html