编者注:本文主要参考了《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. Vue-cli搭建完项目,各文件解释

    脚手架vue-cli搭建完成后,会生成一些文件,总结学习一下这些文件是做什么用的:1.一级目录: build和config文件夹是wbepack配置的文件夹: node_modules是在我npm i ...

  2. PHP error_reporting() 错误控制函数功能详解

    定义和用法: error_reporting() 设置 PHP 的报错级别并返回当前级别.   函数语法: error_reporting(report_level)   如果参数 level 未指定 ...

  3. 怎样实现给DEDE的栏目增加栏目图片(1)

    http://www.genban.org/news/dedecms-7577.html 前两天用DEDE做二次开发的时候,遇到一个问题,领导让给每个栏目增加一个栏目图片的功能,网上找了些东西,结合自 ...

  4. 30分钟学玩转RabbitMQ

    最近在学习RabbitMQ,在网上找了不少资料发现都特高端.动辄集群部署,分布式架构什么的,对于一个初学者实在不够友好.心想求人不如求自己,为什么不自己整理一套资料呢?于是<30分钟学玩转Rab ...

  5. servlet多线程问题

    Servlet本身是单实例的,这样当多个用户同时访问某个Servlet时,会访问该唯一的Servlet实例中的成员变量,如果对成员变量进行写入工作,那就会导致Servlet的多线程问题,即数据不一致. ...

  6. Python使用requests模块访问HTTPS网站报错`certificate verify failed`

    使用requests模块访问HTTPS网站报错: SNIMissingWarning: An HTTPS request has been made, but the SNI (Subject Nam ...

  7. python_如何为元组中每个元素命名

    学生信息系统: (名字,年龄,性别,邮箱地址) 为了减少存储开支,每个学生的信息都以一个元组形式存放 如: ('tom', 18,'male','tom@qq.com' ) ('jom', 18,'m ...

  8. Linux指令--ln

    ln是linux中又一个非常重要命令,它的功能是为某一个文件在另外一个位置建立一个同步的链接.当我们需要在不同的目录,用到相同的文件时,我们不需要在每一个需要的目录下都放一个必须相同的文件,我们只要在 ...

  9. grails项目数据源配置

    grails项目数据源配置 mysql: driverClassName : com.mysql.jdbc.Driver url: jdbc:mysql://127.0.0.1:3306/mysql ...

  10. UUID.randomUUID().toString()

    UUID.randomUUID().toString()是javaJDK提供的一个自动生成主键的方法.UUID(Universally Unique Identifier)全局唯一标识符,是指在一台机 ...