24_生成器、斐波那契数列
2018-02-06 18:34
239 查看
一、生成器概念
通过列表生成式,我们可以直接创建一个列表。但是,受到内存限制,列表容量肯定是有限的。而且,创建一个包含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)
相关文章推荐
- 斐波那契数列(Fibonacci sequence)Python实现的三种方案:列表 递归 生成器
- 斐波那契数列与生成器
- 生成器的创建方法,以及斐波那契数列的生成器的实现
- python yield 生成器基本内容及实现斐波那契数列
- python 用生成器生成斐波那契数列
- 分别用的列表,递归,生成器三种方式创建出n个元素的斐波那契数列(Python3实现)
- 13.3Python基础拾遗(3):斐波那契数列的递归、非递归、生成器实现
- fib 斐波那契数列生成器
- JavaScript趣题:斐波那契数列生成器
- python--生成器写斐波那契数列
- 【网络流24题】运输问题(费用流)
- [VB.NET源码]24_列表视图控件
- Ruby实现斐波那契数列
- 【网络流24题】深海机器人问题(费用流)
- 用 Groovy 生成器作标记
- [BZOJ3122][Sdoi2013]随机数生成器(BSGS)
- 一步一步学Silverlight 2系列(24):与浏览器交互相关辅助方法
- 2016阿里实习线上笔试题-附加题1-随机数生成器
- LOJ6001 - 「网络流 24 题」太空飞行计划