迭代器
迭代器可以简单理解为for循环,Python为我们提供了for循环之外的另一种访问集合元素的方式。
特点:
可以记住遍历的位置的对象。
迭代器从集合的第一个元素开始访问,直到访问完所有元素。
迭代器只能向前不能后退。
但是判断一个对象是否有迭代器,除了看能不能用for循环外,Python还为我们提供了一个更专业的方法——isinstance()。
我们可以使用 isinstance() 来判断当前对象是否可以迭代。
在使用迭代器之前,需要先引入迭代器,因为迭代器并不是Python的内置方法。
from collections.abc import Iterable
print(isinstance('geekdigging', Iterable))
print(isinstance([], Iterable))
print(isinstance([], Iterable))
print(isinstance({x for x in range(5)}, Iterable))
print(isinstance(123, Iterable))
打印结果如下:
True
True
True
True
False
这里有一点需要注意。我们在引入Iterable的时候,之前版本的import方法是from collections import Iterable,但是在Python3.7中会抛出异常,如下:
D:/Development/Projects/python-learning/base-iter/Demo.py:1: DeprecationWarning: Using or importing the ABCs
from '
collections' instead of from 'collections.abc' is deprecated, and in 3.8 it will stop working
from collections import Iterable
意思是这个导入方式在Python3.8中将被停用。现在Python3.8已经发布,我们根据提示导入,使用 from collections.abc import Iterable 。
在迭代器中,最重要的方法一定是 next() ,从名字就可以看出,它的作用就是下一个。
我们现在来尝试迭代一个列表:
list1 = [1, 2, 3, 4]
next(list1)
执行结果:
Traceback (most recent call last):
File "D:/Development/Projects/python-learning/base-iter/Demo.py", line 12, in <module>
next(list1)
TypeError: 'list' object is not an iterator
不是说好的list可以迭代吗,怎么又报错了。
这位同学,先冷静一下,看看错误信息是怎么说的。这是为了提醒我们列表不是迭代器。
所以,可迭代对象不一定是迭代器!
我们导入Iterator模块,先把列表转成迭代器,试试看。
list1 = iter(list1)
print(type(list1))
执行结果:
<class 'list_iterator'>
从类型来看,现在是一个可迭代的列表,我们再试试next()方法。
print(next(list1))
print(next(list1))
print(next(list1))
print(next(list1))
执行结果:
1
2
3
4
你看,现在就能正常打印了吧。
刚才我们将整个列表中的元素迭代完了,如果这时候再迭代一次会怎么样呢?
print(next(list1))
执行结果:
Traceback (most recent call last):
File "D:/Development/Projects/python-learning/base-iter/Demo.py", line 23, in <module>
print(next(list1))
StopIteration
看到了咯,会抛出 StopIteration 的异常。
可能看到这里,大家还是觉得迭代器没什么用。让我再举一个例子。如果我们现在有一个set集合,我想一个一个获取set集合中的元素,那么迭代器就派上用场了。因为set集合中没有索引,如果要获取某个值,只能用for循环整个集合,但是有了迭代器,我们就不需要循环整个集合了。
set1 = {1, 2, 3, 4, 5}
set1 = iter(set1)
print(next(set1))
print(next(set1))
print(next(set1))
print(next(set1))
print(next(set1))
结果我就不放出来了,大家应该都知道结果了。
另外,迭代器还有一个非常巨大的优势,就是不需要在迭代前准备好所有的元素。迭代器只有在迭代到一个元素时才开始计算该元素。在此之前或之后,该元素可能不存在或被销毁。
这个特性使得它在遍历一些巨大的集合时具有很大的优势。
本文为原创文章,版权归知行编程网所有,欢迎分享本文,转载请保留出处!
你可能也喜欢
- ♥ 如何设置 Python 字典按值排序?11/08
- ♥ 如何防止python反编译09/26
- ♥ python连接数据库失败如何解决09/08
- ♥ 如何查看python的版本号11/24
- ♥ 如何启动python ide12/07
- ♥ python计算月球重量08/18
内容反馈