python之Iterable和Iterator

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

总结

  1. 序列对象是Iterable,但不是Iterator
  2. next()、iter()都是与Iterator相关的函数

感谢文章:
https://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000/00143178254193589df9c612d2449618ea460e7a672a366000


原文出处:/show_1EF2Q2oYX718.html