迭代器:实现了迭代协议的对象就叫迭代器
迭代器协议是两个魔术方法:
__iter__:返回迭代器对象
__next__:从迭代器对象中如何迭代出下一个值
class Countdown:
def __init__(self,num):
self.num = num
def __iter__(self):
return self
def __next__(self):
if self.num > 0:
self.num -= 1
return self.num
raise StopIteration()
cd = Countdown(5)
#可以用for in 循环取迭代器的值
# for i in cd:
# print(i)
#可以用next()取下一个值
print(next(cd))
print(next(cd))
迭代器实现斐波那契数列:
class Fib:
def __init__(self,num):
self.num = num
self.index = 0
self.a, self.b = 0, 1
def __iter__(self):
return self
def __next__(self):
if self.index < self.num:
self.a, self.b = self.b, self.a + self.b
self.index += 1
return self.a
raise StopIteration()
fib = Fib(20)
for i in fib:
print(i)
生成器 :语法升级版的迭代器 yield
迭代器是生成器的基础
生成器通过预激可以变成协程:obj.send(None) 或 next(obj)
def fib(num):
a,b = 0,1
for _ in range(num):
a,b = b, a+b
yield a
gen = fib(20)
print(type(gen))#生成器对象 <class 'generator'>
#生成器对象可以使用for in 循环打印
for i in gen:
print(i)