[toc]
1、迭代的概念
(1)什么是迭代
迭代就是单向地、逐个地访问某个容器中的元素的行为。 简单说迭代就是循环。
(2)迭代和遍历的区别
迭代是遍历的一种特例,遍历(
traverse
)是可以在数据结构上来回的游走,不仅可以往前,还可以往后,同时还能保证不重不漏的,迭代是单向的,逐个的,而且只来一次。
2、迭代器的概念
(1)概念
在Python中常见的序列有
list
、
tuple
、
set
、
dict
、
str
,我们也称之为容器。
我们之前在遍历这些容器的时候,针对不同的容器,每次写的代码还都有所差别。于是我们想能不能写一个工具,当我们需要对一个容器中的元素,进行单向的,一个接一个的取出来的时候,就调用这个工具。
这个工具可以帮我们把不同容器遍历细节上的不同屏蔽掉,当我们需要这个操作的时候,就把容器直接传给这个工具就好了,而这个工具就叫迭代器。
(2)优点
- 从序列类型中一个一个的取值,会把所有的值都取到。
- 节省内存空间,迭代器并不会在内存中占用一大块内存,面是随着循环每次生成一个,每调用一次
next
方法就会返回给我一个元素。
3、可迭代的对象(Iterable)
(1)什么是可迭代的对象
简单的说,一个对象只要实现了只要实现了
__iter__()
方法,就是一个可迭代的对象。
可以使用
isinstance()
判断一个对象是否是
Iterable
对象:
(2)Python中常见的可迭代数据类型
- 集合或序列类型(如
list
、
tuple
、
set
、
dict
、
str
)
- 文件对象(以后扩展)
- 在类中定义了
__iter__()
方法的对象,可以被认为是
Iterable
对象,
示例:
from collections.abc import Iterableprint(isinstance(\'\', Iterable)) # true 字符串是可迭代的print(isinstance([], Iterable)) # true 列表是可迭代的print(isinstance((), Iterable)) # true 元组是可迭代的print(isinstance({}, Iterable)) # true 字典是可迭代的print(isinstance(set(), Iterable)) # true 集合是可迭代的
说明:
这些内置集合或序列对象都有
__iter__
方法,即他们都实现了同名方法。
我们可以随便定义一个序列,如下:
testList = list()
在PyCharm中按住
ctrl
键点击
list()
就可以查看
list
类的源码。
源码中我们就能够看到
list
类中定义了
__iter__
函数。
其他的可迭代序列同理。
像int数据类型,按住
ctrl
键点击查看。int类中并没有定义
__iter__
函数。
1 = int()
4、迭代器对象(Iterator)
序列类型(如
list
、
tuple
、
set
、
dict
、
str
等)都是可迭代对象,但是他们并不是迭代器对象。
可以使用
iter()
函数把可迭代对象(
Iterable
)变成迭代器对象(
Iterator
):
验证:
from collections.abc import Iterable, Iteratorprint(isinstance(\'\', Iterator)) # False 字符串不是迭代器对象print(isinstance([], Iterator)) # False 列表不是迭代器对象print(isinstance((), Iterator)) # False 元组不是迭代器对象print(isinstance({}, Iterator)) # False 字典是不是迭代器对象print(isinstance(set(), Iterator)) # False 集合不是迭代器对象# iter()可把对应的可迭代对象转换成迭代器对象print(isinstance(iter(""), Iterator)) # True 迭代器对象print(isinstance(iter([]), Iterator)) # True 迭代器对象print(isinstance(iter(()), Iterator)) # True 迭代器对象print(isinstance(iter({}), Iterator)) # True 迭代器对象print(isinstance(iter(set()), Iterator)) # True 迭代器对象
说明:
可迭代对象支持内置函数
iter
,通过对可迭代对象调用
iter
函数,会返回一个迭代器。而“迭代器”支持内置函数
next()
,通过不断对其调用
next()
方法,会依次前进到序列中的下一个元素并将其返回,最后到达序列的末尾时,会引发
StopIteration
异常。
补充说明一点,对迭代器调用
iter
方法,则会返回迭代器自身。
示例如下:
# 定义一个列表testList = [1, 2, 3, 4]# 把列表转变成一个迭代器对象it = iter(testList)# 迭代器对象调用__iter__,返回迭代器对象本身# <list_iterator object at 0x0000000002674B88>print(it.__iter__())
5、迭代器的使用体验
(1)基本用法
# 定义一个列表testList = [1, 2, 3, 4]# 把列表转变成一个迭代器对象it = iter(testList)# 使用迭代器# 从迭代器中取出一个接着一个的元素print(next(it)) # 1print(next(it)) # 2print(next(it)) # 3print(next(it)) # 4# 当迭代完存储的所有元素之后,如果继续迭代,# # 则 __next__() 方法会抛出 StopIteration 异常。print(next(it)) # StopIterable 异常
(2)实际应用
# 示例1# 用迭代器来访问列表中的元素# 定义一个列表testList = [1, 2, 3, 4]# 把裂变转变成一个迭代器对象it = iter(testList)# 使用迭代器取值while True:try:# 调用next函数,获取下一个字符result = next(it)print(result)except StopIteration:# 释放对it的引用,即废弃迭代器对象del it# 不推出循环会成为私循环break# 示例2# 用迭代器来访问列表中的元素# 定义一个字符串testStr = "Python"# 把裂变转变成一个迭代器对象it = iter(testStr)# 使用迭代器取值for str in it:print(str)
参考:
- https://www.pianshen.com/article/2143688358/
- https://blog.csdn.net/sibyl_pisces/article/details/78423203