Python中什么时候使用生成器?
编者注:本文主要参考了《Python核心编程(第二版)》
说到生成器,先说说列表解析。列表解析可以动态创建列表。
[expr for iter_var in iterable if cond_expr]
该句的核心是 for循环,它迭代了iterable对象的所有条目。如果满足cond_expr(条件表达式),则前面的expr(表达式)应用于该成员。最后生成的是满足条件的元素的该表达式的列表。对于lambda,map(),filter()等可以通过列表解析简化为一个列表解析式。 首先看看这三个函数的作用:
map(lambda x:x**2, range(6))
>>>[0, 1, 4, 9, 16, 25]
lambda 输入参数:输出表达式 允许创建一行函数对象,不用def定义,简化代码
map(操作,需要操作的列表) 对所有列表成员应用一个操作
可以用列表解析来简化上面的操作:
[x**2 for x in range(6)]
>>>[0, 1, 4, 9, 16, 25]
同样也可以用列表解析来简化filter()操作,比如:
seq = [11, 10, 1, 9, 10, 2, 3, 44, 12, 11]
print filter(lambda x: x % 2, seq)
>>>[11, 1, 9, 3, 11]
可以用列表解析来简化上面的操作:
print [x for x in seq if x % 2]
>>>[11, 1, 9, 3, 11]
生成器是列表解析的一个拓展。
(expr for iter_var in iterable if cond_expr)
它与列表解析器非常相似,且语法基本相同,但不是真正创建列表而是生成一个生成器。这个生成器在每次计算出一个条目后,把这个条目“产生(yield)出来”,生成器表达式使用了“延迟计算(lazy evaluation)”,所以它使用内存上更有效。
print (x for x in seq if x % 2)
>>><generator object <genexpr> at 0x00000000025B6AB0>
那到底什么时候使用生成器呢?
当创建列表只是一共中间过程的时候,为了避免创建庞大的列表,我们可以使用生成器表达式来完成。比如,我们要计算一篇txt文本的单词数时,我们没必要先将列表生成再计算单词数。
f = open('*.txt','r')
len([word for line in f for word in line.split()]) #使用列表解析,先生成列表后计数
len(word for line in f for word in line.split()) #使用生成器,对返回的生成器计数,没有生成列表
所做的只是把方括号去掉,不但少了两个字节,更节省了内存。
这让我想起了使用xrange()代替range(),道理是一样的。xrange返回一个生成器,而range返回一个列表。
Python中什么时候使用生成器?的更多相关文章
- python is、==区别;with;gil;python中tuple和list的区别;Python 中的迭代器、生成器、装饰器
1. is 比较的是两个实例对象是不是完全相同,它们是不是同一个对象,占用的内存地址是否相同 == 比较的是两个对象的内容是否相等 2. with语句时用于对try except finally 的优 ...
- python中的迭代、生成器等等
本人对编程语言实在是一窍不通啊...今天看了廖雪峰老师的关于迭代,迭代器,生成器,递归等等,word天,这都什么跟什么啊... 1.关于迭代 如果给定一个list或tuple,我们可以通过for循环来 ...
- Python中的迭代器和生成器
本文以实例详解了python的迭代器与生成器,具体如下所示: 1. 迭代器概述: 迭代器是访问集合元素的一种方式.迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束.迭代器只能往前不会后 ...
- python中的迭代器和生成器学习笔记总结
生成器就是一个在行为上和迭代器非常类似的对象. 是个对象! 迭代,顾名思意就是不停的代换的意思,迭代是重复反馈过程的活动,其目的通常是为了逼近所需目标或结果.每一次对过程的重复称为一次“迭代”,而 ...
- python中的迭代器与生成器
迭代器 迭代器的引入 假如我现在有一个列表l=['a','b','c','d','e'],我想取列表中的内容,那么有几种方式? 1.通过索引取值 ,如了l[0],l[1] 2.通过for循环取值 fo ...
- python中的函数、生成器的工作原理
1.python中函数的工作原理 def foo(): bar() def bar(): pass python的解释器,也就是python.exe(c编写)会用PyEval_EvalFramEx(c ...
- 终于理解Python中的迭代器和生成器了!
迭代器和生成器 目录 迭代器和生成器 可迭代对象和迭代器 基础概念 判断 for循环本质 不想用for循环迭代了,如何使用迭代器? 列表推导式 生成器Generator 概念 如何实现和使用? 生成器 ...
- Python中的迭代器、生成器
from collections import Iterable, Iterator 1. 可迭代(iterable)对象 参考官网链接 class I: def __init__(self, v): ...
- Python 中列表生成式和生成器
列表生成式 即List Comprehensions,是Python内置的非常简单却强大的可以用来创建list的生成式. 举个例子,要生成list [1,2,3,4,5,6,7,8,9,10]可以用l ...
随机推荐
- oracle分页查询及原理分析(总结)
oracle分页查询及原理分析(总结) oracle分页查询是开发总为常用的语句之一,一般情况下公司框架会提供只需套用,对于增删改查而言,查是其中最为关键也是最为难的一块,其中就有使用率最高的分页查询 ...
- C++ 初始化列表(转)
转载自:http://www.cnblogs.com/graphics/archive/2010/07/04/1770900.html 何谓初始化列表 与其他函数不同,构造函数除了有名字,参数列表和函 ...
- hbase伪分布式安装(单节点安装)
hbase伪分布式安装(单节点安装) http://hbase.apache.org/book.html#quickstart 1. 前提配置好java,环境java变量 上传jdk ...
- 十二个 ASP.NET Core 例子——IOC
目录 简单介绍 core自带IOC的实现解释 1.简单介绍 (个人理解) 是什么:IOC是一种设计原则,而非设计模式,是对流程控制,当你注入你需要的定制化类时,流程就确定了 怎么用:和IOC容器说你这 ...
- vue.js打包后,接口安全问题
后面有一位朋友回答后台origin判断,但另一个朋友说可以通过代理请求就绕过跨域. 想想也对,代理的话origin就无效了,页面还是可以跑起来. 不知道有没有人想过这个问题,还是我想的方向有误,请各位 ...
- [转载]织梦CMS首页调用分类信息栏目及列表方法
原文地址:织梦CMS首页调用分类信息栏目及列表方法作者:小武哥 不懂代码,搜索学习一晚上,都是说调用特定栏目分类信息列表的,用这个代码 {dede:arclistsg row='10' titlele ...
- jQuery学习笔记一
一.jQuery版本兼容 jQuery版本2以上不支持IE6,7,8浏览器. 如果需要支持IE6/7/8,那么请选择1.9 同样还可以通过条件注释在使用IE6/7/8时只包含进1.9 <!--[ ...
- CentOS 7安装
使用U盘安装 1.CentOS 7系统镜像制作U盘启动盘 1).下载CentOS 7系统镜像 下载地址:http://mirrors.aliyun.com/centos/7/isos/x86_64/ ...
- Linux - ubuntu中vi不能正常使用方向键与退格键的问题
一度怀疑是键盘坏了! 之前安装solaris也是这个问题! 重新安装vim就可以了! $sudo apt-get remove vim-common $sudo apt-get install vim
- 从(0,0)到(m,n),每次走一步,只能向上或者向右走,有多少种路径走到(m,n)
body, table{font-family: 微软雅黑; font-size: 10pt} table{border-collapse: collapse; border: solid gray; ...