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中使用HTMLParser解析HTML的教程
Apr 29 Python
在Python的Django框架中为代码添加注释的方法
Jul 16 Python
Python实现各种排序算法的代码示例总结
Dec 11 Python
在Python中定义和使用抽象类的方法
Jun 30 Python
Python字典简介以及用法详解
Nov 15 Python
Python编程生成随机用户名及密码的方法示例
May 05 Python
django项目搭建与Session使用详解
Oct 10 Python
python 在屏幕上逐字显示一行字的实例
Dec 24 Python
Python中Numpy mat的使用详解
May 24 Python
python用win32gui遍历窗口并设置窗口位置的方法
Jul 26 Python
python程序 创建多线程过程详解
Sep 23 Python
Python3+Flask安装使用教程详解
Feb 16 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
英雄试炼之肉山谷—引领RPG新潮流
2020/04/20 DOTA
隐藏X-Space个人空间下方版权方法隐藏X-Space个人空间标题隐藏X-Space个人空间管理版权方法
2007/02/22 PHP
PHP保留两位小数并且四舍五入及不四舍五入的方法
2013/09/22 PHP
利用PHP获取汉字首字母并且分组排序详解
2017/10/22 PHP
LaravelS通过Swoole加速Laravel/Lumen详解
2018/03/02 PHP
PHP实现唤起微信支付功能
2019/02/18 PHP
jquery 动态创建元素的方式介绍及应用
2013/04/21 Javascript
js实时获取系统当前时间实例代码
2013/06/28 Javascript
js 用CreateElement动态创建标签示例
2013/11/20 Javascript
删除条目时弹出的确认对话框
2014/06/05 Javascript
node.js中的fs.renameSync方法使用说明
2014/12/16 Javascript
JavaScript实现梯形乘法表的方法
2015/04/25 Javascript
JS组件Bootstrap Table使用方法详解
2016/02/02 Javascript
jQuery添加和删除输入文本框标签代码
2016/05/20 Javascript
第八篇Bootstrap下拉菜单实例代码
2016/06/21 Javascript
微信小程序表单验证功能完整实例
2017/12/01 Javascript
手把手教你 CKEDITOR 4 扩展插件制作
2019/06/18 Javascript
JS中队列和双端队列实现及应用详解
2020/09/29 Javascript
Vue 简单实现前端权限控制的示例
2020/12/25 Vue.js
[57:18]DOTA2上海特级锦标赛主赛事日 - 1 败者组第一轮#3VP VS VG
2016/03/03 DOTA
对python中的 os.mkdir和os.mkdirs详解
2018/10/16 Python
详解分布式任务队列Celery使用说明
2018/11/29 Python
利用Python求阴影部分的面积实例代码
2018/12/05 Python
Python操作excel的方法总结(xlrd、xlwt、openpyxl)
2019/09/02 Python
pytorch进行上采样的种类实例
2020/02/18 Python
Html5 localStorage入门教程
2018/04/26 HTML / CSS
HTML5实现一个能够移动的小坦克示例代码
2013/09/02 HTML / CSS
英国豪华装饰照明品牌的在线零售商:Inspyer Lighting
2019/12/10 全球购物
瑞士最大的图书贸易公司:Orell Füssli
2019/12/28 全球购物
大学旷课检讨书
2014/01/28 职场文书
保护母亲河倡议书
2014/04/14 职场文书
2014大学生职业生涯规划书最新范文
2014/09/13 职场文书
六一晚会主持词开场白
2015/05/28 职场文书
背起爸爸上学观后感
2015/06/08 职场文书
html5中sharedWorker实现多页面通信的示例代码
2021/05/07 Javascript
JS前端使用canvas实现扩展物体类和事件派发
2022/08/05 Javascript