生成器都是一个迭代器,但是反过来不行。
from collections import Iterable
# 如果是可以用for或者next循环处理的就叫做迭代对象。
print(isinstance([], Iterable))
# True
print(isinstance({}, Iterable))
# True
# 可以用next()函数调用并不断返回下一个值的对象称为迭代器: Iterator。
from collections import Iterator #(注意不是Interable)
print(isinstance([], Iterator))
# False
print(isinstance((x for x in range(10)), Iterator))
# True
print(type(x for x in range(10)))
# <generator object <genexpr> at 0x0000000005F04A20>
# 下一节将会说isinstance和type的区别
# 迭代器生成的对象为生成器(因为生成器的原理是可以一边循环一边计算)
def fib(max):
# a, b = b, a+b
a, b, n = 0, 1, 0
while n < max:
a,b = b,a+b
yield(a)
n=n+1
return 'done'
f = fib(5)
print(isinstance(f, Iterator))
try:
while True:
print(next(f))
except StopIteration as e:
print('Generator return value:', e.value)
网友评论