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中字符串的常见操作技巧总结
Jul 28 Python
python实现微信接口(itchat)详细介绍
Oct 23 Python
如何利用Python分析出微信朋友男女统计图
Jan 25 Python
python保存字典和读取字典的实例代码
Jul 07 Python
python pyenv多版本管理工具的使用
Dec 23 Python
Python list运算操作代码实例解析
Jan 20 Python
pytorch ImageFolder的覆写实例
Feb 20 Python
python实现翻译word表格小程序
Feb 27 Python
Python标准库json模块和pickle模块使用详解
Mar 10 Python
python中的selenium安装的步骤(浏览器自动化测试框架)
Mar 17 Python
Python实现自动签到脚本功能
Aug 20 Python
python3.9之你应该知道的新特性详解
Apr 29 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源代码
2006/10/09 PHP
PHP网站提速三大“软”招
2006/10/09 PHP
一家之言的经验之谈php+mysql扎实个人基本功
2008/03/27 PHP
PHP代码审核的详细介绍
2013/06/13 PHP
关于PHP模板Smarty的初级使用方法以及心得分享
2013/06/21 PHP
php上传图片到指定位置路径保存到数据库的具体实现
2013/12/30 PHP
php使用GD实现颜色渐变实例
2015/06/02 PHP
CentOS下与Apache连接的PHP多版本共存方案实现详解
2015/12/19 PHP
PHP使用Session实现上传进度功能详解
2019/08/06 PHP
Add a Picture to a Microsoft Word Document
2007/06/15 Javascript
兼容IE和FF的图片上传前预览js代码
2013/05/28 Javascript
jQuery读取和设定KindEditor值的方法
2013/11/22 Javascript
jQuery实现可用于博客的动态滑动菜单
2015/03/09 Javascript
Markdown与Bootstrap相结合实现图片自适应属性
2016/05/04 Javascript
jQuery Mobile 触摸事件实例
2016/06/04 Javascript
vuejs动态组件给子组件传递数据的方法详解
2016/09/09 Javascript
BootStrap与validator 使用笔记(JAVA SpringMVC实现)
2016/09/21 Javascript
深入理解Vue2.x的虚拟DOM diff原理
2017/09/27 Javascript
Js利用prototype自定义数组方法示例
2017/10/20 Javascript
vue项目中使用AES实现密码加密解密(ECB和CBC两种模式)
2019/08/12 Javascript
详解vue-video-player使用心得(兼容m3u8)
2019/08/23 Javascript
layui表格分页 记录勾选的实例
2019/09/02 Javascript
Python数据结构与算法之图的基本实现及迭代器实例详解
2017/12/12 Python
Python之两种模式的生产者消费者模型详解
2018/10/26 Python
Python使用scrapy爬取阳光热线问政平台过程解析
2019/08/14 Python
ASOS英国官网:英国在线时装和化妆品零售商
2017/05/19 全球购物
Space NK美国站:英国高端美妆护肤商城
2017/05/22 全球购物
Tripadvisor新西兰:阅读评论,比较价格和酒店预订
2018/02/10 全球购物
关于赌博的检讨书
2014/01/24 职场文书
人事专员工作职责
2014/02/22 职场文书
工程类专业自荐信范文
2014/03/09 职场文书
八项规定对照检查材料
2014/08/31 职场文书
个人收入证明模板
2014/09/18 职场文书
2014最新预备党员思想汇报范文:中国梦,我的梦
2014/10/25 职场文书
2015年医药代表工作总结
2015/04/25 职场文书
2016年圣诞节活动总结范文
2016/04/01 职场文书