关于斐波拉契数列引出的迭代器生成器的一点讨论
作者:互联网
1.斐波那契数列指的是这样一个数列 0, 1, 1, 2, 3, 5, 8, 13,特别指出:第0项是0,第1项是第一个1。从第三项开始,每一项都等于前两项之和。请用for循环遍历该数列的前N项:
一、使用列表来存储数据,然后遍历列表
a = 0 b = 1 lst = list() list_index_input = input("请输入下标:") list_index = int(list_index_input) i = 0 while i <= list_index: lst.append(a) a, b = b, a+b i += 1 for lst_num in lst: print(lst_num)
二、使用迭代器来实现
我们使用list来存储数据,当数据量很大的时候,会造成内存浪费,可以采用迭代器和生成器来完成,只有在需要的时候才生成,从而节省内存空间:
class Fibonacci(object): def __init__(self, list_index): self.list_index = list_index self.i = 0 self.a = 0 self.b = 1 def __iter__(self): # 调用该方法的目的是让该类变成一个可迭代对象 return self # 调用自己的迭代方法,这里是__next__方法 def __next__(self): # 这是一个迭代方法,用来说明迭代的具体过程 if self.i < self.list_index: ret = self.a self.a, self.b = self.b, self.a + self.b self.i += 1 return ret # 返回ret,也是是self.a else: raise StopIteration # 这里抛出一个异常用来停止for循环,否则将会返回None,陷入死循环 list_index_input = input("请输入下标:") list_index = int(list_index_input) fibo = Fibonacci(list_index) for lst_num in fibo: print(lst_num)
三、使用生成器来实现
接下来我们使用生成器来完成:
def get_index_number(list_index): a, b = 0, 1 i = 0 while i < list_index: ''' 生成器中yield的作用是当程序执行到yield的时候,会将yield后面的值返回给调用对象, 然后暂停函数,等待下一次取值,当下一次取值的时候,它将继续执行后面的代码。 ''' yield a # 如果一个函数有yield语句,那么这就不是一个函数了,而是一个生成器 a, b = b, a+b i += 1 list_index_input = input("请输入下标:") list_index = int(list_index_input) lst = get_index_number(list_index) # 创建一个生成器对象 for lst_num in lst: # 调用生成器对象,从生成器对象取值。 ''' 第一次取值的时候开始运行生成器,当运行到yield的时候,返回a同时生成器暂停,回到for循环, 当for循环下一次取值的时候,将再次调用生成器,生成器从yield后面的代码继续执行,如此循环。 可以看出,生成器也是一种可迭代对象。 ''' print(lst_num)
标签:__,index,迭代,生成器,self,list,波拉,input 来源: https://www.cnblogs.com/tortoise512/p/14713663.html