小白学 Python(20):迭代器基础

人生苦短,我选Pythonhtml

前文传送门python

小白学 Python(1):开篇git

小白学 Python(2):基础数据类型(上)github

小白学 Python(3):基础数据类型(下)数据结构

小白学 Python(4):变量基础操做函数

小白学 Python(5):基础运算符(上)spa

小白学 Python(6):基础运算符(下)3d

小白学 Python(7):基础流程控制(上)code

小白学 Python(8):基础流程控制(下)htm

小白学 Python(9):基础数据结构(列表)(上)

小白学 Python(10):基础数据结构(列表)(下)

小白学 Python(11):基础数据结构(元组)

小白学 Python(12):基础数据结构(字典)(上)

小白学 Python(13):基础数据结构(字典)(下)

小白学 Python(14):基础数据结构(集合)(上)

小白学 Python(15):基础数据结构(集合)(下)

小白学 Python(16):基础数据类型(函数)(上)

小白学 Python(17):基础数据类型(函数)(下)

小白学 Python(18):基础文件操做

小白学 Python(18):基础文件操做

小白学 Python(19):基础异常处理

迭代器

迭代器能够简单的理解为 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 的时候,在以前的版本引入方式都是 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

不是说好的列表是能够迭代的么,为何又报错了。

这位同窗,先消消气,看看报错信息说的是啥,这是在提示咱们列表并非一个迭代器。

因此,可迭代对象不必定是迭代器!

咱们导入 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))

结果我就不放出来了,你们应该都知道结果了。

除此以外,迭代器有一个很是巨大的优点是在迭代以前,无需准备好全部的元素,迭代器仅在迭代到某个元素的时候才开始计算这个元素,在这以前或者以后,元素是能够不存在或者被销毁的。

这个特性使得它在遍历一些体积巨大的集合的时候,具备很是大的优点。

今天的内容到这里就结束,但愿各位同窗能够本身动手尝试一下迭代其余集合类型,如元组,字典等。

感谢各位同窗长久以来对个人支持,大家的转发和关注是我最大的动力。

示例代码

本系列的全部代码小编都会放在代码管理仓库 Github 和 Gitee 上,方便你们取用。

示例代码-Github

示例代码-Gitee

原文出处:https://www.cnblogs.com/babycomeon/p/11846611.html

相关文章
相关标签/搜索