其他分享
首页 > 其他分享> > 关于斐波拉契数列引出的迭代器生成器的一点讨论

关于斐波拉契数列引出的迭代器生成器的一点讨论

作者:互联网

 

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