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 3.x 新特性及10大变化
Jun 12 Python
举例详解Python中threading模块的几个常用方法
Jun 18 Python
解决python3 安装完Pycurl在import pycurl时报错的问题
Oct 15 Python
python实现年会抽奖程序
Jan 22 Python
使用Python实现文字转语音并生成wav文件的例子
Aug 08 Python
Python读取YAML文件过程详解
Dec 30 Python
Python字符串中删除特定字符的方法
Jan 15 Python
Python post请求实现代码实例
Feb 28 Python
浅谈ROC曲线的最佳阈值如何选取
Feb 28 Python
Python如何通过百度翻译API实现翻译功能
Apr 02 Python
在matplotlib中改变figure的布局和大小实例
Apr 23 Python
几款Python编译器比较与推荐(小结)
Oct 15 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
融入意大利的咖啡文化
2021/03/03 咖啡文化
PHP 开源框架22个简单简介
2009/08/24 PHP
PHP、Java des加密解密实例
2015/04/27 PHP
PHP For循环字母A-Z当超过26个字母时输出AA,AB,AC
2020/02/16 PHP
你的编程语言可以这样做吗?
2006/09/07 Javascript
asp javascript 实现关闭窗口时保存数据的办法
2007/11/24 Javascript
document.compatMode介绍
2009/05/21 Javascript
点击文章内容处弹出页面代码
2009/10/01 Javascript
善用事件代理,警惕闭包的性能陷阱。
2011/01/20 Javascript
判断用户的在线状态 onbeforeunload事件
2011/03/05 Javascript
javascript:history.go()和History.back()的区别及应用
2012/11/25 Javascript
JavaScript中的prototype.bind()方法介绍
2014/04/04 Javascript
BootStrap学习系列之Bootstrap Typeahead 组件实现百度下拉效果(续)
2016/07/07 Javascript
纯js三维数组实现三级联动效果
2017/02/07 Javascript
Bootstrap实现的经典栅格布局效果实例【附demo源码】
2017/03/30 Javascript
jquery实现图片轮播器
2017/05/23 jQuery
浅谈Node.js ORM框架Sequlize之表间关系
2017/07/24 Javascript
Vue基于NUXT的SSR详解
2017/10/24 Javascript
JavaScript学习笔记之数组基本操作示例
2019/01/09 Javascript
Vue 的双向绑定原理与用法揭秘
2020/05/06 Javascript
解决vue中axios设置超时(超过5分钟)没反应的问题
2020/09/04 Javascript
Python中用startswith()函数判断字符串开头的教程
2015/04/07 Python
python实现决策树、随机森林的简单原理
2018/03/26 Python
python使用正则表达式(Regular Expression)方法超详细
2019/12/30 Python
Python计算指定日期是今年的第几天(三种方法)
2020/03/26 Python
Django ORM filter() 的运用详解
2020/05/14 Python
Python如何将字符串转换为日期
2020/07/31 Python
Python logging模块进行封装实现原理解析
2020/08/07 Python
html5中canvas学习笔记1-画板的尺寸与实际显示尺寸
2013/01/06 HTML / CSS
我的祖国演讲稿
2014/05/04 职场文书
文明和谐家庭事迹材料
2014/05/18 职场文书
医德医魂心得体会
2014/09/11 职场文书
2014年小学英语教师工作总
2014/12/03 职场文书
农业项目投资意向书
2015/05/09 职场文书
2015年乡镇民政工作总结
2015/05/13 职场文书
Ruby GDBM操作简介及数据存储原理
2022/04/19 Ruby