Python中xrange与yield的用法实例分析


Posted in Python onDecember 26, 2017

本文实例分析了Python中xrange与yield的用法。分享给大家供大家参考,具体如下:

range和xrange

Python提供了生成和返回整数序列的内置函数range及xrange,虽然这两个函数在功能上是差不多的,但其实现原理还是有差别的。range(n, m)返回的是一个从n到(m-1)的连续的整数列表,而xrange(n, m)返回的却是一个特殊的目的对象,即xrange对象本身.

>>> range(1, 5)
[1, 2, 3, 4]
>>> xrange(1, 5)
xrange(1, 5)
>>> type(xrange(1, 5))
<type 'xrange'>

但在python2.x中xrange返回的却不是一个迭代器,所以 x = xrange(n, m), x.next()会出错。假如需要返回一个迭代器,需要调用iter(xrange(….))

>>> x = iter(xrange(1, 5))
>>> x.next()
1
>>> x.next()
2

也就是,调用range和xrange程序在运行中占用的内存是不一样的。使用range,程序将首先生成一个list,然后再隐含调用list的iter获取元素。而使用xrange,程序在每次循环产生的是一个xrange对象,这个对象是iterable,根据返回的这个xrange对象我们可以获取元素。

生成器与yield

借助python的生成器,我们可以实现像内置xrange函数的生成器,但这个生成器返回的是一个又浮点型值组成的序列而不是整型序列。

>>> def frange(start, stop, step=1.0):
  while start < stop:
    yield start
    start += step
>>> frange(1.0, 5.0)
<generator object frange at 0x01343148>
>>> for i in frange(1.0, 5.0):
  print i,
1.0 2.0 3.0 4.0
>>> x = iter(frange(1.0, 5.0))
>>> x.next()
1.0
>>> x.next()
2.0

在python中,在函数体出现一个或者多个yield,这个函数就是生成器(generator)。在调用生成器的时,系统不会执行该生成器函数体。生成器被调用时将返回一个特殊的迭代器对象,这个个对象包含了生成器函数体、函数体的本地变量(包括函数体参数)以及当前的执行位置。

在调用返回的迭代器对象的next方法时,生成器将执行到下一个yield语句。

在执行完yield语句时,函数的执行将被“冻结”,保留执行的当前位置和未经使用的本地变量,并将yield语句的执行结果返回作为next方法的结果。继续调用next则继续调用yield,直到函数体运行结束或者执行了return语句(return语句不能含有表达式)。

最常见的,生成器可以用来构建迭代器。假如我们需要一个从1到N,然后从N到1的数字组成的序列,可以使用生成器:

>>> def updown(N):
  for x in xrange(1, N): yield x
  for x in xrange(N, 0, -1): yield x
>>> for i in updown(5):
  print i,

当一个函数需要返回一个列表的时候,使用生成器可能更灵活。生成器可以构建一个误解的迭代器,返回一个无限的结果序列。更进一步,生成器构建的迭代器执行的是懒计算:只有函数需要时才会计算结果。

所以假如需要对一个序列进行迭代功能,可以考虑迭代器。

希望本文所述对大家Python程序设计有所帮助。

Python 相关文章推荐
python实现比较两段文本不同之处的方法
May 30 Python
python处理html转义字符的方法详解
Jul 01 Python
Python内置模块turtle绘图详解
Dec 09 Python
pytorch构建网络模型的4种方法
Apr 13 Python
Python操作Oracle数据库的简单方法和封装类实例
May 07 Python
Python定义函数功能与用法实例详解
Apr 08 Python
Django给admin添加Action的步骤详解
May 01 Python
django中使用Celery 布式任务队列过程详解
Jul 29 Python
python算的上脚本语言吗
Jun 22 Python
Pycharm 如何一键加引号的方法步骤
Feb 05 Python
python中的被动信息搜集
Apr 29 Python
Python快速优雅的批量修改Word文档样式
May 20 Python
Python简单计算数组元素平均值的方法示例
Dec 26 #Python
Python爬虫获取整个站点中的所有外部链接代码示例
Dec 26 #Python
Python之web模板应用
Dec 26 #Python
通过python+selenium3实现浏览器刷简书文章阅读量
Dec 26 #Python
如何在python中使用selenium的示例
Dec 26 #Python
Python使用Matplotlib实现Logos设计代码
Dec 25 #Python
利用Python2下载单张图片与爬取网页图片实例代码
Dec 25 #Python
You might like
PHP中unset,array_splice删除数组中元素的区别
2014/07/28 PHP
初识Laravel
2014/10/30 PHP
thinkPHP基于ajax实现的菜单与分页示例
2016/07/12 PHP
中高级PHP程序员应该掌握哪些技术?
2016/09/23 PHP
php json_encode与json_decode详解及实例
2016/12/13 PHP
使用 laravel sms 构建短信验证码发送校验功能
2017/11/06 PHP
JavaScript利用正则表达式去除日期中的“-”
2014/07/01 Javascript
jQuery中document与window以及load与ready 区别详解
2014/12/29 Javascript
JS实现单行文字不间断向上滚动的方法
2015/01/29 Javascript
JavaScript中用sort()方法对数组元素进行排序的操作
2015/06/09 Javascript
Web开发必知Javascript技巧大全
2016/02/23 Javascript
javascript实现粘贴qq截图功能(clipboardData)
2016/05/29 Javascript
详解Javascript获取缓存和清除缓存API
2017/05/25 Javascript
vue2.0 父组件给子组件传递数据的方法
2018/01/15 Javascript
iView-admin 动态路由问题的解决方法
2018/10/03 Javascript
微信小程序录音实现功能并上传(使用node解析接收)
2020/02/26 Javascript
基于python的汉字转GBK码实现代码
2012/02/19 Python
python实现自动登录人人网并采集信息的方法
2015/06/28 Python
python3新特性函数注释Function Annotations用法分析
2016/07/28 Python
Python利用公共键如何对字典列表进行排序详解
2018/05/19 Python
python绘制已知点的坐标的直线实例
2019/07/04 Python
如何为Python终端提供持久性历史记录
2019/09/03 Python
大三在校生电子商务求职信
2013/10/29 职场文书
毕业生求职的求职信
2013/12/05 职场文书
实习自我鉴定
2013/12/15 职场文书
电脑租赁公司创业计划书
2014/01/08 职场文书
新年寄语大全
2014/04/12 职场文书
感恩教育活动总结
2014/05/05 职场文书
法制宣传月活动方案
2014/05/11 职场文书
班风口号
2014/06/18 职场文书
日语专业求职信
2014/07/04 职场文书
关于旅游的活动方案
2014/08/15 职场文书
2014年库房工作总结
2014/11/26 职场文书
2015年中秋晚会主持稿
2015/07/30 职场文书
如何用python插入独创性声明
2021/03/31 Python
SpringBoot SpringEL表达式的使用
2021/07/25 Java/Android