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安装第三方库及常见问题处理方法汇总
Sep 13 Python
解决python2.7 查询mysql时出现中文乱码
Oct 09 Python
python中如何正确使用正则表达式的详细模式(Verbose mode expression)
Nov 08 Python
python numpy格式化打印的实例
May 14 Python
Python动态生成多维数组的方法示例
Aug 09 Python
Pyqt QImage 与 np array 转换方法
Jun 27 Python
pandas读取CSV文件时查看修改各列的数据类型格式
Jul 07 Python
详解如何减少python内存的消耗
Aug 09 Python
python实现人工智能Ai抠图功能
Sep 05 Python
Python实现打印实心和空心菱形
Nov 23 Python
如何使用Python多线程测试并发漏洞
Dec 18 Python
如何用python反转图片,视频
Apr 24 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中设置时区方法小结
2012/06/03 PHP
php preg_replace替换实例讲解
2013/11/04 PHP
php+layui数据表格实现数据分页渲染代码
2019/10/26 PHP
ExtJS 2.0实用简明教程 之获得ExtJS
2009/04/29 Javascript
初窥JQuery(一)jquery选择符 必备知识点
2010/11/25 Javascript
js循环改变div颜色具体方法
2013/06/25 Javascript
可自定义速度的js图片无缝滚动示例分享
2014/01/20 Javascript
jQuery 处理页面的事件详解
2015/01/20 Javascript
javascript中this的四种用法
2015/05/11 Javascript
String字符串截取的四种方式总结
2016/11/28 Javascript
jQuery File Upload文件上传插件使用详解
2016/12/06 Javascript
原生JavaScript实现todolist功能
2018/03/02 Javascript
原生JS实现京东查看商品点击放大
2020/12/21 Javascript
Python+Django在windows下的开发环境配置图解
2009/11/11 Python
用Python实现数据的透视表的方法
2018/11/16 Python
Python 从一个文件中调用另一个文件的类方法
2019/01/10 Python
对Python中创建进程的两种方式以及进程池详解
2019/01/14 Python
python实现贪吃蛇游戏
2020/03/21 Python
基于Python实现船舶的MMSI的获取(推荐)
2019/10/21 Python
pytorch中的上采样以及各种反操作,求逆操作详解
2020/01/03 Python
使用Python第三方库pygame写个贪吃蛇小游戏
2020/03/06 Python
Python接口开发实现步骤详解
2020/04/26 Python
matplotlib 使用 plt.savefig() 输出图片去除旁边的空白区域
2021/01/05 Python
html5设计原理(推荐收藏)
2014/05/17 HTML / CSS
香港唯港荟酒店预订:Hotel ICON
2018/03/27 全球购物
95%的面试官都会问到的50道Java线程题,附答案
2012/08/03 面试题
高级技校毕业生自荐信
2013/11/18 职场文书
班级道德讲堂实施方案
2014/02/24 职场文书
办公自动化毕业生求职信
2014/03/09 职场文书
股东授权委托书范文
2014/09/13 职场文书
闪闪红星观后感
2015/06/08 职场文书
幼儿园庆六一主持词
2015/06/30 职场文书
幼儿园国培研修日志
2015/11/13 职场文书
纪念建国70周年演讲稿
2019/07/19 职场文书
python批量创建变量并赋值操作
2021/06/03 Python
OpenStack虚拟机快照和增量备份实现方法
2022/04/04 Servers