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
成功。
网友评论