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实现的一门解释型语言,由于其易用性,俘获了不少开发者 ...
随机推荐
- Linux下启动Tomcat启动并显示控制台日志信息
Linux下如何启动Tomcat像Windows启动并显示控制台日志信息一样? Windows下启动tomcat,一般直接运行startup.bat,启动后如下图所示: Linux下直接启动./sta ...
- padright padleft
在 C# 中可以对字符串使用 PadLeft 和 PadRight 进行轻松地补位. PadLeft(int totalWidth, char paddingChar) //在字符串左边用 paddi ...
- html标签对应的英文原文(转载)
标签 对应英文 说明 <!--> / 注释 <!DOCTYPE> document type 文档类型 <a> anchor 超链接 <abbr> a ...
- 人机大战中AlphaGo及其执子人黄士杰
2016年3月9日注定要写入围棋界的历史.IT界的历史以及科学界的历史.当天,韩国著名围棋棋手李世石VS谷歌AlphaGo的人机大战赛在韩国首尔举行.对弈的一方为拥有1200多个处理器的谷歌人工智能系 ...
- 分割回文串 · Palindrome Partitioning
[抄题]: 给定一个字符串s,将s分割成一些子串,使每个子串都是回文串. 返回s所有可能的回文串分割方案. 给出 s = "aab",返回 [ ["aa", & ...
- Maven核心简析
本文以类图的方式,介绍maven核心的12个概念以及相互之间的关系. Table of Contents 1 maven管理的目标:工程(Project) 1.1 工程依赖关系 1.2 工程聚合关系 ...
- VideoView的全屏问题
package com.bi.standardcompuse.app.widgets; import android.content.Context;import android.util.Attri ...
- cmake重新编译
删除文件夹下的文件 rm CMakeCache.txt 重新编译即可 安装g++ yum install gcc-c++
- [SoapUI] 配置默认环境的properties
<Envs> <Env id="Live,Default environment"> <Project> <CusProperty nam ...
- pip安装包
默认的在安装文件的Lib\site-packages\路径下面 cmd窗口 cd切换路径:C:\Users\admin\AppData\Local\Programs\Python\Python36\S ...