可直接作用于for循环的对象我们称之为可迭代对象Iterable:
一类是数据集合类型:list、tuple、dict、set、str
还一类就是生成器以及带yield的生成器函数
可以用isinstance()判断一个对象是否为可迭代对象:
>>> isinstance([],Iterable) True >>> isinstance({},Iterable) True >>> isinstance('abc',Iterable) True >>> isinstance((x for x in range(10)), Iterable) True >>> isinstance(100, Iterable) False >>>
可以被next()函数调用并不断返回下一个值的对象称为迭代器:Iterator,迭代器可以用isinstance()函数判断一个对象是否为可迭代器的对象:
>>> from collections.abc import Iterator >>> isinstance((x for x in range(10)),Iterator) True >>> isinstance([],Iterable) True >>> isinstance([],Iterator) False >>> isinstance({},Iterator) False >>> isinstance('abc',Iterator) False
生成器都是迭代器对象,但不是所有可迭代的对象都是迭代器的对象,如list、dict、str,要把他们变成可迭代器的对象使用iter()函数:
>>> isinstance(iter([]), Iterator) True >>> isinstance(iter('abc'), Iterator) True
Python的Iterator对象表示的是一个数据流,可以被next函数一直调用直到出现停止迭代错误返回,虽然是一个有序数列,但无法提前直到有多少,只能不断next计算出下一个数字,没有要求计算下一个数据,计算机不会计算下一个是什么。
迭代器可以做出整个自然数数列,也就是一个无限大的数据流,但list做不到。
Python的for循环的本质就是循环调用next函数