Iterable
可迭代对象,可以直接使用 for ... in ... 循环的对象,统称为可迭代对象。
如list、tuple、dict、set、str等
判断对象是否 Iterable
使用isinstance()内置函数,代码如下:
from collections import Iterable
print(isinstance([],Iterable))
print(isinstance((),Iterable))
print(isinstance({},Iterable))
print(isinstance(set(),Iterable))
print(isinstance('python',Iterable))
#判断文件对象是否可迭代对象
f=open('文件','rb')
print(isinstance(f,Iterable))
执行结果如下:
True
True
True
True
True
True
序列对象 和 文件对象 都是 可迭代对象
Iterator
迭代器,类实现了__iter__()、__next__()方法的类对象,称为迭代器。
可以被 next() 函数调用(并返回下一个值的对象),都是迭代器,迭代器 也是生成器
可以用于for...in...语句
判断对象是否 Iterator
使用isinstance()内置函数,代码如下:
from collections import Iterator
print(isinstance([],Iterator))
print(isinstance((),Iterator))
print(isinstance({},Iterator))
print(isinstance(set(),Iterator))
print(isinstance('python',Iterator))
#判断文件对象是否可迭代对象
f=open('文件','rb')
print(isinstance(f,Iterator))
执行结果如下:
False
False
False
False
False
True
总结:
序列对象 都 不是 迭代器,文件对象 是迭代器
将Iterable对象转成Iterator对象
通过 iter() 函数,代码如下:
l=[1,2,3,4]
it=iter(l)
print(isinstance(it,Iterator))
通过next()使用迭代器
next()函数获取迭代器下一个值,直到最后抛出StopIteration错误
例子1
通过next()函数获取迭代器的下一个值,代码如下:
l=[1,2,3,4]
it=iter(l)
print(isinstance(it,Iterator))
print(next(it))
print(next(it))
通过while语句遍历迭代器
上面的方法并不完美,无法遍历迭代器 所有 的值。
通过 while语句 和 next()函数 遍历迭代器对象,并打印迭代器对象的值
l=[1,2,3,4]
it=iter(l)
while True:
try:
x=next(it)
print(x)
except StopIteration:
break
注意:
这种方式只能遍历一次,如下:
l=[1,2,3,4]
it=iter(l)
while True:
try:
x=next(it)
print(x)
except StopIteration:
break
while True:
try:
x=next(it)
print(x)
except StopIteration:
break
第二次while语句不会遍历
原因参见:
https://www.malaoshi.top/show_1EF2D9P4Udhf.html
通过for语句遍历迭代器(推荐)
上面的while语句过于繁琐,通过for...in...语句改造,可以简化很多代码:
l=[1,2,3,4]
it=iter(l)
for item in it:
print(item)
总结:
python中的for语句,和C/C++/JAVA等语言的for语句不同,是专门处理 Iterable 和 Iterator 的
注意:for语句不要和next()一起使用
如下面例子:
it=iter([1,2,3,4,5])
for _ in it:
print(next(it))
注意: for...in...语句本身就会取迭代器的 下一个值,next()函数也会取迭代器的 下一个值,也就是取2次,会造成错误
迭代器实现原理
见链接:
http://www.malaoshi.top/show_1EF2D9P4Udhf.html
总结
- 序列对象是Iterable,但不是Iterator
- next()、iter()都是与Iterator相关的函数