Python中的迭代器的实现
程序员文章站
2022-05-03 18:06:06
...
案例引入
斐波那契数列的实现
1.无返回值
def feb(max):
n, a, b = 0, 0, 1
while n < max:
print(b,end='\t')
a, b = b, a + b
n += 1
该方法返回的值是None,其他变量无法访问这个数列,复用性差
2.返回一个列表
def feb(max):
n, a, b = 0, 0, 1
L = []
while n < max:
L.append(b)
a, b = b, a + b
n += 1
return L #返回一个列表,可迭代对象
for i in feb(5):
print(i)
list是一个可迭代对象,但该函数在运行中占用的内存会随着参数 max 的增大而增大,如果要控制内存占用,最好不要用 List
3.运用迭代器
class feb():
def __init__(self, Max):
self.n = 0
self.a = 0
self.b = 1
self.Max = Max
def __iter__(self):
return self
def __next__(self):
if self.n < self.Max:
r = self.b
self.a, self.b = self.b, self.a + self.b
self.n += 1
return r
else:
raise StopIteration()
for i in feb(5):
print(i)
含有__next__()的类都是一个迭代器对象,如果不含有__iter则要用一个变量去接收这个迭代器,feb()通过next()不断返回下一个数,内存始终为常量
如果n>Max 则抛出StopIteration()异常,程序停止
4.yiled的使用创建迭代器
def feb(Max):
n, a, b = 0, 0, 1
while n < Max:
yield b
a, b = b, a + b
n += 1
for i in feb(5):
print(i)
yield相当于是return,但是函数在yiled的位置挂起,当下一次访问next()时会从挂起的位置继续执行
def foo():
print("starting...")
while True:
res = yield 4 # -->yield 会return 4 ,则res就会被赋值为None
print("res:", res)
g = foo() #相当于创建了一个对象,但是因为函数中有yield所以不执行函数
print(next(g)) #因为运用了next函数,则g开始执行,到yield的位置,返回4,但是没有将变量赋值,函数在此挂起
print("*" * 20)
print(next(g)) #因为yield是个返回值,所有res被赋值为None,然后执行下面的语句,直到下一次循环的yield 4 ,返回4然后输出4,函数再次挂起
print("*" * 20)
print(g.send(7)) # send-->包含next()但会先将7赋值给res
输出如下:
> starting...
4
********************
res: None
4
********************
res: 7
4
迭代器的作用是,每次next()返回一个值,内存被固定,即使在多的数据,在迭代器的作用下内存的使用也是很小的
上一篇: C++ 命名空间-namespace作用与使用方法详解
下一篇: 爬虫day02