文档章节

Python 生成器 generator

ludlows
 ludlows
发布于 2014/10/07 22:55
字数 469
阅读 26
收藏 0
点赞 0
评论 0

生成器给人的感觉就是用非正常的函数语言定义的迭代器。

任何函数,只要有yield语句,都是迭代器。

例如:

nested_list = [[1,2],[3,4],[5]]
def aGen(nested_list):
    for  i in nested_list:
        for j in  i:
            yield j
print list(aGen(nested_list))

生成表达式可以更简单的写出迭代器

例如:

gen = ((i+2)*3 for i in xrange(5))#gen是生成器
print gen
print gen.next()
面对nested_list,如果我们不知道对多进行几层循环时,可以使用递归迭代生成器。

例如:

nested_list = [[1,2],[3,4],[5,6,7,8,9],[10,11],12]
def Recur_Gen(nested):
    try:
        for i in nested:
            for j in Recur_Gen(i):
                yield j
    except TypeError:
        yield nested
print list(Recur_Gen(nested_list))

当然,nested_list中的元素都是数字,如果元素师字符串应该如何处理呢?

这时不能直接迭代,会产生无限循环,因为这样会把字符串分解为单个字母,这时可以加号 + 区分字符串和列表

例如:

nested_list = [['aannn','dfdsff'],[3,4],[5,6,7,8,9],[10,11],12]
def Recur_Gen(nested):
    try:
        try:
            nested + ''
        except TypeError:
            pass
        else:
            raise TypeError
        for i in nested:
            for j in Recur_Gen(i):
                yield j
    except TypeError:
        yield nested
print list(Recur_Gen(nested_list))
在生成器运行过程中,可以利用send与生成器函数内部联系。

例如:

def aGentoRepeat(value):
    while True:
        new = (yield value) #the enterance
        if new is not None:
           value = new
g = aGentoRepeat(12)
print g.next()   # result is: 12
print g.send("oh hi") #result is: oh hi
当然,生成器还有两个函数 throw 和 close
The throw method (called with an exception type, an optional value and traceback object) is used to raise an exception inside the generator (at the yield expression).

The close method (called with no arguments) is used to stop the generator.

close函数会引起GeneratorExit报错,终止生成器。当然,也可以直接raise  GeneratorExit.

在老版本的Python中没有生成器,但是人们有模拟生成器的方法。

例如:

def gen(nested):
    result = []
    try:
        
   
        try:
            nested + ''
        except TypeError: 
            pass
        else: raise TypeError
        for sublist in nested:
            for element in gen(sublist):
                result.append(element)
    except TypeError:
        result.append(nested)
    return result









© 著作权归作者所有

共有 人打赏支持
ludlows
粉丝 0
博文 15
码字总数 4195
作品 0
海淀
程序员
Iterator, Generator 与 Yield

Iterator Iterator(迭代器) 是一种常见的对象,它允许调用者方便的遍历该对象中的元素,广泛的运用于多种编程语言,如 Python, Java 和 Ruby 等。以 Python 为例,Iterator 需要实现两种方法...

koala bear
2016/10/18
0
0
人人都能学会的python编程教程15:高级特性2

生成器 如果你想要一百万个数,而这些数里只有一百个数是你经常要用的,剩下的都几乎不怎么会用到,那么如果直接把这一百万个数全部放在list中是不明智的因为这会浪费较多存储空间,生成器就...

编程老司机
05/10
0
0
Python3+迭代器与生成器

转载Python3 迭代器与生成器 迭代器 迭代是Python最强大的功能之一,是访问集合元素的一种方式。 迭代器是一个可以记住遍历的位置的对象。 迭代器对象从集合的第一个元素开始访问,直到所有的...

xinet
2017/08/12
0
0
Python 迭代器和 生成器

一直以为 Python 的生成器是指 列表生成, 好吧,我读书少。 其实呢,生成器是 使用yield 返回实现了迭代器协议的generator 对象。 如下: def init(self, *args):self._data = list(args)d...

MtrS
2014/12/22
0
0
Supporting Python 3(支持python3)——使用现代的风格改善你的代码

使用现代风格改善你的代码 原文: http://python3porting.com/improving.html 译者: TheLover_Z 一旦你开始使用 Python 3,你就有机会接触新的特性来改善你的代码。这篇文章中提到的很多东西...

在湖闻樟
2015/10/26
0
0
Python迭代对象、迭代器、生成器

在了解Python的数据结构时,容器(container)、可迭代对象(iterable)、迭代器(iterator)、生成器(generator)、列表/集合/字典推导式(list,set,dict comprehension)众多概念参杂在一起,难免让...

关上越
2017/10/23
0
0
Python迭代器生成器,私有变量及列表字典集合推导式(二)

1 python自省机制 这个是python一大特性,自省就是面向对象的语言所写的程序在运行时,能知道对象的类型,换句话说就是在运行时能获取对象的类型,比如通过 type(),dir(),getattr(),hasattr(),i...

善良小郎君
06/11
0
0
基于python yield机制的异步操作同步化编程模型

又一个milestone即将结束,有了些许的时间总结研发过程中的点滴心得,今天总结下如何在编写python代码时对异步操作进行同步化模拟,从而提高代码的可读性和可扩展性。 游戏引擎一般都采用分布...

窗台跳舞的猫
2013/12/12
0
9
Python中的生成器与迭代器

生成器 1.什么是生成器 通过列表生成式,我们可以直接创建一个列表。但是,受到内存限制,列表容量肯定有限的。而且,创建一个包含100万个元素的列表,要占用很大的存储空间,如果我们仅仅需...

墨痕hz
05/29
0
0
Python高级特性:Iterators、Generators和itertools

作为一门动态脚本语言,Python对编程初学者而言很友好,丰富的第三方库能够给使用者带来很大的便利。而Python同时也能够提供一些高级的特性方便用户使用更为复杂的数据结构。本系列文章共有三...

wt7315
06/26
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

JavaEE——JavaScript

声明:本栏目所使用的素材都是凯哥学堂VIP学员所写,学员有权匿名,对文章有最终解释权;凯哥学堂旨在促进VIP学员互相学习的基础上公开笔记。 JavaScript 内置对象 String对象方法: date对象...

凯哥学堂
5分钟前
0
0
Git 远程代码回滚master

方式一(推荐): git revert commit-id 方式二(不推荐):不推荐原因:推送到线上后,其它开发人员需要重新clone git reset --hard commit-id git push origin HEAD --force...

浮躁的码农
5分钟前
0
0
Elasticesearch学习(7)—— ES查询与Java API的对应关系

1、普通查询 类型 ES查询语句 Java查询实现 结果 查询格式 { "query": { "bool": { "must": [], "must_not": [], "should": [], "filter": [] } }, "from": 0, "size": 10, "sort": [] } Que......

叶枫啦啦
6分钟前
4
0
getElementsByClassName()与getElementById()区别

1.document.getElementsByClassName() 返回的是数组 使用:document.getElementsByClassName("className")[0].innerText='具体内容' 2.document.getElementById() 返回的是单个元素 使用:d......

botkenni
17分钟前
0
0
MyBatis入门

一、安装 <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>x.x.x</version></dependency> 二、从 XML 中构建 SqlSessionFactory String r......

一个yuanbeth
18分钟前
0
0
聊聊spring cloud的LoadBalancerAutoConfiguration

序 本文主要研究一下spring cloud的LoadBalancerAutoConfiguration RibbonAutoConfiguration spring-cloud-netflix-ribbon-2.0.0.RC2-sources.jar!/org/springframework/cloud/netflix/ribb......

go4it
20分钟前
0
0
【转】使用Lombok来优雅的编码

前言 Lombok 是一种 Java™ 实用工具,可用来帮助开发人员消除 Java 的冗长,尤其是对于简单的 Java 对象(POJO)。它通过注解实现这一目的。 正文 添加依赖 在 pom.xml 文件中添加相关依赖:...

HAVENT
22分钟前
0
0
Dubbo 源码解读 —— 可支持序列化及自定义扩展

一、概述 从源码中,我们可以看出来。目前,Dubbo 内部提供了 5 种序列化的方式,分别为 fastjson、Hessian2、Kryo、fst 及 Java原生支持的方式 。 针对不同的序列化方式,对比内容如下: 名...

Ryan-瑞恩
30分钟前
0
0
MySQL内存设置—— MySQL server has gone away

set global max_allowed_packet=268435456

一梦心草
39分钟前
0
0
推导式

列表、集合和字典推导式 列表推导式是Python最受喜爱的特性之一。它允许用户方便的从一个集合过滤元素,形成列表,在传递参数的过程中还可以修改元素。形式如下: [expr for val in collect...

火力全開
44分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部