1.可迭代对象iterable
可迭代对象,通常是一个可迭代取值的容器对象,如列表、元组、字符串、集合、字典。换言之,我们新建一个列表、元组、字符串、集合、字典,就相当于生成了一个可迭代对象。
要判断一个对象是否是可迭代对象,就看它是否实现了__iter__
方法。对于上述提到的列表、元组、字符串、集合、字典,我们可以使用dir()
查看其支持的方法,若其中有__iter__
,说明其是可迭代对象。
'__iter__' in dir([1,2,3]) # True
'__iter__' in dir((1,2,3)) # True
'__iter__' in dir({1,2,3}) # True
'__iter__' in dir({1: 2,3: 4}) # True
'__iter__' in dir('1,2,3') # True
除此之外,我们还可以使用下面的代码来判断一个对象是不是可迭代对象。
from collections import Iterable
for obj in [[1], (1,2), {1}, {1:2}, 'abc']:
assert(isinstance(obj, Iterable))
2.迭代器iterator
迭代器协议是指:对象需要提供next方法,它要么返回迭代中的下一项,要么就引起一个StopIteration的异常,终止迭代过程。
给可迭代对象加上iter()
就变成了一个迭代器,所有的迭代器都是迭代对象。
我们可以查看iter(obj)
的类型来证实,type(iter(list([1,2,3])))
的结果为一个list_iterator
类,type(iter((1,2,3)))
的结果为一个tuple_iterator
类,type(iter({1,2,3}))
的结果为一个set_iterator
类,type(iter(dict()))
的结果为一个str_iterator
类。
3.生成器generator
生成表达式或者生成函数通常都是生成器,生成器都是迭代器,使用next()
表示一次迭代。
4.关系描述
下图是上述术语之间的关系: