

可能有点难理解,不过明白了就很好说了。
当然,函数中还可以添加 return,在一个 generator function 中,如果没有 return,则默认执行至函数完毕,如果在执行过程中 return,则直接抛出 StopIteration 终止迭代。
例如上面的例子,我们在迭代时发现并没有出现 'done' 这串字符,是因为 return 的值被当作 Exception Value 了,如果要显示出来,则可以这样:
>>> g = fib(6)
>>> while True:
... try:
... x = next(g)
... print('g:', x)
... except StopIteration as e:
... print('Generator return value:', e.value)
... break
...
g: 1
g: 1
g: 2
g: 3
g: 5
g: 8
Generator return value: done可直接作用于 for 循环的对象被称为可迭代对象,可以用 isinstance() 函数判断是否为可迭代对象:
>>> from collections import Iterable
>>> 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()判断一个对象是否是Iterator对象:
>>> from collections import Iterator
>>> isinstance((x for x in range(10)), Iterator)
True
>>> isinstance([], Iterator)
False
>>> isinstance({}, Iterator)
False
>>> isinstance('abc', Iterator)
False通过上面两个例子,可以这样理解:生成器和 list,tuple,str 等都是 Iterable 对象,生成器同时还是 Iterator 对象,而 list 等不是。那么能否直接将 Iterable 对象转换成 Iterator 对象呢?
可以使用iter()函数:
>>> isinstance(iter([]), Iterator)
True
>>> isinstance(iter('abc'), Iterator)
True其实,Iterator 对象表示的是一个数据流,我们可以把这个数据流看做是一个有序序列,但却不能提前知道序列的长度,只能不断通过next()函数实现按需计算下一个数据,所以 Iterator 的计算是惰性的,只有在需要返回下一个数据时它才会计算。Iterator甚至可以表示一个无限大的数据流,但 list,tuple 什么的是不可能这样的。
更多关于 python 的一些高级特性相关文章请关注PHP中文网!
