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中global与nonlocal比较
Nov 21 Python
python开启多个子进程并行运行的方法
Apr 18 Python
Python序列操作之进阶篇
Dec 08 Python
Python 模拟购物车的实例讲解
Sep 11 Python
Python文件监听工具pyinotify与watchdog实例
Oct 15 Python
python threading和multiprocessing模块基本用法实例分析
Jul 25 Python
对Python中一维向量和一维向量转置相乘的方法详解
Aug 26 Python
Python实现不规则图形填充的思路
Feb 02 Python
Python select及selectors模块概念用法详解
Jun 22 Python
详解PyQt5中textBrowser显示print语句输出的简单方法
Aug 07 Python
Python实现壁纸下载与轮换
Oct 19 Python
PyTorch中的拷贝与就地操作详解
Dec 09 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
《星际争霸》各版本雷兽特点图文解析 雷兽不同形态一览
2020/03/02 星际争霸
php实现水仙花数示例分享
2014/04/03 PHP
在PHP模板引擎smarty生成随机数的方法和math函数详解
2014/04/24 PHP
php遍历CSV类实例
2015/04/14 PHP
php使用Imagick生成图片的方法
2015/07/31 PHP
PHP编程实现的TCP服务端和客户端功能示例
2018/04/13 PHP
让FireFox支持innerText的实现代码
2009/12/01 Javascript
使用js实现雪花飘落效果
2013/08/26 Javascript
JavaScript 获取任一float型小数点后两位的小数
2014/06/30 Javascript
JS实现的表格行鼠标点击高亮效果代码
2015/11/27 Javascript
JS中递归函数
2016/06/17 Javascript
微信小程序 下拉列表的实现实例代码
2017/03/08 Javascript
js鼠标跟随运动效果
2017/03/11 Javascript
基于dataset的使用和图片延时加载的实现方法
2017/12/11 Javascript
基于vue1和vue2获取dom元素的方法
2018/03/17 Javascript
JavaScript文本特效实例小结【3个示例】
2018/12/22 Javascript
微信小程序下拉加载和上拉刷新两种实现方法详解
2019/09/05 Javascript
Js生成随机数/随机字符串的方法小结【5种方法】
2020/05/27 Javascript
JavaScript如何操作css
2020/10/24 Javascript
python进阶教程之函数对象(函数也是对象)
2014/08/30 Python
python paramiko模块学习分享
2017/08/23 Python
Python实现将Excel转换成xml的方法示例
2018/08/25 Python
python 根据字典的键值进行排序的方法
2019/07/24 Python
python 二维矩阵转三维矩阵示例
2019/11/30 Python
Lentiamo比利时:便宜的隐形眼镜
2020/02/14 全球购物
幼儿园英语教学反思
2014/01/30 职场文书
有限责任公司股东合作协议书
2014/12/02 职场文书
婚礼答谢词
2015/01/04 职场文书
技术员个人工作总结
2015/03/03 职场文书
2015年招生工作总结
2015/05/04 职场文书
工作时间证明
2015/06/15 职场文书
建筑工程催款函
2015/06/24 职场文书
实验室安全管理制度
2015/08/05 职场文书
中学政教处工作总结
2015/08/13 职场文书
详解Spring Boot使用系统参数表提升系统的灵活性
2021/06/30 Java/Android
Java Spring Lifecycle的使用
2022/05/06 Java/Android