迭代器
迭代器有两个重要部分
1._iter_()
用来获取迭代器对象
2.next()
获取容器内下一个元素
自定义一个迭代器
斐波列数列 1 1 2 3 5 8 等于前两个数相加。
class Fab(object):
#构造函数
def __init__(self,max):
self.max =max
self.n, self.a, self.b = 0, 0, 1
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
raise StopIteration() #迭代器没有更多的值了,异常处理
yield用法
如果我们要写一个斐波列数列的函数
第一次写可能是这样的
def fab(max):
n, a, b = 0, 0, 1
while n < max:
print(b)
a, b = b, a+b
n = n +1
没有返回值,使用print,不能让其他函数使用,
第二次,返回一个列表
def fab(max):
n, a, b = 0, 0, 1
list = []
while n < max:
list[n] = b
a, b = b, a+b
n = n +1
但是如果max = 1000000000能 内存岂不爆炸?
第三次
我们就考虑使用迭代器了
class Fab(object):
#构造函数
def __init__(self,max):
self.max =max
self.n, self.a, self.b = 0, 0, 1
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
raise StopIteration() #迭代器没有更多的值了,异常处理
x = Fab(5)
for i in x:
print(i)
这样的话,内存占用一直是一个常数,但是这第三次的代码和第一次的代码比起来,好长。
简化之,使用yield
第四次
def fab(max):
n, a, b = 0, 0, 1
while n < max:
yield b
a, b = b, a+b
n = n +1
x = fab(5)
for i in x:
print(i)
不能直接print yield类型的值 否则会输出一个