## 可迭代对象 迭代器 迭代工具 迭代环境
**可迭代对象**分为两大类:一种是实际保存的序列,即列表、元组,字符串,字典; 另一种是虚拟序列,包括range、enumerate、zip、filter函数返回值,还有字典的方法d.keys()、d.values()、d.items()
通过对可迭代对象调用 iter()函数,就会返回一个**迭代器**。另外,对迭代器调用iter方法,则会返回迭代器自身。
Python中有一类工具叫做**迭代工具**,他们能从左至右扫描对象。这包括了for循环、列表解析、in成员关系测试以及map内置函数等。
Python中,从左到右扫描的每种工具都使用了迭代协议,都可以称之为**迭代环境**。 for循环表达式、列表解析式、in成员关系测试,map内置函数,sorted和zip等调用; 还包括一些其他的内置方法,如sum,any,all,max,min都可以传入任何可迭代对象, 还包括了list和tuple、set内置函数,他们也是通过迭代协议扫描可迭代对象,构建新的对象。还有字符串join方法,它将一个子字符串放置到一个被包含在可迭代对象的字符串之间
a=(i*2 for i in range(5))
b=[i*2 for i in range(5)]
c={i*2 for i in range(5)}
print(a,'\n',b,'\n',c)
>>><generator object <genexpr> at 0x0000000002756148>
[0, 2, 4, 6, 8]
{0, 2, 4, 6, 8}
完整的看看迭代过程是怎么实现的:当任何可迭代对象传入到for循环或其他迭代工具中进行遍历时,迭代工具都是先通过iter函数获得与可迭代对象对应的迭代器,然后再对迭代器调用next函数,不断的依次获取元素,并在捕捉到StopIteration异常时确定完成迭代,这就是完整的迭代过程。这也称之为**“迭代协议”**。
转载自:https://zhuanlan.zhihu.com/p/32508947
https://zhuanlan.zhihu.com/p/32509527