迭代
一.定义
重复做一件事
二.可迭代的对象
- 支持每次返回自己所包含的一个成员的对象
- 对象实现了
__iter__
方法
序列类型 如:list,tuple,str
非序列类型 如:dict,file
用户自定义的一些包含了__iter__()
或__getitem__()
方法的类
3.迭代器
迭代器(iterator)又称游标(cursor),它是程序设计的软件设计模式,是一种可在容器物件上实现元素遍历的接口
注意:
- 迭代器是一种特殊的数据结构,在python中以对象的形式存在
- 对于一个集体中的每一个元素,都想要执行遍历,那么针对这个集体的迭代器定义了遍历集体中每一个元素的顺序或者方法
四.遵循迭代协议
迭代器是遵循迭代协议的对象
要注意的事项:
-
使用
iter()
可从任何序列对象中得到迭代器 -
若要实现迭代器,需要在类中定义
next()
方法 -
要使得迭代器指向下一个元素,则使用成员函数
next()
- 在python中,是函数next(),而非成员函数,
当没有元素时,则引发stopiteration
异常
for
循环可用任何可迭代对象
for
循环开始时,会得到迭代协议传递给iter()内置函数,从而能够从可迭代对象中获得一个迭代器,返回的对象含有需要的next()方法
五.列表解析
python迭代机制的一种应用,常用于创建新的列表,因此要放置于[]中
语法:
[expression for iter_var in iterable] [expression for iter_var in iterable if cond_expr]
六.生成器表达式
为了解决列表解析所生成的列表占用巨大内存
- 生成器表达式并不真正创建数字列表,而是返回一个生成器对象,此对象在每次计算出一个条目后,把这个条目(yield)出来
- 生成器表达式使用了“惰性计算”或称作’‘延迟求值’‘的机制
- 序列过长,并且每次只需要获取一个元素时,应当考虑使用生成器表达式而不是列表解析
语法:
(expr for iter_var in iterable) (expr for iter_var in iterable if cond_expr)
七.enumerate
-
range可在非完备遍历中用于生成索引偏移,而非偏移处的元素如果同时需要偏移索引和偏移元素,则可以使用
enumerate()
函数 -
此内置函数返回一个生成器对象