社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Python

Python进阶系列连载(5)——生成器(上)

Python爱好者社区 • 8 年前 • 800 次点击  

作者:王大伟

Python爱好者社区唯一小编

博客:https://ask.hellobi.com/blog/wangdawei


前文传送门:

Python进阶系列连载(1)——那些容易被忽略的问题(上)

Python进阶系列连载(2)——那些容易被忽略的问题(中)

Python进阶系列连载(3)——那些容易被忽略的问题(下)

Python进阶系列连载(4)——迭代器


如果还没看过我的入门连载部分,先看:

Python从零开始系列连载(25)——Python的random模块简单使用(入门知(姿)识(势)学习的最后一篇(片))


当然,小编的免费入门课程已经有咯,看过连载的朋友可以看看视频再快速梳理一遍~

视频传送门:点击文末阅读原文


生成器


还记得在迭代器里我们说为什么将列表转为迭代器么?


小明:因为列表太大的话占用内存太大,做成迭代器可以节省空间,用的时候再拿出部分


是的,今天要讲的生成器是不会把结果保存在一个系列中,而是保存生成器的状态。

在每次进行迭代时返回一个值,直到遇到StopIteration异常结束。


见过这种东西吧:



你可以认为每一杯饮料就是一个生成的对象,我不会一次倒出所有的饮料

而是要喝的时候去倒出一杯(也就是需要的时候生成一个)


简单方法创建生成器


我们看个例子:



我们发现,当要生成的list非常大时,抛出异常,存储报错。


那怎样生成这种巨大的list呢?



你亲手试一下,发现瞬间程序就运行结束了

我们看到,b是一个generator,也就是生成器模式


你应该已经注意到,生成器的创建很简单,将列表生成式的中括号改成小括号即可

注意:这里说的不是列表,因为列表的中括号改成小括号是元组!


那我们怎么生成一个内容呢?


和之前的迭代器相同,使用next()函数即可:



直到最后会抛出异常,也就是到达了生成器的末端了


函数进化为生成器


还记得函数的定义么?


我们在之前用递归定义了一个斐波那契数列

现在我们定义一个新的函数来生成斐波那契数列的第n项



为了实现后一项等于前两项之和使用了a,b = b,a+b

为什么这样写,留给大家思考~

提示:可以输入n=3,自己感受一下调用函数过程中a和b的变化

值得注意的是,这个函数,当n=0时返回的是1,而不是正确的0

所以我们对其进行修改:



在循环之前,加了一个判断


小明:老湿!你这个说的还是函数啊,和生成器有啥关系?说好的函数进化成生成器呢?


好的,我们看看函数怎么进化为生成器!



我们把函数中的return换成yield

函数就进化成了生成器,当我们调用时,发现返回的是生成器对象

为了拿到数据,我们应该怎么做呢?


小红:老师,是不是可以试试next()函数呢?


对,不过在此之前,我们先要用一个变量去接收这个生成器对象

并且为了观察生成器的特点,我们对函数进行修改!


仔细看好:



当我们使用next(a)对生成器操作一次时,会返回循环一次的值

也就是在yield处结束本次运行

但它的特点就是下次使用next(a)时,接着上次的断点继续运行,直到下一个yield

不断使用next(a),直到运行到生成器结尾处,如下图:



可能你对他的运行过程还不是特别清晰

我们加上print输出来彻底搞懂他的运行过程:



发现每次返回值都是在yield的地方了吧~


总结

0.讲了两种生成器创建方式

1.加了yield的函数就变成了生成器

2.要定义一个变量接收生成器的返回值

3.使用next()获取生成器每次返回的值,并且断点在yield处

4.下次使用next()从上次的断电往下执行,直到生成器末端(这里表现为循环结束)

5.生成器属于迭代器,所以肯定是可迭代对象啦~


今天作业:

敲一遍代码,理解一下两种生成器创建方式

自己不敲代码永远学不会写代码

下课

人生苦短,我选Python

未完待续,连载中......

欢迎评论指出文中错误和提问~~~


小编的免费Python入门课程已经登场,等你来撩~

已经2000+小伙伴加入学习啦~

点击阅读原文,立即学习

Python爱好者社区历史文章大合集

Python爱好者社区历史文章列表(每周append更新一次)

福利:文末扫码立刻关注公众号,“Python爱好者社区”,开始学习Python课程:

关注后在公众号内回复课程即可获取:

0.小编的Python入门视频课程!!!

1.崔老师爬虫实战案例免费学习视频。

2.丘老师数据科学入门指导免费学习视频。

3.陈老师数据分析报告制作免费学习视频。

4.玩转大数据分析!Spark2.X+Python 精华实战课程免费学习视频。

5.丘老师Python网络爬虫实战免费学习视频。


今天看啥 - 高品质阅读平台
本文地址:http://www.jintiankansha.me/t/FqNXALMpQ2
Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/4764