Python迭代对象与迭代器

时间:2023-01-02 09:45:19

一.迭代对象

1.概念

迭代对象:可以直接作用于for循环的对象统称为可迭代对象:Iterable。

2.可以直接作用于for循环的数据类型

(1)集合类数据类型,如list, tuple, dict, set, str等

(2)generator,包括生成器和带yield的generator function.

以上这些直接作用于for循环的对象统称为可迭代对象:Iterable.

3.判断一个对象是不是可迭代对象(Iterable)

可以使用isinstance,需要导入模块
from collections import Iterator
from collections import Iterable

(1)判断 str 类型是不是可迭代对象
isinstance('',Iterable)
isinstance('abc',Iterable)
print(isinstance('',Iterable)) # True
print(isinstance('abc',Iterable)) # True
(2)判断 list 类型是不是可迭代对象
isinstance([],Iterable)
isinstance([1,2,3,4],Iterable)
print(isinstance([],Iterable)) # True
print(isinstance([1,2,3,4],Iterable)) # True
(3)判断 元组 类型是不是可迭代对象
isinstance(tuple(),Iterable)
isinstance((1,2,3,4),Iterable)
print(isinstance(tuple(),Iterable))
print(isinstance((1,2,3,4),Iterable))
(4)判断 集合 类型是不是可迭代对象
isinstance(set(),Iterable)
isinstance((1,2,3,4),Iterable)
print(isinstance(set(),Iterable)) # True
print(isinstance((1,2,3,4),Iterable)) # True
(5)判断 字典 类型是不是可迭代对象
isinstance({},Iterable)
isinstance({'name':'wanghua','age':28},Iterable)
print(isinstance({},Iterable)) # True
print(isinstance({'name':'wanghua','age':28},Iterable)) # True
(6)判断 for 循环是不是可迭代对象
isinstance((x for x in range(10)), Iterable)
print(isinstance((x for x in range(10)), Iterator)) # True

二. 迭代器

1.概念

迭代器:可以被next()函数调用并不断返回下一个值的对象称为迭代器:Iterator。
迭代器是在python2.2中被加入的,它为类序列对象提供了一个类序列的接口。有了迭代器可以迭代一个不是序列的对象,因为他表现出了序列的行为。当在python中使用for循环迭代一个对象时,调用者几乎分辨不出他迭代的是一个迭代器对象还是一个序列对象,因为python让他(迭代器)像一个序列那样操作。

2.判断一个对象是否是迭代器(Iterator). 可以使用isinstance,需要导入模块from collections import Iterator

3.判断 for 循环是不是迭代器

isinstance((x for x in range(10)), Iterator)
print(isinstance((x for x in range(10)), Iterator)) # True
成器都是Iterator对象,但list、dict、str虽然是Iterable,却不是Iterator。
把list、dict、str等Iterable变成Iterator可以使用iter()函数:

>>> isinstance(iter([]), Iterator)
True
>>> isinstance(iter('abc'), Iterator)
True

你可能会问,为什么list、dict、str等数据类型不是Iterator?

这是因为Python的Iterator对象表示的是一个数据流,Iterator对象可以被next()函数调用并不断返回下一个数据,直到没有数据时抛出StopIteration错误。可以把这个数据流看做是一个有序序列,但我们却不能提前知道序列的长度,只能不断通过next()函数实现按需计算下一个数据,所以Iterator的计算是惰性的,只有在需要返回下一个数据时它才会计算。

Iterator甚至可以表示一个无限大的数据流,例如全体自然数。而使用list是永远不可能存储全体自然数的