python之可迭代对象简介
1 可迭代对象
Python中,列表、元组、字典、集合、字符串等类型的数据可以使用for ..in...的语法从其中依次取到数据来使用,这样的过程称为遍历,也叫迭代。
可迭代对象:可以通过for ..in...这类语句迭代读取一条数据给用户使用的对象。
下面是一段列表的迭代示例代码:
>>> list1 = [1, 2, 3] >>> for n in list1: ... print(n) ... 1 2 3
下面是一段字典的迭代示例代码:
>>> dict1 = { one:1, two:2, three:3} >>> for key in dict1.keys(): ... print(key) ... one two three
2 判断对象是否为可迭代的
使用isinstance判断一个对象是否为可迭代对象(Iterable)
示例代码如下:
from collections import Iterable >>> isinstance([1,2,3], Iterable) # 列表为可迭代对象 True >>> isinstance({ 1,2,3}, Iterable) # 集合为可迭代对象 True >>> isinstance(100, Iterable) False
3 可迭代对象的本质
分析迭代的过程,可发现:每迭代一次(即在for…in…中每循环一次),都会返回对象中的下一条数据,一直向后读取,直到迭代完全部数据才结束。
在迭代过程中,应该有一个“记录员”去记录每次访问到第几条数据,以便每次迭代都可以返回下一条数据。Python将这个“记录员”称为迭代器。可迭代对象的本质是:这个对象提供给用户一个迭代器,来帮助用户在遍历对象时使用。
可迭代对象通过__iter__方法通过给我们一个迭代器。当用户在迭代一个可迭代对象时,实际上就是先获取该对象提供的迭代器,然后通过这个迭代器来一次获取对象中的每一个数据。
具备__iter__方法的对象,就是一个可迭代对象。
示例代码如下:
>>> from collections import Iterable >>> class MyList(object): ... def add(self, item): ... self.container = [] ... def add(self, item): ... self.container.append(item) ... def __iter__(self): ... """返回一个迭代器""" ... # 暂时忽略如何构造一个迭代器对象 ... pass ... >>> mylist = MyList() >>> isinstance(mylist, Iterable) # mylist对象是一个可迭代对象 True
4 iter()与next()
对于可迭代对象,可以使用iter()函数得到这些可迭代对象的迭代器,然后对迭代器使用next()函数来获取下一条数据。(iter()函数调用了可迭代对象的__iter__方法)
示例代码如下:
>>> list1 = [1, 2, 3] >>> list1_iter = iter(list1) >>> next(list1_iter) 1 >>> next(list1_iter) 2 >>> next(list1_iter) 3 >>> next(list1_iter) Traceback (most recent call last): File "<stdin>", line 1, in <module> StopIteration
在使用next()迭代完最后一个元素后,再次调用next就会抛出StopIteration异常,以此来告诉我们所有元素均迭代完成。