先回顾列表解释

 lista = range(10)
listb = [elem * elem for elem in lista]

那么listb就将会是0至9的二次方。

现在有这么一个需求,需要存储前10个斐波那契数到硬盘。

那么先写产生斐波那契数的函数:

 def fib(max):
n,a,b = 0,0,1
while n < max:
print(b)
a,b = b,a + b
n+=1

这样就会打印出前max个斐波那契数了。接着我们再修改一下。(因为我们需要的是存到硬盘里)

 fiblist = []
def fib(max):
n,a,b = 0,0,1
while n < max:
fiblist.append(b)
a,b = b,a + b
n+=1 fib(10)
print(fiblist)

接下来就可以操作fiblist保存到硬盘里了。

这样做可能我们操作前10个、前100个或许没有问题,但是假如某天业务需求要存十万个那就倒霉了。fiblist的长度得要十万,内存都撑不下了。这怎么办,直接修改fib函数,让其直接写入硬盘而不是追加到列表?但如果某天业务逻辑又改了怎么办,不存硬盘了,存数据库了。这显然不是好办法。

Python中有一个关键字,叫yield,就是可以解决这种问题的。

修改代码:

 def fib(max):
n,a,b = 0,0,1
while n < max:
yield b
a,b = b,a + b
n+=1 temp = fib(10)
print(temp)

现在,输出的则变成了<generator object fib at 0x0354FC10>

PS:at后面的0x部分可能有不同。

这是什么东西呢?这就是Python中的生成器。也就是一个可遍历对象。

既然可遍历,那么我们就可以使用for语句了

 def fib(max):
n,a,b = 0,0,1
while n < max:
yield b
a,b = b,a + b
n+=1 for i in fib(10000):
#do something
pass

现在该干什么就干什么吧,内存不会撑爆了。

另外,Python中的列表解释还能够快速改为生成器:

 l = [elem * elem for elem in range(10)]

这是列表解释,而改为生成器:

 g = (elem * elem for elem in range(10))

区别就只是将[]改为()

总结:

生成器就像是C#中的IEnumerable接口(这并不准确,准确是含GetEnumerator的方法)

Python学习-39.Python中的生成器的更多相关文章

  1. Python学习day09 - Python进阶(3)

    figure:last-child { margin-bottom: 0.5rem; } #write ol, #write ul { position: relative; } img { max- ...

  2. Python学习day05 - Python基础(3) 格式化输出和基本运算符

    figure:last-child { margin-bottom: 0.5rem; } #write ol, #write ul { position: relative; } img { max- ...

  3. Python学习笔记6-Python中re(正则表达式)模块学习

    今天学习了Python中有关正则表达式的知识.关于正则表达式的语法,不作过多解释,网上有许多学习的资料.这里主要介绍Python中常用的正则表达式处理函数. re.match re.match 尝试从 ...

  4. Python学习day07 - Python进阶(1) 内置方法

    figure:last-child { margin-bottom: 0.5rem; } #write ol, #write ul { position: relative; } img { max- ...

  5. Python学习笔记—Python基础1 介绍、发展史、安装、基本语法

    第一周学习笔记: 一.Python介绍      1.Python的创始人为吉多·范罗苏姆.1989年的圣诞节期间,吉多·范罗苏姆为了在阿姆斯特丹打发时间,决心开发一个新的脚本解释程序,作为ABC语言 ...

  6. python学习笔记-python程序运行

    小白初学python,写下自己的一些想法.大神请忽略. 安装python编辑器,并配置环境(见http://www.cnblogs.com/lynn-li/p/5885001.html中 python ...

  7. python学习: 优秀Python学习资源收集汇总--转

    Python是一种面向对象.直译式计算机程序设计语言.它的语法简捷和清晰,尽量使用无异义的英语单词,与其它大多数程序设计语言使用大括号不一样,它使用縮进来定义语句块.与Scheme.Ruby.Perl ...

  8. Python学习(002)--Python介绍

    一. Python介绍 python的创始人为吉多·范罗苏姆(Guido van Rossum).1989年的圣诞节期间,吉多·范罗苏姆为了在阿姆斯特丹打发时间,决心开发一个新的脚本解释程序,作为AB ...

  9. 总结:Python学习 和 Python与C/C++交互

    本篇仅仅是Python的学习和Python和C++数据对接过程中的一些总结. 由于工作的需要,用一周的时间学习 Python. Python是基于C实现的一门解释型语言,由于其易用性,俘获了不少开发者 ...

随机推荐

  1. 使用Fiddler发送POST请求

    使用Fiddler发送POST请求 在测试过程中,有时会遇到需要修改请求中带的参数,去验证权限的安全问题,但是一些post请求,我们在浏览器中不能直接修改他的参数,然后去提交验证. 而fiddler可 ...

  2. maven向本地库添加jar包

    mvn install:install-file -DgroupId=com.lowagie -DartifactId=itextasian -Dversion=1.0 -Dpackaging=jar ...

  3. cf-Round541-Div2-F(并查集+静态链表)

    题目链接:http://codeforces.com/contest/1131/problem/F 思路: 很容易看出这是一道并查集的题目,因为要输出每个cage中住的鸟的编号,故采用静态链表.用l[ ...

  4. Oracle的下载、安装和配置

    win10下Oracle的下载.安装和配置     --------------siwuxie095                 1.首先到Oracle官网下载Oracle,中文版官网,传送阵:点 ...

  5. TZOJ 4865 统计单词数(模拟字符串)

    描述 一般的文本编辑器都有查找单词的功能,该功能可以快速定位特定单词在文章中的位置,有的还能统计出特定单词在文章中出现的次数. 现在,请你编程实现这一功能,具体要求是:给定一个单词,请你输出它在给定的 ...

  6. php 的 PHPExcel1.8.0 使用教程

    PHPExcel是用来操作Office Excel文档的一个PHP类库,它基于微软的OpenXML标准和PHP语言.可以使用它来读取.写入不同格式的电子表格.   一.下载PHPExcel http: ...

  7. nginx accept() failed (24: Too many open files)

    nginx服务器出现如下信息: [crit] 17221#0: accept4() failed (24: Too many open files) [crit] 17221#0: accept4() ...

  8. linux下一些常用系统命令

    查看系统打开的文件数 lsof|wc -l 查看当前目录下的文件数 find -type f | wc -l 查看某个目录下的文件数,注意这里/home包括其所有子目录 find /home -typ ...

  9. iOS.Dev.Guru

    1. Ricardo Quesada Cocos2d https://github.com/ricardoquesada http://www.elance.com/s/rquesada/ 2. Je ...

  10. jQuery 操作 html5 data-* 属性

    Html 部分: <a class="nav-item" href="javascript: void(0)" data-id="{{$item ...