Python学习札记(十九) 高级特性5 迭代器

参考:迭代器

Note

1.可用于for循环的对象有两类:(1)集合数据类型:list tuple dict str set (2)Generator:生成器和含yield语句的函数。这些可以直接作用于for循环的对象统称为可迭代对象:Iterable。

2.可以用isinstance()函数判断一个对象是否为可迭代对象(Iterable):

>>> from collections import Iterable

>>> isinstance([], Iterable)
True >>> isinstance({}, Iterable)
True >>> isinstance((), Iterable)
True >>> isinstance('abc', Iterable)
True >>> isinstance((x for x in range(10)), Iterable)
True >>> isinstance(100, Iterable)
False

3.可以被next()函数调用并不断返回下一个值的对象称为迭代器:Iterator。

注意:可迭代对象(Iterable)和迭代器(Iterator)的区别,迭代器一定是可迭代对象,可迭代对象不一定是迭代器。

可以用isinstance()函数判断是否是迭代器。

>>> from collections import Iterator

>>> isinstance([], Iterator)
False >>> isinstance({}, Iterator)
False >>> isinstance((), Iterator)
False >>> isinstance('str', Iterator)
False >>> isinstance((x for x in range(10)), Iterator)
True

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

4.可以使用iter()函数将一个iterable变成iterator:

>>> isinstance(iter([]), Iterator)
True >>> isinstance(iter(()), Iterator)
True >>> isinstance(iter({}), Iterator)
True >>> isinstance(iter('str'), Iterator)
True

5.为什么Iteratable不是Iterator? Key:数据流、无法预知其长度、惰性计算。

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

所以Iterator的计算是惰性的,只有在需要返回下一个数据时它才会计算。

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

6.Python的for循环本质上就是通过不断调用next()函数实现的:

for i in [1, 2, 3, 4, 5]:
print(i)

等价于:

#!/usr/bin/env python3

it = iter([1, 2, 3, 4, 5]) # get iterator

while True :
try :
x = next(it)
print(x)
except StopIteration :
break
sh-3.2# ./iterator1.py
1
2
3
4
5

总结

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

2.凡是可作用于next()函数的对象都是Iterator类型,它们表示一个惰性计算的序列;

3.集合数据类型如list、dict、str等是Iterable但不是Iterator,不过可以通过iter()函数获得一个Iterator对象。

2017/2/8

上一篇:另一个分区工具GNU的parted[转自vbird]


下一篇:【转】sed 学习笔记