鱼C论坛

 找回密码
 立即注册
查看: 2245|回复: 0

[技术交流] 十一章节:生成器

[复制链接]
发表于 2017-8-30 21:41:04 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
             49课时:乱入:生成器
生成器是一种特殊的迭代器,有了迭代器为什么还要生成器呢?因为可以使得python更为简洁优雅,因为生成器不需要在类里面重写__iter_()和__next__()方法,只需要加入一个yield语句。
yield语句
协同程序:所谓的协同程序就是可以运行的独立函数调用,函数可以暂停或者挂起,并在需要的时候从程序离开的地方继续或者重新开始。python里的生成器就类似协同程序。一旦一个函数里面出现了yield语句,这个函数就被视作一个生成器。
以普通函数为例,函数运行后把控制权交还给用户有三种情况:1、出现异常2、遇到return等人为设置的退出动作3、完全运行结束。这就是一个完整的运行流程        

加入一个yield语句后运行流程暂停并返回一个值,然后遇到调用回到刚刚暂停的地方继续执行下去。这就是yield语句的作用

举例说明:
>>> def my_fun():
        print('生成器被执行!')
        yield 1
        yield 2

        
>>> test = my_fun()
>>> next(test)                        #生成器是特殊的迭代器,可以使用next()
生成器被执行!        #遇到第一个yield,暂停流程,并把后面的1返回
1
>>> next(test)                #再次执行,又遇到yield,暂停并返回2
2
>>> next(test)                #再执行,后面没有代码要执行了,就抛出StopIteration
Traceback (most recent call last):
  File "<pyshell#15>", line 1, in <module>
    next(test)
StopIteration
试试斐波那契数列
>>>def fibs():
        x = 0
        y = 1
        while True:
                x, y = y, x+y
                yield x
>>> for i in fibs():
        if i >100:
                break
        else:
                print(i, end=' ')

                
1 1 2 3 5 8 13 21 34 55 89
[b]

生成器表达式
[/b]>>> [i for i in range(10)]
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> (i for i in range(10))
<generator object <genexpr> at 0x0392C990>

前者是一个列表推导式,后者把中括号改为圆括号就成为了一个生成器表达式。
生成器表达式返回的是一个生成器对象,可以作为函数的参数来使用。
例如:
>>> sum(i for i in range(10))             #作为参数可以不用加上括号
45








评分

参与人数 1鱼币 +4 收起 理由
小甲鱼 + 4

查看全部评分

本帖被以下淘专辑推荐:

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-12-23 10:47

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表