目录

一、yield关键字

二、yield表达式的应用

三、三元表达式、列表生成式、生成器表达式

3.1三元表达式

3.2列表生成式

3.3生成器表达式


一、yield关键字

若函数体包含yield关键字,再调用函数,并不会执行函数体代码,得到的返回值即生成器对象

>>> def my_range(start,stop,step=1):
...     print('start...')
...     while start < stop:
...         yield start
...         start+=step
...     print('end...')
...
>>> g=my_range(0,3)
>>> g
<generator object my_range at 0x104105678>

 生成器内置有_iter_和_next_方法,所以生成器本身就是一个选代器

>>> g.__iter__
<method-wrapper '__iter__' of generator object at 0x1037d2af0>
>>> g.__next__
<method-wrapper '__next__' of generator object at 0x1037d2af0>
>>> next(g) # 触发函数执行直到遇到yield则停止,将yield后的值返回,并在当前位置挂起函数
start...
0
>>> next(g) # 再次调用next(g),函数从上次暂停的位置继续执行,直到重新遇到yield...
1
>>> next(g) # 周而复始...
2
>>> next(g) # 触发函数执行没有遇到yield则无值返回,即取值完毕抛出异常结束迭代
end...
Traceback (most recent call last):File "<stdin>", line 1, in <module>
StopIteration

既然生成器对象属于迭代器,那么必然可以使用for循环选代,如下:

有了yield关键字,我们就有了一种自定义选代器的实现方式。yield可以用于返回值,但不同于return,函数一旦遇到return就结束了,而yield可以保存函数的运行状态挂起函数,用来返回多次值

二、yield表达式的应用

在函数内可以采用表达式形式的yield

>>> def eater():
...     print('Ready to eat')
...     while True:
...         food=yield
...         print('get the food: %s, and start to eat' %food)
... 

可以拿到函数的生成器对象持续为函数体send值,如下

>>> g=eater() # 得到生成器对象
>>> g
<generator object eater at 0x101b6e2b0>
>>> next(g) # 需要事先”初始化”一次,让函数挂起在food=yield,等待调用g.send()方法为其传值
Ready to eat
>>> g.send('包子')
get the food: 包子, and start to eat
>>> g.send('鸡腿')
get the food: 鸡腿, and start to eat

针对表达式形式的yield,生成器对象必须事先被初始化一次,让函数挂起在food=yield的位置,等待调用g.send0方法为函数体传值,g.send(None)等同于next(g)

我们可以编写装饰器来完成为所有表达式形式yield对应生成器的初始化操作,如下

def init(func):def wrapper(*args,**kwargs):g=func(*args,**kwargs) #得到生成器(不会立刻有返回值)next(g)return greturn wrapper@init
def eater():print('Ready to eat')while True:food=yieldprint('get the food: %s, and start to eat' %food)

表达式形式的yield也可以用于返回多次值,即变量名=yield值的形式,如下

>>> def eater():
...     print('Ready to eat')
...     food_list=[]
...     while True:
...         food=yield food_list
...         food_list.append(food)
...
>>> e=eater()
>>> next(e)
Ready to eat
[]
>>> e.send('蒸羊羔')
['蒸羊羔']
>>> e.send('蒸熊掌')
['蒸羊羔', '蒸熊掌']
>>> e.send('蒸鹿尾儿')
['蒸羊羔', '蒸熊掌', '蒸鹿尾儿']

三、三元表达式、列表生成式、生成器表达式

3.1三元表达式

res = 条件成立时返回的值 if 条件 else 条件不成立时返回的值

3.2列表生成式

当然,除了列表,还有字典,注意,()生成的不是元祖,而是生成器!

egg_list=['鸡蛋%s' %i for i in range(10)]

3.3生成器表达式

创建一个生成器对象有两种方式,一种是调用带yield关键字的函数,另一种就是生成器表达式,与列表生成式的语法格式相同,只需要将口换成(),即:

>>> [x*x for x in range(3)]
[0, 1, 4]
>>> g=(x*x for x in range(3))
>>> g
<generator object <genexpr> at 0x101be0ba0>

对比列表生成式,生成器表达式的优点自然是节省内存(一次只产生一个值在内存中)!

>>> next(g)
0
>>> next(g)
1
>>> next(g)
4
>>> next(g) #抛出异常StopIteration

如果我们要读取一个大文件的字节数,应该基于生成器表达式的方式完成

with open('db.txt','rb') as f:nums=(len(line) for line in f)total_size=sum(nums) # 依次执行next(nums),然后累加到一起得到结果=

Python从入门到实践:函数之生成器相关推荐

  1. 董老师又双叒叕送书啦,10本《Python程序设计入门与实践》

    活动详情: 在本文文末留言,留言获得点赞. 自本文推送之时活动立即生效,当天2月20日晚上21:00结束,获赞最多的前10条留言,每人获赠一本书. 2月20日晚上21:01在本文文末置顶留言公布获奖名 ...

  2. 新书推荐--《Python程序设计入门与实践》

    过完春节快递小哥们上班以后,公众号会连续送几波书,敬请留意! 书名:Python程序设计入门与实践 ISBN:978-7-5606-5960-2 作者:董付国 页数:319页 例题数量:73例 演示代 ...

  3. python从入门到实践和从入门到精通-Python从入门到实践之列表|第1天

    User:你好我是森林 Date:2018-02-14 Mark:<Python从入门到实践> 列表 本章主要从列表的概念入手,逐步深入到对列表的操作. 列表 概念 列表由一系列按特定顺序 ...

  4. Python数据挖掘入门与实践-OneR分类算法

    Python数据挖掘入门与实践-OneR分类算法 OneR算法 OneR算法是根据已有的数据中,具有相同特征值的个体最可能属于哪个类别进行分类. 在本例中,只需选区Iris是个特征中分类效果最好的一个 ...

  5. Python从入门到实践

    Python从入门到实践 文章目录 Python从入门到实践 第2章 变量和简单的数据类型 2.2 变量的命名规则 2.3 字符串 2.4 数字 1.整数 2.浮点数 3.使用str( )避免类型错误 ...

  6. python从入门到实践19章答案

    目录 前言 一.博客 1.建立项目 2.创建应用程序 3.Django管理网站 4.让用户输入数据 二.博客账户 1.应用程序users 2.登录页面 3.注销 4.注册页面 三.重构 四.保护页面n ...

  7. python从入门到实践18章答案

    目录 前言 一.新项目 二.简短的条目 三.Django API 四.比萨店 1.创建虚拟环境.安装Django.创建项目.创建数据库.创建应用程序 2.定义模型 3.激活模型 4.向管理网站注册模型 ...

  8. 《Python从入门到实践》读书笔记——第六章 字典

    <Python从入门到实践>读书笔记--第六章 字典 1. 一个简单的字典 alien_0 = {'color': 'green', 'points': 5}print(alien_0[' ...

  9. 《python数据挖掘》和《python数据挖掘入门与实践》两本书读后感

    这些天花了很多时间来学习数据挖掘这门课程,有很多心得和感悟,所以写下这篇博客来表达自己读完这两本书的感受! 首先推荐大家通过这两本书来入门数据挖掘这个领域,python数据挖掘这本书较容易,还花了很大 ...

  10. Python从入门到实践习题答案(第九章 类)

    在学习<Python从入门到实践>,代码是自己编写的噢(虽然有些代码有参考其他大佬),点个赞再走8~ 9-1 餐馆:创建一个名为 Restaurant 的类,其方法__init__()设置 ...

最新文章

  1. python项目归纳总结-python项目总结
  2. 海淘会不会成为电商的下一片蓝海?
  3. 根据不同地区的名称显示不同的页面
  4. HTMLCSS编码规范
  5. wireshark 过滤法则
  6. 关于cell中添加子视图 复用重叠问题的解决方法
  7. 【BlackHat】黑帽大会上值得关注的安全工具
  8. FCN论文-语义分割
  9. R与Python手牵手:数据探索性分析案例展示
  10. 国内大公司的开源项目一览表(包含mysql读写分离等)
  11. 未来真的可以影响过去吗?人人都能看懂的波粒二象性和延迟选择量子擦除实验解释,通俗易懂量子物理
  12. codeforces C. Team
  13. php 0改成百 千_php 根据啊拉伯数字转变成大写中文数字
  14. mid360激光雷达跑Point-LIO算法
  15. 《IT老外在中国》第29期:这位美籍华裔兜兜转转又回到了心心念念的故乡
  16. Very Good!!! - React 入门实例教程
  17. 搞了一个论坛玩玩!http://lupeiqing.3322.org/bbs
  18. 小程序组件Painter的使用心得
  19. 计算机物联网知识,计算机科学技术对物联网的5大作用分析
  20. android锁屏应用系统排行榜,重塑安卓手机的20大锁屏应用程序

热门文章

  1. 8个压箱底的资源网站,一个顶十个,再也不用到处找资源了
  2. java压缩图片内存大小,但不改变分辨率大小,第一种方式
  3. 大家以后投诉电信解决不了的话,找信息产业部去
  4. [Tex学习]给汉字注音
  5. Java构造函数(构造方法)的简介说明
  6. 2022年陕西省工程师职称申报条件
  7. 开源溯源防伪、一物一码系统助力大中小微企业低成本数字化转型
  8. Scheme 语言介绍
  9. 心电信号越界怎么回事_心电图机常见故障
  10. 三相桥式全控整流电路