`
jack_boy
  • 浏览: 135357 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

python中的生成器

阅读更多
Python中的生成器

1. 什么是生成器:
在《Python核心编程》中有个定义:
《Python核心编程》 写道
挂起返回出中间值并多次继续的协同程序被称为生产器,那就是Python的生成器真正做的事情

那么什么是协同程序呢?
《Python核心编程》 写道
协同程序是可以运行的独立函数调用,可以暂停或者挂起,并从程序离开的地方继续或者重新开始

首先可以理解为:
  • 生成器是函数
  • 生成器可以在执行过程中返回中间值,并继续执行。


2. python中的生成器
在python中生成器就是一个带yield的函数,yield能返回一个值给调用者,并暂停运行,当生成器的next()方法被调用的时候,它会继续从离开的地方继续

3. 示例
def fab(max):
      n, a, b = 0, 0, 1
      while n < max:
            yield b
            a, b = b, a + b
            n = n + 1

>>> f = fab(5)
>>> f.next()
>>> 1
>>> f.next()
>>> 1
>>> f.next()
>>> 2
>>> f.next()
>>> 3
>>> f.next()
>>> 5

>>> f = fab(5)
>>> for i in f:
....   print i

1
1
2
3
5

4.运用场景
乍一看,生成器和迭代器差不多,功能也很相似,那么什么情况下用生成器呢。
一个明显的运用场景是要处理一个大的数据集的时候,比如一个10G的文件,
如果用迭代的话,会产生很大的内存占用,如果用生成器的话就不会有这个问题

引用
列表解析式:
[expr for iter_var in iterable if cond_expr]

引用
生成器表达式:
(expr for iter_var in iterable if cond_expr)

比如一个10G的文件test_large
迭代式:
In [29]: f = open('test_large')
In [35]: sum([len(word) for line in f for word in line.split()])

在运行过程中用pmap查看其内存占用
total   294096K
这个结果是我在运行中查看的,只运行了10s左右
生成器:
In [32]: f.seek(0)
In [33]: sum(len(word) for line in f for word in line.split())

在运行过程中用pmap查看其内存占用
total    32024K
这个内存占用量直到运行结束都是这么多

引用
这仅仅是因为一个语言这样的特征不意味着你需要用它。如果在你程序里没有明显适合的话,那就别增加多余的复杂性!当你遇到合适的情况时,你便会知道什么时候生成器正是要使用的东西。


5. 在tornado中的运用
这个并没有详细的研究,只是遇到的时候使用,在tornado中主要是在异步机制中会用到yield。
        @tornado.gen.coroutine
        def get(self):
                res = yield self.db.welecome.find_one()
                res = res['message']
                self.render('index.html', message="hello world", tick=res)

内部机制如何没有仔细研究,这应该是生成器运动的一个场景,需要长时间执行的程序

6. 总结
  • 大数据集使用生成器
  • 需要长时间运行的操作,防止阻塞,不过需要借助其它的机制转换成异步操作,如celery
0
6
分享到:
评论

相关推荐

    Python中生成器和迭代器的区别详解.docx

    Python中生成器和迭代器的区别详解.docx

    Python代码生成器1.0内测版

    您是否在学习Python的路程中感觉路程漫漫?是否曾经半途而废? 是否感觉该学的内容众多? 因为先前编过《信手拈来按键帮你来》所以这里秉承了它的理念。 以Delphi语言开发的,内置百款实例代码,从速借鉴、高效开发...

    Python中生成器和迭代器的区别详解

    Python中生成器和迭代器的区别(代码在Python3.5下测试): Num01–&gt;迭代器 定义: 对于list、string、tuple、dict等这些容器对象,使用for循环遍历是很方便的。在后台for语句对容器对象调用iter()函数。iter()是python...

    python二维码生成器

    python二维码生成器

    python 二维码生成器源码

    Python 二维码生成器是一种能够使用Python编程语言生成二维码图像的软件。它可以通过控制台或者导入模块的方式使用,可以生成各种格式的二维码,包括PNG、JPEG、GIF等格式,还可以生成带有文字、图片、链接等信息的...

    小白必看Python词云生成器详细解析及代码实现

    【小白必看】Python词云生成器详细解析及代码实现, 资源内容是词云图代码文件及相关资源,用于测试代码的实现.【小白必看】Python词云生成器详细解析及代码实现, 资源内容是词云图代码文件及相关资源,用于测试代码的...

    Python中生成器和yield语句的用法详解

    主要介绍了Python中生成器和yield语句的用法,生成器是Python编程进阶中的重要知识点,需要的朋友可以参考下

    NFT人物头像随机生成器Python源码

    # NFT人物头像随机生成器Python源码 1. 提供眼睛、眉毛、鼻子、脸等多部位图层素材; 2. 随机合成人物头像,可作为NFT艺术品。

    python3 简单密码生成器

    利用Python3的模块,实现简单的密码生成器,通过指定组成密码的字符及密码长度,生成全部组合的密码。

    python参数生成器

    python设备参数生成器

    Python海报生成器源码

    海报编辑器最左侧是组件...快速:三步完成海报开发工作:启动服务 &gt; 编辑海报 &gt; 生成代码 简单:组件丰富、支持拖拽、复制、所见即所得、下载等功能。 动态:无需更改代码,直接在编辑器修改海报即可获得最新的海报。

    理解python中生成器用法

    本篇文章给大家详细介绍了python中的生成器用法以及原理,有兴趣的朋友参考学习下吧。

    汽车VIN码生成 python

    Python版的汽车WIN码生成器 汽车行业可能需要

    Python程序设计:菜单生成器.pptx

    菜单生成器 任务 菜单生成器 任务背景 运用元组相关知识,编写一个程序,要求输入菜品和它的价格,格式化打印该菜单。 本案例主要针对元组的基本使用的考察,元组是不可变序列,创建元组可以通过()创建,也可以通过...

    Python代码生成器内测版1.0.zip

    系统全局Python环境是相当重要的(安装时切忌勾选左下角复选框) 以Delphi语言开发的,内置百款实例代码,从速借鉴、高效开发 1.积木式编程理念,快速拼出您想要的工具,弥补某些软件自身的不足 2.带给不懂编程人员...

    学学Python_50类的成员09 生成器方法和模拟生成器

    模拟生成器,生成器的方法,对应文件:ClassElement9,文章:https://blog.csdn.net/yysyangyangyangshan/article/details/84729103

    Python-SphinxPythonPython文档生成器列表

    Sphinx PythonPython文档生成器列表

Global site tag (gtag.js) - Google Analytics