飘逸的python
来源:互联网 发布:腾讯云域名转入 编辑:程序博客网 时间:2024/04/29 02:56
只要函数含有yield语句,它就返回一个生成器.所以我们与其把其看成函数定义,不如看作是生成器定义.函数用return返回,而生成器用yield返回.
接下来是yield的行为.
使用"yield消除技术",用一个结果变量来收集yield的东西并返回.
于是转换成
而生成器的强大魔法在于它是延迟执行的,在需要的时候它才去执行代码,它"记住"了yield的执行位置,获取下一个结果的时候从上一次yield的位置继续往下走.
所以生成器相对于list,它每个时刻只保存一个当前结果,节省了内存,缺点是无法用下标索引,遍历一次就没了.另一个好处是可以生成无穷序列,如cycle.
需要注意的是,当我们调用函数的时候,它并不开始执行函数体代码,只是返回一个生成器.
比如
接下来是yield的行为.
比如
def html(): yield 'header' for i in range(5): yield i yield 'footer'h = html()#此时h变量就是一个生成器.for x in h:#遍历生成器 print x怎么理解这个函数呢?
使用"yield消除技术",用一个结果变量来收集yield的东西并返回.
于是转换成
def html(): ret = [] ret.append('header') for i in range(5): ret.append(i) ret.append('footer') return ret可以看到,yield语句没了,所有东西都在ret这个序列.
而生成器的强大魔法在于它是延迟执行的,在需要的时候它才去执行代码,它"记住"了yield的执行位置,获取下一个结果的时候从上一次yield的位置继续往下走.
所以生成器相对于list,它每个时刻只保存一个当前结果,节省了内存,缺点是无法用下标索引,遍历一次就没了.另一个好处是可以生成无穷序列,如cycle.
需要注意的是,当我们调用函数的时候,它并不开始执行函数体代码,只是返回一个生成器.
比如
def A(): print 'hehe' yield 1 yield 2当我们A()时,并不会print 'hehe',而只有当我们遍历的时候,它才开始执行,从函数体第一行代码直到第一个yield,而后继续往下执行代码到下一个yield,如此下去.
0 0
- 飘逸的python
- 飘逸的python
- 飘逸的python
- 飘逸的python
- 飘逸的python - 赛程表算法
- 飘逸的python - 赛程表算法
- 飘逸的python - and_or大法
- 飘逸的python - 常见的几个坑
- 飘逸的python - __dict__的妙用
- 飘逸的python - 优雅的执行程序
- 飘逸的python - 彩色你的控制台
- 飘逸的python - 鲜为人知的参数
- 飘逸的python - 装饰器的本质
- 飘逸的python - str vs. repr
- 飘逸的python - 偏函数functools.partial
- 飘逸的python - 发送qq邮件
- 飘逸的python - 字典合并值相加
- 飘逸的python - 打印螺旋矩阵
- 通过init.rc中的property实现动态控制service的开启与关闭
- <五大经典算法> 四、回溯法
- 文件二进制上传图片
- 第二十二讲项目四 分支嵌套流程图2-五级成绩
- ViewDragHelper的学习
- 飘逸的python
- js生成带有图片logo的二维码:
- dom04动态创建createElement
- 2016[编程题]裁减网格纸
- StringFog插件对Dex字符串加密原理解析
- 索引和查询优化系列之三--查询优化
- 阿里面试回来,想和Java程序员谈一谈
- 关于python中,map,reduce,filter,sorted函数的用法
- <五大经典算法> 五、分治算法