文档章节

Python 生成器 generator

ludlows
 ludlows
发布于 2014/10/07 22:55
字数 469
阅读 26
收藏 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

没有更多内容

加载失败,请刷新页面

加载更多

js实现产生n个随机数,并且随机数之和是固定值

function getrandom(minnum , maxnum ,total,size){ var num = total; //定义整数 var length= size; //定义多个整数的数量 var numArr = []; while(length > 1){ var rnd = Math.floor(Mat......

开源昕昕
22分钟前
2
0
精选Spring Boot三十五道必知必会知识点!

Spring Boot 是微服务中最好的 Java 框架. 我们建议你能够成为一名 Spring Boot 的专家。本文精选了三十五个常见的Spring Boot知识点,祝你一臂之力! 问题一 Spring Boot、Spring MVC 和 Sp...

Java填坑之路
23分钟前
2
0
MyBatis学习笔记

相关文档 mybatis深入理解(一)之 # 与 $ 区别以及 sql 预编译 MyBatis 处理sql中的 大于,小于,大于等于,小于等于

OSC_fly
24分钟前
0
0
Gradle从不同地方复制文件到一个文件夹/打zip包

复制 task copySDK(type: Copy, dependsOn: [":fatJarTask"]) { delete JAR_NAME delete SDK_OUT_PATH delete "$ROOT_BUILD_PATH/$SDK_ZIP_NAME" into('/jniLibs') {......

SuShine
24分钟前
1
0
CentOS关闭占用端口,修改Apache默认端口,并重启Apache

查找并关闭进程 在Linux系统中可以使用lsof命令和kill命令,两个命令配合查找并关闭占用端口的进程 查看某一端口使用情况的命令: lsof -i:端口号 效果如下,PID即进程的ID 根据PID关闭进程,...

临江仙卜算子
30分钟前
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部