Python学习-39.Python中的生成器
先回顾列表解释
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中的生成器的更多相关文章
- Python学习day09 - Python进阶(3)
figure:last-child { margin-bottom: 0.5rem; } #write ol, #write ul { position: relative; } img { max- ...
- Python学习day05 - Python基础(3) 格式化输出和基本运算符
figure:last-child { margin-bottom: 0.5rem; } #write ol, #write ul { position: relative; } img { max- ...
- Python学习笔记6-Python中re(正则表达式)模块学习
今天学习了Python中有关正则表达式的知识.关于正则表达式的语法,不作过多解释,网上有许多学习的资料.这里主要介绍Python中常用的正则表达式处理函数. re.match re.match 尝试从 ...
- Python学习day07 - Python进阶(1) 内置方法
figure:last-child { margin-bottom: 0.5rem; } #write ol, #write ul { position: relative; } img { max- ...
- Python学习笔记—Python基础1 介绍、发展史、安装、基本语法
第一周学习笔记: 一.Python介绍 1.Python的创始人为吉多·范罗苏姆.1989年的圣诞节期间,吉多·范罗苏姆为了在阿姆斯特丹打发时间,决心开发一个新的脚本解释程序,作为ABC语言 ...
- python学习笔记-python程序运行
小白初学python,写下自己的一些想法.大神请忽略. 安装python编辑器,并配置环境(见http://www.cnblogs.com/lynn-li/p/5885001.html中 python ...
- python学习: 优秀Python学习资源收集汇总--转
Python是一种面向对象.直译式计算机程序设计语言.它的语法简捷和清晰,尽量使用无异义的英语单词,与其它大多数程序设计语言使用大括号不一样,它使用縮进来定义语句块.与Scheme.Ruby.Perl ...
- Python学习(002)--Python介绍
一. Python介绍 python的创始人为吉多·范罗苏姆(Guido van Rossum).1989年的圣诞节期间,吉多·范罗苏姆为了在阿姆斯特丹打发时间,决心开发一个新的脚本解释程序,作为AB ...
- 总结:Python学习 和 Python与C/C++交互
本篇仅仅是Python的学习和Python和C++数据对接过程中的一些总结. 由于工作的需要,用一周的时间学习 Python. Python是基于C实现的一门解释型语言,由于其易用性,俘获了不少开发者 ...
随机推荐
- Web标准:一、xhtml css基础知识
说明:这些知识是我看<十天学会DIV+CSS教程完整版 完美整理+完整代码>这篇文章后记下来的一些内容,包括少部分不懂得地方去百度到的一些解释等,该文章的地址: http://wenku. ...
- 让IE浏览器支持CSS3表现
http://www.zhangxinxu.com/wordpress/2010/04/%e8%ae%a9ie6ie7ie8%e6%b5%8f%e8%a7%88%e5%99%a8%e6%94%af%e ...
- zoj1649-Rescue (迷宫最短路径)【bfs 优先队列】
http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=649 Rescue Time Limit: 2 Seconds Mem ...
- window安装设置
https://jingyan.baidu.com/article/73c3ce28ed7d92e50243d96c.html
- DNS/BIND in Debian
Debian official document:http://www.debian.org/doc/manuals/network-administrator/ch-bind.html Buildi ...
- 深入浅出 JMS(三) - ActiveMQ 安全机制
深入浅出 JMS(三) - ActiveMQ 安全机制 一.认证 认证(Authentication):验证某个实体或者用户是否有权限访问受保护资源. MQ 提供两种插件用于权限认证: (一).Sim ...
- OSGi 系列(六)之服务的使用
OSGi 系列(六)之服务的使用 1. 为什么使用服务 降低服务提供者和服务使用者直接的耦合,这样更容易重用组件 隐藏了服务的实现细节 支持多个服务的实现.这样你可以互换这实现 2. 服务的使用 2. ...
- 泛型约束where条件的使用(通过类型参数动态反射创建实例)
定义抽象的人类 using System; using System.Collections.Generic; using System.Linq; using System.Text; using ...
- mathematica里面清除全部变量
基本在一个独立代码开始都写: Clear["Global`*"] (*Clear all variables*) 就可以了
- 2018.10.14 loj#6003. 「网络流 24 题」魔术球(最大流)
传送门 网络流好题. 这道题可以动态建图. 不难想到把每个球iii都拆点成i1i_1i1和i2i_2i2,每次连边(s,i1),(i2,t)(s,i_1),(i_2,t)(s,i1),(i2, ...