目录
Python迭代器
Python迭代器的理解
迭代器是一个对象(类),用于遍历容器对象。很多语言(C++和Java)中都有容器和迭代器。迭代器提供一个遍历不同类型容器的通用形式。遍历容器的普通方法是各自循环取值,遍历容器的通用方法是用迭代器循环取值。
迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束。迭代器只能往前不会后退。
迭代器的创建和访问有两个基本的方法:iter() 和 next()。
迭代器的创建
迭代器的创建有多种方法。
- 使用iter()函数创建迭代器
- 利用生成器创建迭代器(前面已讲过)
- 自定义对象(类),实现__iter_()方法_next__()方法(目前不讲)
使用iter()函数可以把字符串、列表或元组对象转换成迭代器对象。
mylist=[1,2,3]
myit=iter(mylist)
print(next(myit))
print(next(myit))
print(next(myit))
运行结果
C:UsershccmaAnaconda3python.exe E:/wkp01/p00/test01/py001/t09.py
1
2
3
Process finished with exit code 0
迭代器的遍历
迭代器的遍历需要用循环取出。有两种方式,分别是for和while。
使用for遍历迭代器。
mylist=[1,2,3]
myit=iter(mylist)
for item in myit:
print(item)
运行结果
C:UsershccmaAnaconda3python.exe E:/wkp01/p00/test01/py001/t09.py
1
2
3
Process finished with exit code 0
使用while与next()函数遍历迭代器。
try...except是异常处理方法,以后会讲到。
import sys
mylist=[1,2,3]
myit=iter(mylist)
while 1:
try:
print(next(myit))
except StopIteration:
sys.exit()
运行结果
C:UsershccmaAnaconda3python.exe E:/wkp01/p00/test01/py001/t09.py
1
2
3
Process finished with exit code 0
next()取值时,超过最后一个元素后就会报StopIteration异常。
mylist=[1,2,3]
myit=iter(mylist)
print(next(myit)) # 1
print(next(myit)) # 2
print(next(myit)) # 3
print(next(myit)) # 异常 StopIteration
运行结果
C:UsershccmaAnaconda3python.exe E:/wkp01/p00/test01/py001/t09.py
1
2
3
Traceback (most recent call last):
File "E:/wkp01/p00/test01/py001/t09.py", line 6, in <module>
print(next(myit)) # 异常 StopIteration
StopIteration
Process finished with exit code 1
迭代器与可迭代对象之间的关系
迭代器(Iterator)为成串数据(如容器)提供通用遍历(循环)的方法。
可迭代对象(Iterable)指的是“成串数据”,比如list、tuple、dict、set、str等类型的数据。可迭代对象不用迭代器也能遍历,比如使用for。
迭代器对象内部实现了iter_()方法_next()方法,可以使用for方法遍历,也可以使用next()遍历。
可迭代对象内部只实现了iter()方法,能用for遍历,不能用next()遍历。
Python中可以被next()
函数调用并不断返回下一个值的对象称为迭代器:Iterator
。
判断一个对象是否是Iterator
对象,可以使用isinstance()
函数。
from collections.abc import Iterable,Iterator
mylist=[1,2,3]
print(mylist) # [1, 2, 3]
print(type(mylist)) # <class 'list'>
print(isinstance(mylist,Iterable)) # True
print(isinstance(mylist,Iterator)) # False
myit=iter(mylist)
print(myit) # <list_iterator object at 0x000002187B065FC8>
print(type(myit)) # <class 'list_iterator'>
print(isinstance(myit,Iterable)) # True
print(isinstance(myit,Iterator)) # True