zoukankan      html  css  js  c++  java
  • 关于斐波拉契数列引出的迭代器生成器的一点讨论

     

    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)  
  • 相关阅读:
    一句话解释各种虚拟币的用途
    php 网站301重定向设置代码实战案例
    seo网页加速技术,预加载 DNS Prefetching 详解
    AI赌神称霸德扑的秘密,刚刚被《科学》“曝光”了
    java实现 HTTP/HTTPS请求绕过证书检测代码实现
    pyspider源码解读--调度器scheduler.py
    pyspider操作千万级库,pyspider在对接量级较大库的策略
    尼克《人工智能简史》谈人工智能的历史、现实与未来
    CentOS7使用yum命令安装Java1.8
    php ci nginx 伪静态rewrite配置方法
  • 原文地址:https://www.cnblogs.com/tortoise512/p/14713663.html
Copyright © 2011-2022 走看看