惊鸿一瞥
中华文化博大精深,我想先就本次主题中的关键字迭代器的相关术语进行区分定义,然后再开展之后的分析,好了,我们开始吧!
可迭代对象:可迭代对象是指那些可以被用来迭代的对象,通俗的说就是可以被迭代工具迭代的对象。例如Python中的列表,元组,字符串以及range( I )、zip(seq1, seq2)、map(fun, seq)、filter(fun, seq),open( file ),os.popen( shell )等函数返回的结果都可以称之为可迭代对象,他们遵守迭代协议,能够被依次从左至右的顺序进行扫描。
迭代器:这个概念与上面的概念有所不同,如果从集合论的角度看的话,二者之间应该是真包含的关系,即可迭代对象真包含迭代器,就好比NP真包含P,因为所有的迭代器一定是可迭代的,但并非所有的可迭代对象都是迭代器。
定义:指的是iter函数调用所返回的一个支持next(I)的对象。一般可以采用 iter(obj) == obj来判断对象自身是否就是自身的迭代器。
例如:列表是可迭代的对象,但却不能称之为迭代器,os.popen( )函数返回的结果是可迭代的对象,但是也不能称之为迭代器。前者很好理解,后者可能有点费解,首先os.popen()函数的参数是shell命令,该函数返回的结果便是shell命令输出的结果近似迭代器版本。由于os.popen()返回的结果不支持内置的next()函数,只支持自身的_ _ next_ _ ( )方法,所以不能称之为迭代器。
例如常见的迭代器有,zip(seq1, seq2)、map(fun, seq)、filter(fun, seq),open( file )函数返回的结果。
迭代工具:使用迭代协议迭代可迭代对象的工具。例如for循环,列表解析,in成员关系测试,map(),zip(),filter(),range(),list(),tuple(),sorted(),reversed()内置函数,这些函数使用迭代协议作用于传入的参数,所以可以称之为迭代工具,而且前面三个的返回值同时还是迭代器!后两个返回的结果是列表!还有字符串的join方法,甚至包括序列赋值!functools.reduce(),enumerate(),sum(),any(),all(),max(),min()
迭代协议:有_ _ next _ _方法的对象会前进到下一个结果,而在一系列结果的末尾时,则会引发StopIteration异常。
代码示例
- 多个迭代器 VS 单个迭代器