zoukankan      html  css  js  c++  java
  • 24_生成器、斐波那契数列

    一、生成器概念

    通过列表生成式,我们可以直接创建一个列表。但是,受到内存限制,列表容量肯定是有限的。而且,创建一个包含100万个元素的列表,不仅占用很大的存储空间,如果我们仅仅需要访问前面几个元素,那后面绝大多数元素占用的空间都白白浪费了。如果列表元素可以按照某种算法推算出来,那我们是否可以在循环的过程中不断推算出后续的元素呢?这样就不必创建完整的list,从而节省大量的空间。在Python中,这种一边循环一边计算的机制,称为生成器(Generator)。生成器不会把结果保存到一个系列中,而是保存生成器状态,在每次迭代的时候返回一个值,直到遇到StopIteration异常结束。并且生成器实现了迭代器协议,所以生成器就是可迭代对象。所以生成器的本身就是迭代器。

    实现生成器的方式:

    1.可以使用生成器函数

    2.可以使用各种推导式构建迭代器

    3.可以通过数据转化

    二、yield的功能

    yield语句一次返回一个结果,在每个结果中间,挂起函数状态,下次运行时在它离开的地方继续向下执行。

     1 def genner():
     2     print('111')
     3     yield 222
     4     print('333')
     5     yield 444
     6     print('555')
     7     yield 666
     8 g = genner()
     9 #print(g)  print(g)
    10 '''
    11 111
    12 222
    13 333
    14 444
    15 '''
    16 print(g.__next__())
    17 print(g.__next__())

    yield 的功能:

    1.函数中使用yield,可以将函数变成生成器

    2.返回给调用者的值

    3.并将指针停留在当前位置 

    生成器方法调用时,不会立即执行,需要调用next()方法,或者for循环来执行,使用for循环不用自己捕获StopIteration异常。

    generator和函数的执行流程不一样。函数是顺序执行,遇到return语句或者最后一行函数语句就返回。而变成generator的函数,在每次调用next()的时候执行,遇到yield语句返回,再次执行时从上次返回的yield语句处继续执行。

     三、斐波那契数列

    斐波那契数列:

    除第一个和第二个数外,任意一个数都可由前两个数相加得到 1, 1, 2, 3, 5, 8, 13, 21, 34....  f(n) = f(n - 1) + f(n - 2) n >= 2

    使用递归:

     1 def fib(n):
     2     if n <= 1:
     3         return 1
     4     else:
     5         return (fib(n - 1) + fib(n - 2))
     6 
     7 
     8 for i in range(10):
     9     print(fib(i))
    10 
    11 
    12 #1,1,2,3,5,8,13,21,34,55

    fib函数实际上是定义了斐波拉契数列的推算规则,可以从第一个元素开始,推算出后续任意的元素,这种逻辑其实非常类似generator

     1 def fib(n):
     2     if n <= 1:
     3         return 1
     4     else:
     5         return (fib(n - 1) + fib(n - 2))
     6 
     7 def fib_num():
     8     for i in range(10):
     9         yield  fib(i)
    10 
    11 g = fib_num()
    12 for i in g:
    13     print(i)
  • 相关阅读:
    Jetty开发指导:WebSocket介绍
    Python处理JSON
    聚焦数据可视化之中的一个--沃尔马怎样利用数据可视化依据实时社交数据调整採购和仓储计划?
    刚刚在寻找微博
    2010级信管毕业生实习总结汇编版(共29份)
    推荐杀毒软件
    Windows Server 2008 R2 下载地址
    在myeclipse中使用log4j记录日志
    获取Tomcat更详细的日志
    java.lang.ClassNotFoundException: org.apache.commons.fileupload.FileItemFactory
  • 原文地址:https://www.cnblogs.com/weihengblog/p/8423586.html
Copyright © 2011-2022 走看看