编者注:本文主要参考了《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. springboot注解使用说明

    springboot注解 @RestController和@RequestMapping注解 我们的Example类上使用的第一个注解是 @RestController .这被称为一个构造型(ster ...

  2. 防止ajax重复提交

    在jquery中防止ajax重复提交

  3. windows平台下python 打包成exe可执行文件

    第一步 安装 pyinstaller 命令行下运行:pip install pyinstaller 第二步 打包安装 pyinstaller Test.py 第三步 完成 找到打包目录下dist目录  ...

  4. Tomcat 源码分析(二)——Request处理全过程

    前一篇博客,我总结了Tomcat对于生命周期组件的管理.在了解了容器的启动之后,我们开始剖析它的内部运行机制.今天我们来分析一下Tomcat如何处理Request.Socket作为网络通信的基础也是R ...

  5. DESTOON B2B标签(tag)调用手册

    路径:include/tag.func.php 1.标签格式的大致说明 {tag("moduleid=9&table=article_9&length=40&cond ...

  6. 关于MacOS升级10.13系统eclipse菜单灰色无法使用解决方案

    最近,苹果发布了macOS High Sierra,版本为10.13,专门针对mac pro的用户来着,至于好处大家到苹果官网看便是,我就是一个升级新版本系统的受益者,同时也变成了一个受害者:打开ec ...

  7. mysql插入数据后返回自增ID的方法,last_insert_id(),selectkey

    mysql插入数据后返回自增ID的方法 mysql和oracle插入的时候有一个很大的区别是,oracle支持序列做id,mysql本身有一个列可以做自增长字段,mysql在插入一条数据后,如何能获得 ...

  8. Hystrix-异常处理

    异常的传播和捕获 传播:在HystrixCommand实现的run()方法中跑出异常时,除了HystrixBadRequestException之外,其他异常均会被Hystrix认为命令执行失败并处罚 ...

  9. 针对php脚本文件执行锁定的代码,避免脚本在同一时间重复运行

    <?php//针对php脚本文件执行锁定的代码,避免脚本在同一时间重复运行,http://ken.01h.net/define('PHP_LOCK_FILE', dirname(__FILE__ ...

  10. iris数据集 决策树实现分类并画出决策树

    # coding=utf-8 import pandas as pd from sklearn.model_selection import train_test_split from sklearn ...