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 之编写简单乘法运算题
Feb 27 Python
Win7 64位下python3.6.5安装配置图文教程
Oct 27 Python
Python Learning 列表的更多操作及示例代码
Aug 22 Python
python实现根据指定字符截取对应的行的内容方法
Oct 23 Python
python爬虫之urllib库常用方法用法总结大全
Nov 14 Python
详解Python进阶之切片的误区与高级用法
Dec 24 Python
pycharm新建一个python工程步骤
Jul 16 Python
python实现图片压缩代码实例
Aug 12 Python
python word转pdf代码实例
Aug 16 Python
Python基于Tensor FLow的图像处理操作详解
Jan 15 Python
将keras的h5模型转换为tensorflow的pb模型操作
May 25 Python
手把手教你配置JupyterLab 环境的实现
Feb 02 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
快速配置PHPMyAdmin方法
2008/06/05 PHP
Cakephp 执行主要流程
2010/03/24 PHP
php 伪造本地文件包含漏洞的代码
2011/11/03 PHP
yii2 RBAC使用DbManager实现后台权限判断的方法
2016/07/23 PHP
PHP上传Excel文件导入数据到MySQL数据库示例
2016/10/25 PHP
laravel5表单唯一验证的实例代码
2019/09/30 PHP
javascript自动给文本url地址增加链接的方法分享
2014/01/20 Javascript
原生js实现淘宝首页点击按钮缓慢回到顶部效果
2014/04/06 Javascript
get(0).tagName获得作用标签示例代码
2014/10/08 Javascript
JQuery创建DOM节点的方法
2015/06/11 Javascript
JS基于myFocus库实现各种功能的tab选项卡切换效果
2015/09/19 Javascript
jQuery+Ajax+PHP+Mysql实现分页显示数据实例讲解
2015/09/27 Javascript
jquery插件pagination实现无刷新ajax分页
2015/09/30 Javascript
浅谈js函数的多种定义方法与区别
2016/11/29 Javascript
Node.js中的http请求客户端示例(request client)
2017/05/04 Javascript
seajs中模块依赖的加载处理实例分析
2017/10/10 Javascript
vue router自动判断左右翻页转场动画效果
2017/10/10 Javascript
Javascript ParentNode和ChildNode接口原理解析
2020/03/16 Javascript
Python过滤函数filter()使用自定义函数过滤序列实例
2014/08/26 Python
Python中Continue语句的用法的举例详解
2015/05/14 Python
python 写的一个爬虫程序源码
2016/02/28 Python
使用pycharm生成代码模板的实例
2018/05/23 Python
Python面向对象类的继承实例详解
2018/06/27 Python
解决安装python库时windows error5 报错的问题
2018/10/21 Python
Django如何将URL映射到视图
2019/07/29 Python
详解Django配置优化方法
2019/11/18 Python
pytorch1.0中torch.nn.Conv2d用法详解
2020/01/10 Python
Python sorted排序方法如何实现
2020/03/31 Python
Python迭代器协议及for循环工作机制详解
2020/07/14 Python
删除pycharm鼠标右键快捷键打开项目的操作
2021/01/16 Python
欧洲、亚洲、非洲和拉丁美洲的度假套餐:Great Value Vacations
2019/03/30 全球购物
夜大毕业自我鉴定
2013/10/11 职场文书
旅游业大学生创业计划书
2014/01/31 职场文书
永远跟党走演讲稿
2014/09/12 职场文书
检讨书格式
2019/04/25 职场文书
navicat 连接Ubuntu虚拟机的mysql的操作方法
2022/04/02 MySQL