python进阶——迭代器
那么什么是迭代呢?
对对象中的某个元素重复做同样的事情就是迭代了,最简单的最常用的就是迭代一个列表了,也就是说对它的每个元素进行一个一个处理或者另行计算的过程就叫做迭代:
myList = [1,2,3,4,5]
for i in myList:
print(i)
哪些对象是可以被迭代的呢?
一般可以被迭代的对象都是有序了,也是说你要知道谁是第一个,谁是第二个……谁是最后一个,或者说你要知道谁是下一个,下一个这个概念可能更为关键或者说更需要被理解一下。
- 在
中可以被迭代的对象:有序的:list,tuple,string,无序:set,dict(无法控制遍历顺序)python
怎么判断一个对象能否被迭代呢?
可以使用
isinstance()
判断一个对象是否是
Iterable
对象:
from collections.abc import Iterable
myList = list(range(1,6)) # 列表
print(isinstance(myList, Iterable)) # True
mySet = set(range(1,6)) # 集合
print(isinstance(mySet, Iterable)) # True
print(isinstance(123, Iterable)) # False
现在说回什么是迭代器?
迭代器可以看作是一个特殊的对象,每次调用该对象时会返回自身的下一个元素,从实现上来看,一个迭代器对象必须是定义了
__iter__
方法和
__next__
方法的对象。在
python
因为有
for
循环的强大功能,迭代器的功能已经有点弱化了,很少有机会自己定义一个迭代器,然后迭代使用。
- 列表list、元组tuple、集合set、字典dict等都是可被迭代(Iterable)的对象,但并不是迭代器(Iterator),可用使用
函数将其变为迭代器。iter()
myList = list(range(1,6))
# 非迭代器
print(isinstance(myList, Iterator)) # False
# 迭代器
print(isinstance(iter(myList), Iterator)) # True
Python
中迭代器Iterator对象表示的是一个数据流,
Iterator
对象可被
next()
函数调用,并且返回迭代器中下一个元素,直到没有数据时抛出
StopIteration
异常,可以认为这个对象是未知长度的数据流,只有通过
next()
函数得到下一个数据,所以迭代器的计算是
惰性
的,只有需要获得下一个数据时,才被计算。
其实for循环的本质就是不断调用next()实现的:
myList = list(range(1,6))
for i in myList:
print(i)
上下两方法等价:
myIt = iter(myList)
while True:
try:
print(next(myIt))
except StopIteration:
break
主要需要理解的的是如何拿到迭代器(使用
iter()
函数)以及对迭代器的使用(调用
next()
函数和对
stopIteration
异常的捕获)。