文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

课时49:魔法方法:生成器

2023-01-30 22:13

关注

目录:

  一、生成器

  二、课时49课后习题及答案

 

*********************

一、生成器

**********************

生成器的学习并不涉及魔法方法,甚至它巧妙地避开了类和对象,仅通过普通地函数就可以实现了。

生成器其实是迭代器的一种实现。

  • 生成器的发明一方面是为了使得Python更为简洁,因为,迭代器需要我们自己去定义一个类和实现相关的方法,而生成器则只需要在普通的函数中加上一个yield语句即可。
  • 另一方面,生成器的发明,使得Python模仿协同程序的概念得以实现。所谓协同程序,就是可以运行得独立函数调用,函数可以暂停或者挂起,并在需要得时候从程序离开得地方继续或者重新开始。

对于调用一个普通的Python函数,一般是从函数的第一行代码开始执行,结束于return语句、异常、或者函数所有语句执行完毕。一旦函数将控制权交还给调用者,就意味着全部结束。函数中做的所有工作以及保存在局部变量中的数据都将丢失。再次调用这个函数时,一切将从头创建。

Python是通过生成器来实现类似于协同程序的概念:生成器可以暂时挂起函数,并保留函数的局部变量等数据,然后在再次调用它的时候,从上次暂停的位置继续执行下去。

举个例子:

 

>>> def myGen():
    print("生成器被执行!")
    yield 1
    yield 2

    
>>> myG = myGen()
>>> next(myG)
生成器被执行!
1
>>> next(myG)
2
>>> next(myG)
Traceback (most recent call last):
  File "<pyshell#9>", line 1, in <module>
    next(myG)
StopIteration

正如大家所见,当函数结束的时候,一个StopIteration异常就会抛出。由于Python的for循环会自动调用next()方法和处理StopIteration异常,所以for循环当然也是可以对生成器产生作用的:

>>> for i in myGen():
    print(i)

    
生成器被执行!
1
2

像前面介绍的斐波那契的例子,也可以用生成器来实现:

>>> def fibs():
    a = 0
    b = 1
    while True:
        a,b = b,a + b
        yield a

        

>>> for each in fibs():
    if each > 100:
        break
    print(each)

    
1
1
2
3
5
8
13
21
34
55
89

事到如今,你应该已经很好的掌握了列表推到式子(并没有,哭唧唧),那下边这个列表推导式表达的是啥意思:

>>> a = [i for i in range(100) if not(i%2) and i%3]

其实上边这个列表推导式求得就是100以内,能被2整除但不能被3整除的所有整数:

>>> a
[2, 4, 8, 10, 14, 16, 20, 22, 26, 28, 32, 34, 38, 40, 44, 46, 50, 52, 56, 58, 62, 64, 68, 70, 74, 76, 80, 82, 86, 88, 92, 94, 98]

python3除了有列表推导式,还有字典推导式:

>>> b = {i:i%2 == 0 for i in range(10)}
>>> b
{0: True, 1: False, 2: True, 3: False, 4: True, 5: False, 6: True, 7: False, 8: True, 9: False}

还有集合推导式:

>>> c = {i for i in [1,1,2,3,3,4,5,5,5,6,7,7,8]}
>>> c
{1, 2, 3, 4, 5, 6, 7, 8}

那是否有字符串推导式和元组推导式呢?试一试:

>>> d = "I love zww"
>>> d
'I love zww'

噢,不行,因为在双引号内,所有的东西都变成了字符串,所以不存在字符串推导式,那元组推导式呢?

>>> e = (i for i in range(10))
>>> e
<generator object <genexpr> at 0x000002001EC4CB88>

咦?似乎这个不是什么推导式嘛。generator,多么熟悉的单词,就是生成器嘛!没错用普通小括号括起来的正是生成器推导式,来证明一下:

>>> next(e)
0
>>> next(e)
1
>>> next(e)
2
>>> next(e)
3
>>> next(e)
4

用for语句把剩下的给打印出来:

>>> for each in e:
    print(each)

    
5
6
7
8
9

还有一个特性更牛,生成器推导式如果作为函数的参数,可以直接写推导式,而不用加小括号:

>>> sum(i for i in range(100) if i % 2)
2500

【扩展阅读】提高你的 Python:解释 yield 和 Generators(生成器)

 

*******************************

二、课时49课后习题及答案

*******************************

 

 预知后文如何?请君耐心等待.

 

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     807人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     351人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     314人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     433人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     221人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯