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 struct.unpack
Sep 06 Python
python使用wxPython打开并播放wav文件的方法
Apr 24 Python
win系统下为Python3.5安装flask-mongoengine 库
Dec 20 Python
django轻松使用富文本编辑器CKEditor的方法
Mar 30 Python
使用python 打开文件并做匹配处理的实例
Jan 02 Python
PyCharm在新窗口打开项目的方法
Jan 17 Python
完美解决Python matplotlib绘图时汉字显示不正常的问题
Jan 29 Python
选择Python写网络爬虫的优势和理由
Jul 07 Python
利用python、tensorflow、opencv、pyqt5实现人脸实时签到系统
Sep 25 Python
Python基于pygame实现单机版五子棋对战
Dec 26 Python
Python使用requests xpath 并开启多线程爬取西刺代理ip实例
Mar 06 Python
利用scikitlearn画ROC曲线实例
Jul 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
php中通过smtp发邮件的类,测试通过
2007/01/22 PHP
PHP获取文件绝对路径的代码(上一级目录)
2011/05/29 PHP
PHP-CGI进程CPU 100% 与 file_get_contents 函数的关系分析
2011/08/15 PHP
关于php程序报date()警告的处理(date_default_timezone_set)
2013/10/22 PHP
ThinkPHP CURD方法之page方法详解
2014/06/18 PHP
thinkphp中空模板与空模块的用法实例
2014/11/26 PHP
jQuery Mobile + PHP实现文件上传
2014/12/12 PHP
PHP生成加减算法方式的验证码实例
2018/03/12 PHP
JavaScript 字符串与数组转换函数[不用split与join]
2009/12/13 Javascript
javascript制作的cookie封装及使用指南
2015/01/02 Javascript
HTML5实现留言和回复页面样式
2015/07/22 Javascript
jquery ajax分页插件的简单实现
2016/01/27 Javascript
nodejs读写json文件的简单方法(必看)
2017/03/09 NodeJs
Bootstrap常用组件学习(整理)
2017/03/24 Javascript
详解NodeJS框架express的路径映射(路由)功能及控制
2017/03/24 NodeJs
利用jquery正则表达式在页面验证url网址输入是否正确
2017/04/04 jQuery
JavaScript ES6中const、let与var的对比详解
2017/06/18 Javascript
微信小程序与php 实现微信支付的简单实例
2017/06/23 Javascript
移动端效果之Swiper详解
2017/10/09 Javascript
JS打印彩色菱形的实例代码
2018/08/15 Javascript
vue结合element-ui使用示例
2019/01/24 Javascript
使用uni-app开发微信小程序的实现
2019/12/13 Javascript
jQuery实现查看图片功能
2020/12/01 jQuery
react项目从新建到部署的实现示例
2021/02/19 Javascript
老生常谈Python序列化和反序列化
2017/06/28 Python
python字符串的方法与操作大全
2018/01/30 Python
python async with和async for的使用
2019/06/20 Python
python性能测试工具locust的使用
2020/12/28 Python
幼师专业毕业生自荐信
2013/09/29 职场文书
简单而又朴实的个人求职信分享
2013/12/12 职场文书
暑假学习心得体会
2014/09/02 职场文书
2014年计划生育协会工作总结
2014/11/14 职场文书
会计岗位职责范本
2015/04/02 职场文书
2019新学期家长会工作计划
2019/08/21 职场文书
python模拟浏览器 使用selenium进入好友QQ空间并留言
2022/04/12 Python
避坑之 JavaScript 中的toFixed()和正则表达式
2022/04/19 Javascript