二、迭代器

迭代是访问集合元素的⼀种⽅式。迭代器是⼀个可以记住遍历的位置的对象。迭代器对象从集合的第⼀个元素开始访问,直到所有的元素被访问完结束。迭代器只能往前不会后退!

可迭代对象

以直接作⽤于 for 循环的数据类型有以下⼏种:
⼀类是集合数据类型,如 list 、 tuple 、 dict 、 set 、 str 等;
⼀类是 generator ,包括⽣成器和带 yield 的generator function。
这些可以直接作⽤于 for 循环的对象统称为可迭代对象: Iterable

In [1]: for s in "Hello":
   ...:     print(s)
   ...:
H
e
l
l
o

In [2]: b = (x for x in range(5))

In [3]: b
Out[3]: <generator object <genexpr> at 0x0000021FEBC98A40>

In [4]: for tmp in b:
   ...:     print(tmp)
   ...:
0
1
2
3
4

判断是否可以迭代

可以使⽤isinstance()判断一个对象是否是Iterable (可迭代的)对象:

In [1]: from collections import Iterable

In [2]: isinstance([],Iterable)
Out[2]: True

In [3]: isinstance({},Iterable)
Out[3]: True

In [4]: isinstance('abc',Iterable)
Out[4]: True

In [5]: isinstance((x for x in range(5)),Iterable)
Out[5]: True

⽽⽣成器不但可以作⽤于 for 循环,还可以被 next() 函数不断调⽤并返回下⼀个值,直到最后抛出 StopIteration 错误表示⽆法继续返回下⼀个值了!

迭代器

可以被next()函数调用并不断返回下一个值的对象称为迭代器:Iterator。
可以使用isinstance() 判断某个对象是否是 Iterator (迭代器)对象

In [1]: from collections import Iterator

In [2]: isinstance((x for x in range(10)),Iterator)
Out[2]: True

In [3]: isinstance([],Iterator)
Out[3]: False

In [4]: isinstance({},Iterator)
Out[4]: False

In [5]: isinstance("abc",Iterator)
Out[5]: False

In [6]: isinstance(100,Iterator)
Out[6]: False

所以说,生成器也是迭代器的一种!

iter()函数

生成器都是Iterator对象,但是list、dict、str虽然是Iterable,去不是Iterator

In [7]: isinstance(iter("abc"),Iterator)
Out[7]: True

In [8]: isinstance(iter([]),Iterator)
Out[8]: True

总结

  • 凡是可作⽤于 for 循环的对象都是 Iterable 类型
  • 凡是可作⽤于 next() 函数的对象都是 Iterator 类型
  • 集合数据类型如 list 、 dict 、 str 等是 Iterable 但不是 Iterator,不过可以通过 iter() 函数获得⼀个 Iterator 对象。

猜你喜欢

转载自blog.csdn.net/m0_38032942/article/details/81474561
今日推荐