参考:https://blog.csdn.net/SL_World/article/details/86507872
解释之前,我们先来看一张概览图,下面是一张关于容器(container)、可迭代对象(Iterable)、迭代器(iterator)、生成器(generator)、生成器函数和生成器表达式的概览图。
翻译一下
它们的从属关系如下
一,容器(container)
【概述】:容器就是一个用来存储多个元素的数据结构
【特点】:
①容器中的元素可通过迭代获取。
②所有容器中的元素被存储在内存中。
【举例】:以下都是常见容器对象,他们都可以通过迭代获取,所以它们也是可迭代对象(Iterable),我们暂且理解可迭代对象就是可以被迭代获取的对象。(注:并非所有容器对象都是可迭代对象)
首先引入如下模块
# 可迭代对象 from collections import Iterable # 迭代器 from collections import Iterator
1,列表(list)
# 列表list是可迭代对象,但是不是迭代器 title = ['Python','Java','C++'] for i in title: print(i) # Python # Java # C++ print(isinstance(title,Iterable)) # True print(isinstance(title,Iterator)) # False
2,元组(tuple)
# 元组teple是可迭代对象,但是不是迭代器 title = ('Python','Java','C++') for i in title: print(i) # Python # Java # C++ print(isinstance(title,Iterable)) # True print(isinstance(title,Iterator)) # False
3,字典(dict)
注:此处打印的字典中的key而不是value
# 字典是可迭代对象,但是不是迭代器 title = {'Python':3,'Java':1.9,'C++':2} for key in title: print(key) # Python # Java # C++ print(isinstance(title,Iterable)) # True print(isinstance(title,Iterator)) # False
4,集合(set)
# 集合set是可迭代对象,但是不是迭代器 title = {'Python','Java','C++'} for i in title: print(i) # Python # Java # C++ print(isinstance(title,Iterable)) # True print(isinstance(title,Iterator)) # False
5,字符串(str)
# 字符串str是可迭代对象,但是不是迭代器 title = 'abc' for i in title: print(i) # a # b # c print(isinstance(title,Iterable)) # True print(isinstance(title,Iterator)) # False
二,可迭代对象(Iterable)
【简述】:可迭代对象就是可以被迭代获取的对象。
【特点】: Iterable定义了绝返回迭代器的__iter__()方法
【举例】:
# list是可迭代对象 title = ['Python','Java','C++'] print(isinstance(title,Iterable)) # 可迭代对象的iter方法返回一个迭代器 a = iter(title) print(next(a)) print(next(a)) print(next(a)) # next完毕再次next因为没有值所以抛出StopIteration异常 # print(next(a)) # StopIteration
如果我们写出以下代码
for elem in [1,2,3]: print(elem)
则实际内部运算过程是这样,列表x是一个可迭代对象,在for循环中进过iter()方法变为迭代器,然后遍历x实际就是内部调用elem = next(x)
三,迭代器(Iterator)
【简述】:迭代器是一个带状态的对象。之所以说是带状态的对象是因为迭代器内部持有一个状态,该状态用于记录当前迭代所在的位置,以方便下次迭代的时候获取正确的元素。迭代器可以通过next()方法来迭代获取下一个值。
【特点】:
①Iterator实现了__iter__()和__next__()方法
②迭代器不会一次性把所有元素加载到内存,而是需要的时候才返回结果(不同于容器)
【举例】:和上面例子一样,下面的a就是一个迭代器,和可迭代对象title不同,a可以通过next(a)来逐个获取其中的每个元素
# list是可迭代对象 title = ['Python','Java','C++'] print(isinstance(title,Iterable)) # 可迭代对象的iter方法返回一个迭代器 a = iter(title) print(next(a)) print(next(a)) print(next(a)) # next完毕再次next因为没有值所以抛出StopIteration异常 # print(next(a)) # StopIteration
如果使用next(title)则会报TypeError错误,显示列表对象不是一个迭代器
# 不是迭代器使用next方法会报TypeError错误 # next(title) # TypeError: 'list' object is not an iterator
迭代器每次调用next()方法的时候做两件事:
1,为下一次调用next()方法修改状态
2,生成当前调用的返回结果