飘逸的python - yield简明教程
2016-01-10 15:36
519 查看
发现还有非常多人对yield不理解,云里雾里,于是试着用文字表述.
仅仅要函数含有yield语句,它就返回一个生成器.所以我们与其把其看成函数定义,不如看作是生成器定义.函数用return返回,而生成器用yield返回.
接下来是yield的行为.
比方
使用"yield消除技术",用一个结果变量来收集yield的东西并返回.
于是转换成
而生成器的强大魔法在于它是延迟运行的,在须要的时候它才去运行代码,它"记住"了yield的运行位置,获取下一个结果的时候从上一次yield的位置继续往下走.
所以生成器相对于list,它每一个时刻仅仅保存一个当前结果,节省了内存,缺点是无法用下标索引,遍历一次就没了.还有一个优点是能够生成无穷序列,如cycle.
须要注意的是,当我们调用函数的时候,它并不開始运行函数体代码,仅仅是返回一个生成器.
比方
仅仅要函数含有yield语句,它就返回一个生成器.所以我们与其把其看成函数定义,不如看作是生成器定义.函数用return返回,而生成器用yield返回.
接下来是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,如此下去.
相关文章推荐
- NumPy学习 -- 002_常用函数
- python学习笔记二之数据类型(基础篇)
- leetcode之Maximum Subarray
- win7安装pycharm5+pyqt5+python3.4
- 《笨办法学Python》 第10课手记
- Ubuntu 14.04下搭建Python3.4 + PyQt5.3.2 + Eric6.0开发平台
- python小白-day2 基本数据类型
- [python]自问自答:python -m参数?
- python基础知识-数字
- Python基础01-04
- numpy 常用工具函数 —— np.bincount/np.average
- 23. Merge k Sorted Lists python leetcode 2016 new Season
- Python简史
- window8.1下python 开发环境搭建和遇到的问题
- Python之reload流程
- leetcode之Remove Duplicates from Sorted List II
- python post content-type:multipart/form-data 类型的表单数据
- Python之import流程
- Python 虚拟环境Virtualenv
- Python 虚拟环境Virtualenv