可以直接作用于for循环的数据类型:
①集合数据类型:list、 tuple、 dict、 set、 str
②generator:生成器、带有yield的generator function
这些可以直接作用于for循环的对象统称为可迭代对象:Iterable
可以使用 isinstance()判断一个对象是否是 Iterable 对象,实例如下:
# _*_ coding:utf-8 _*_
from typing import Iterable
__author__ = 'admin'
g = (x for x in range(10))
print(isinstance(g, Iterable))
输出结果:True
# _*_ coding:utf-8 _*_
from typing import Iterable
__author__ = 'admin'
g = []
print(isinstance(g, Iterable))
输出结果:True
可以被 next()函数调用并不断返回下一个值的对象称为迭代器:Iterator
可以使用 isinstance()判断一个对象是否是 Iterator对象,实例如下:
# _*_ coding:utf-8 _*_
from typing import Iterable, Iterator
__author__ = 'admin'
g = (x for x in range(10))
print(isinstance(g, Iterator))
输出结果:True
# _*_ coding:utf-8 _*_
from typing import Iterable, Iterator
__author__ = 'admin'
g = []
print(isinstance(g, Iterator))
输出结果:False
总结:
①生成器都是Iterator 对象
②list、 dict、 str 虽然是 Iterable,却不是Iterator
③如何把 list、 dict、 str 等 Iterable 变成 Iterator呢?答案是iter()函数,实例如下:
# _*_ coding:utf-8 _*_
from typing import Iterable, Iterator
__author__ = 'admin'
print(isinstance(iter([]), Iterator), isinstance(iter('abc'), Iterator))
输出结果:True True
回到问题“为什么list、dict、str不是Iterator呢?”
①Python 的 Iterator 对象表示的是一个数据流
②这个数据流是一个不能提前被知道序列长度的有序序列
③只能不断通过 next()函数实现按需计算下一个数据
④Iterator 的计算是惰性的,只有在需要返回下一个数据时它才会计算
⑤Iterator甚至可以表示一个无限大的数据流,例如全体自然数。这一点list就办不到
******Python 的 for 循环本质上就是通过不断调用 next()函数实现的*******
# _*_ coding:utf-8 _*_
__author__ = 'admin'
for x in [1, 2, 3, 4, 5]:
print(x)
等同于迭代器写法:
# _*_ coding:utf-8 _*_
__author__ = 'admin'
it = iter([1, 2, 3, 4, 5])
while True:
try:
x = next(it)
print(x)
except StopIteration:
break