编者注:本文主要参考了《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中什么时候使用生成器?的更多相关文章

  1. python is、==区别;with;gil;python中tuple和list的区别;Python 中的迭代器、生成器、装饰器

    1. is 比较的是两个实例对象是不是完全相同,它们是不是同一个对象,占用的内存地址是否相同 == 比较的是两个对象的内容是否相等 2. with语句时用于对try except finally 的优 ...

  2. python中的迭代、生成器等等

    本人对编程语言实在是一窍不通啊...今天看了廖雪峰老师的关于迭代,迭代器,生成器,递归等等,word天,这都什么跟什么啊... 1.关于迭代 如果给定一个list或tuple,我们可以通过for循环来 ...

  3. Python中的迭代器和生成器

    本文以实例详解了python的迭代器与生成器,具体如下所示: 1. 迭代器概述: 迭代器是访问集合元素的一种方式.迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束.迭代器只能往前不会后 ...

  4. python中的迭代器和生成器学习笔记总结

    生成器就是一个在行为上和迭代器非常类似的对象.   是个对象! 迭代,顾名思意就是不停的代换的意思,迭代是重复反馈过程的活动,其目的通常是为了逼近所需目标或结果.每一次对过程的重复称为一次“迭代”,而 ...

  5. python中的迭代器与生成器

    迭代器 迭代器的引入 假如我现在有一个列表l=['a','b','c','d','e'],我想取列表中的内容,那么有几种方式? 1.通过索引取值 ,如了l[0],l[1] 2.通过for循环取值 fo ...

  6. python中的函数、生成器的工作原理

    1.python中函数的工作原理 def foo(): bar() def bar(): pass python的解释器,也就是python.exe(c编写)会用PyEval_EvalFramEx(c ...

  7. 终于理解Python中的迭代器和生成器了!

    迭代器和生成器 目录 迭代器和生成器 可迭代对象和迭代器 基础概念 判断 for循环本质 不想用for循环迭代了,如何使用迭代器? 列表推导式 生成器Generator 概念 如何实现和使用? 生成器 ...

  8. Python中的迭代器、生成器

    from collections import Iterable, Iterator 1. 可迭代(iterable)对象 参考官网链接 class I: def __init__(self, v): ...

  9. Python 中列表生成式和生成器

    列表生成式 即List Comprehensions,是Python内置的非常简单却强大的可以用来创建list的生成式. 举个例子,要生成list [1,2,3,4,5,6,7,8,9,10]可以用l ...

随机推荐

  1. oracle分页查询及原理分析(总结)

    oracle分页查询及原理分析(总结) oracle分页查询是开发总为常用的语句之一,一般情况下公司框架会提供只需套用,对于增删改查而言,查是其中最为关键也是最为难的一块,其中就有使用率最高的分页查询 ...

  2. C++ 初始化列表(转)

    转载自:http://www.cnblogs.com/graphics/archive/2010/07/04/1770900.html 何谓初始化列表 与其他函数不同,构造函数除了有名字,参数列表和函 ...

  3. hbase伪分布式安装(单节点安装)

    hbase伪分布式安装(单节点安装) http://hbase.apache.org/book.html#quickstart   1.    前提配置好java,环境java变量     上传jdk ...

  4. 十二个 ASP.NET Core 例子——IOC

    目录 简单介绍 core自带IOC的实现解释 1.简单介绍 (个人理解) 是什么:IOC是一种设计原则,而非设计模式,是对流程控制,当你注入你需要的定制化类时,流程就确定了 怎么用:和IOC容器说你这 ...

  5. vue.js打包后,接口安全问题

    后面有一位朋友回答后台origin判断,但另一个朋友说可以通过代理请求就绕过跨域. 想想也对,代理的话origin就无效了,页面还是可以跑起来. 不知道有没有人想过这个问题,还是我想的方向有误,请各位 ...

  6. [转载]织梦CMS首页调用分类信息栏目及列表方法

    原文地址:织梦CMS首页调用分类信息栏目及列表方法作者:小武哥 不懂代码,搜索学习一晚上,都是说调用特定栏目分类信息列表的,用这个代码 {dede:arclistsg row='10' titlele ...

  7. jQuery学习笔记一

    一.jQuery版本兼容 jQuery版本2以上不支持IE6,7,8浏览器. 如果需要支持IE6/7/8,那么请选择1.9 同样还可以通过条件注释在使用IE6/7/8时只包含进1.9 <!--[ ...

  8. CentOS 7安装

    使用U盘安装 1.CentOS 7系统镜像制作U盘启动盘 1).下载CentOS 7系统镜像 下载地址:http://mirrors.aliyun.com/centos/7/isos/x86_64/ ...

  9. Linux - ubuntu中vi不能正常使用方向键与退格键的问题

    一度怀疑是键盘坏了! 之前安装solaris也是这个问题! 重新安装vim就可以了! $sudo apt-get remove vim-common $sudo apt-get install vim

  10. 从(0,0)到(m,n),每次走一步,只能向上或者向右走,有多少种路径走到(m,n)

    body, table{font-family: 微软雅黑; font-size: 10pt} table{border-collapse: collapse; border: solid gray; ...