您的位置:首页 > 编程语言 > Python开发

python生成器学习

2016-11-25 17:07 309 查看
## python生成器学习 ##
根据廖大的python教程[廖雪峰python教程](http://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000),我们使用python的列表生成式,可以直接生成列表:
`L=[x for x in range(10)]`
但是这种方式比较耗内存,当我们要生成很大数量的数据时,要占很大部分的内存。有时我们要做的仅仅是按需求取出一个数列的前n个数字,这样的话就可以使用python中的生成器来实现需要的功能。
例:
`g = (x for x in range(10))`
**注意**:创建列表生成式,需要把生成列表的**[]**变成**()**即可。当我们要取出生成器中的数据时,可以通过next()来得到下一个值:
![生成器获取数值举例](https://img-blog.csdn.net/20161125164835602)
当我们使用生成器取出最后一个值,没有多余的值可取的时候,会抛出StopIteration错误。
在廖大的教程中,生成器部分出了一道斐波那契数列[这里写链接内容](https://zh.wikipedia.org/zh-cn/%E6%96%90%E6%B3%A2%E9%82%A3%E5%A5%91%E6%95%B0%E5%88%97)的题目,要求使用生成器打印出斐波那契数列,先将解题思路记录下来:
廖大期望的输出如下:
![期待的输出](https://img-blog.csdn.net/20161125165735012)
首先让我们看看规律:

1
1    1
1    2    1
1    3    3    1
**rule1:** 对于每一列col = 0,都有L[:,0] = 1
**rule2:** 对于每一行和每一列相等row = col = n,都有L

= 1
**rule3:** 对于上述两条规则作用之外的部分,又L[i][j] = L[i-1][j-1]+L[i-1][j]
根据上述三个规则,我们编写如下代码:

```
def fib():
L = [1]
while True:
yield L
L.append(0)
L = [L[i-1]+L[i] for i in range(len(L))]

```
现在我们模拟程序运行的过程:
第一次:
打印 L,因为L之前赋值为L=[1],所以结果为:[1]
第二次:
此时,代码执行L.append(0),那么L应为[1,0],此时len(L)值为2,那么range(2)应[0,1],当i的取值为0时,L = [L[-1]+L[0]],注意,此时L[0]为1,L[-1]为列表[0,1]的最后一个元素,就是1喽。当i=1的情况可以按此推到。所以,循环第二次,列表L的值为**[1,1]**
第三次:
此时,代码执行L.append(0),那么L应为[1,1,0],此时len(L)值为3,那么range(3)就应该时[0,1,2],当i=0时,L=[L[-1]+L[0]]=[1],当i=1时,L=[1,2],当i=3时,L=[1,2,1]。
之后的情况,可以按第三次循环的描述继续推导。
python的代码如下:


def fib():
L = [1]
while True:
yield L
L.append(0)
L = [L[i-1]+L[i] for i in range(len(L))]

n = 0
for t in fib():
print(t)
n = n+1
if n == 5:
break


运行结果如下:

![斐波那契运行结果](https://img-blog.csdn.net/20161125213019067)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  python