python迭代器详解,python中什么是迭代器
迭代程序
迭代器可以简单理解为for循环。除了for循环之外,Python还准备了另一种访问集合元素的方法。
特点:
一个可以记住遍历位置的对象。
迭代器从集合的第一个元素开始访问,直到访问完所有元素。
迭代器只能向前,不能向后。
但是判断一个对象是否有迭代器,Python除了是否可以使用for循环之外,还为我们提供了一个更专业的方法,—— isinstance()。
我们可以使用isinstance()来确定当前对象是否可以迭代。
在使用迭代器之前,需要先介绍一下,因为迭代器不是Python的内置方法。
from collections . ABC importable
print(isinstance(极客挖掘,Iterable))
print(isinstance([],Iterable))
print(isinstance([],Iterable))
print(is instance({ xforxinrange(5)},Iterable))
print(is instance(123,Iterable))打印结果如下:
真实的
真实的
真实的
真实的
false这里有一个小问题。注意,当我们引入Iterable时,以前的版本是由from collections import Iterable引入的,但是在Python3.7中抛出了一个异常,如下所示:
d :/Development/Projects/python-learning/base-ITER/demo . py :1: deprecationwarn : usingoriimporttheabc
“从”
collections 而不是collections.abc 被解压缩,3.8将停止工作
FromcollectionsimportIterable的意思是这个引入方法在Python3.8中会停止使用,现在Python3.8已经发布了,我们就根据提示引入,使用FromcollectionsimportIterable。
在迭代器中,最重要的方法一定是next()。从名字就可以看出,它的功能是next。
现在让我们尝试遍历一个列表:
列表1=[1,2,3,4]
next(list1)的执行结果:
回溯(mostrecentcalllast):
文件“d :/Development/Projects/python-learning/base-ITER/demo . py”,第12行,在模块中
下一个(列表1)
type : List objectsinotiterator没说好的列表可以迭代吗?为什么它又报错了?
这位同学,冷静一下,看看错误信息是怎么说的。这是为了提醒我们列表不是迭代器。
所以,可迭代对象不一定是迭代器!
我们导入迭代器模块,先把列表转换成迭代器,然后再试一次。
list1=iter(list1)
打印的执行结果(类型(列表1)):
从类型的角度来看,类“list_iterator”是一个可以迭代的列表。让我们再次尝试next()方法。
打印(下一个(列表1))
打印(下一个(列表1))
打印(下一个(列表1))
打印的执行结果(next(list1)):
一个
2
三
看,现在可以正常打印了。
我们刚刚迭代了整个列表中的元素。如果这个时候再迭代会怎么样?
打印的执行结果(next(list1)):
回溯(mostrecentcalllast):
文件“d :/Development/Projects/python-learning/base-ITER/demo . py”,第23行,在模块中
打印(下一个(列表1))
StopIteration看到它,会抛出StopIteration异常。
正如你在这里看到的,人们仍然觉得迭代器没有用。我再给你举个例子。如果我们现在有一个set set,我想一个一个的获取里面的元素,那么迭代器就派上用场了。因为在集合中,没有索引。如果想得到某个值,只能用for来循环整个集合,但是有了迭代器,我们就不需要循环整个集合了。
集合1={1,2,3,4,5}
集合1=iter(集合1)
打印(下一个(设置1))
打印(下一个(设置1))
打印(下一个(设置1))
打印(下一个(设置1))
打印(下一个(set1))我不发布结果。每个人都应该知道结果。
此外,迭代器有一个巨大的优势,那就是在迭代之前,不需要准备所有的元素。迭代器只在迭代到一个元素时才开始计算它。在那之前或之后,元素不能存在或被消灭。
这个特性使得它在遍历一些大型集合时具有很大的优势。
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。