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


     

    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)  
  • 相关阅读:
    c#: List.Sort()实现稳固排序(stable sort)
    c# dt.AsEnumerable ().Join用法
    C#中new的两种用法"public new"和"new public"
    简说设计模式——观察者模式
    mysql中explain的type的解释
    mysql 查询优化 ~explain解读之select_type的解读
    代理
    charle
    like语句防止SQL注入
    java学习网站
  • 原文地址:https://www.cnblogs.com/tortoise512/p/14713663.html
Copyright © 2020-2023  润新知