文档章节

Python 生成器 generator

ludlows
 ludlows
发布于 2014/10/07 22:55
字数 469
阅读 29
收藏 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中是不明智的因为这会浪费较多存储空间,生成器就...

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

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

xinet
2017/08/12
0
0
如何理解Python中的生成器

转载请注明出处:https://www.jianshu.com/u/5e6f798c903a [^*] 表示注脚,在文末可以查看对应连接,但简书不支持该语法。 generator [^4] [^7] [^9] 本质上来说,生成器(generator)就是一个...

_Pythonista
2018/08/05
0
0
Python 迭代器和 生成器

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

MtrS
2014/12/22
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Linux 权限

权限 0 000 --- 无权限 1 001 --x 执行权限 2 010 -w- 写权限 3 011 -wx 写和执行 4 100 r-- 读权限 5 101 r-x 读和执行 6 110 rw- 读和写 7 111 rwx 读写执行 755 : rwxr-xr-x 660 : rw-r...

忙碌的小蜜蜂
9分钟前
0
0
21分钟教会你分析MaxCompute账单

21分钟教会你分析MaxCompute账单 背景 阿里云大计算服务MaxCompute是一款商业化的大数据分析平台,其计算资源有预付费和后付费两种计费方式。并且产品每天按照project为维度进行计量计费(账...

阿里云云栖社区
12分钟前
0
0
Docker使用 linuxserver/letsencrypt 生成SSL证书最全解析及实践

本文使用 HTTP 和 DNS 两种校验方式对 Docker 下 linuxserver/letsencrypt 项目进行了实践。生成SpringBoot可用证书,使用 Nginx 的 htpasswd 来对网站进行密码保护,并测试使用 fail2ban 防...

java菜分享
12分钟前
0
0
代码吃鸡:Python-Robocode

最近看到一个很有“未来感”的新闻: 一辆特斯拉在拉斯维加斯出了车祸,撞“死”了一个……emmmm……机器人。不知道是意外还是炒作,又或者是这位机器人故意碰瓷,反正人们也无法从受害者口中...

crossin
16分钟前
0
0
什么是公网IP、内网IP和NAT转换?

搞网络通信应用开发的程序员,可能会经常听到外网IP(即互联网IP地址)和内网IP(即局域网IP地址),但他们的区别是什么? 1、引言 搞网络通信应用开发的程序员,可能会经常听到外网IP(即互联网I...

Linux就该这么学
26分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部