Python学习笔记014——迭代器 Iterator

1 迭代器的定义

凡是能被next()函数调用并不断返回一个值的对象均称之为迭代器(Iterator)

2 迭代器的说明

Python中的Iterator对象表示的是一个数据流,被函数next()函数调用后不断返回下一个数据,直到没有数据时抛出StopIteration错误;在存储空间中,迭代器并非全部数据,而是通过next()函数不断按需计算下一个数据,可以把Iterator看成序列,但是这个序列长度却是“未知的”,所以Iterator的计算是惰性的,只有在需要返回下一个数据时它才会计算。

3 迭代对象

凡是可作用于for循环的对象都是Iterable类型

4 迭代器与迭代对象的差别

4.1 迭代对象的长度是可知的,迭代器的长度是“未知的”

>>> a = [1,2,3,4,5]
>>> a
[1, 2, 3, 4, 5]
>>> b = iter(a)
>>> b
<list_iterator object at 0x7f27f6b02710>
>>> len(a)
5
>>> len(b)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: object of type 'list_iterator' has no len()

4.2 迭代对象Iterable和迭代器Iterator可以相互转化

集合数据类型list、tuple、dict、set、str均是迭代对象Iterable,但不是迭代器Iterator;

但是可以通过iter()函数将上述的迭代对象转变成Iterator。

另外迭代器只能向前取值,不能后退,迭代对象则可任意取值

>>> a = [1,2,3,4]
>>> b = iter(a)
>>> next(b)
1
>>> c = list(b)
>>> c
[2, 3, 4]
>>> next(b)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
StopIteration
>>> d = b
>>> d
<list_iterator object at 0x7fc895d4c668>
>>> next(d)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
StopIteration

注意:生成器均是Iterator对象

4.3 均可用isinstance()判断对象

可以使用isinstance()来判断一个对象是否是Iterable()Iterator()对象。

迭代对象

>>> isinstance([],Iterable)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'Iterable' is not defined

>>> from collections import Iterable

>>> isinstance([],Iterable)
True

>>> isinstance((),Iterable)
True

>>> isinstance((x for x in range(10)),Iterable)
True

>>> isinstance(1,Iterable)
False

迭代器

>>> from collections import Iterator
>>> isinstance([],Iterator)
False
>>> isinstance(iter([]),Iterator)
True

4.4 存储数据形式

Iterator对象可以表示一个无限大的数据流,例如全体自然数,占用较小的存储空间;但是Iterable对象则是直接存储全体自然数,会占用较大的存储空间。


L = [1, 3, 5, 7]
# for 语句实现遍历
for x in L:
    print(x)

# 用while 语句来实现遍历
it = iter(L)
while True:
    try:
        x = next(it)
    except StopIteration:
        break
    print(x)

print("程序结束")

运行

1
3
5
7
1
3
5
7
程序结束

5 迭代器相关函数

iter(Iterable)      从一个对象中返回迭代器(Iterable必须是可迭代对象)

next(Iterator)    从迭代器Iterator中获取下一个记录,如果无法获取,则会触发StopIteration异常

L = [1, 3, 5, 7]
it = iter(L)  # 用 L 来返回一个迭代器
v = next(it)  # 返回1
next(it)  # 返回3
next(it)  # 返回5
next(it)  # 返回7
next(it)  # StopIteration 异常
上一篇:Codeforces Round #238 (Div. 2) D. Toy Sum(想法题)


下一篇:小白也能看懂的插件化DroidPlugin原理(二)-- 反射机制和Hook入门