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中的XML库4Suite Server的介绍
Apr 14 Python
Python彩色化Linux的命令行终端界面的代码实例分享
Jul 02 Python
关于pip的安装,更新,卸载模块以及使用方法(详解)
May 19 Python
Python抓取框架Scrapy爬虫入门:页面提取
Dec 01 Python
Python实现将数据框数据写入mongodb及mysql数据库的方法
Apr 02 Python
Python将list中的string批量转化成int/float的方法
Jun 26 Python
Django 登陆验证码和中间件的实现
Aug 17 Python
Python中函数的基本定义与调用及内置函数详解
May 13 Python
用python实现前向分词最大匹配算法的示例代码
Aug 06 Python
基于python模拟TCP3次握手连接及发送数据
Nov 06 Python
细说NumPy数组的四种乘法的使用
Dec 18 Python
python 实现百度网盘非会员上传超过500个文件的方法
Jan 07 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
《魔兽世界》惊魂幻象将获得调整
2020/03/08 其他游戏
PHP与javascript实现变量交互的示例代码
2013/07/23 PHP
显示youtube视频缩略图和Vimeo视频缩略图代码分享
2014/02/13 PHP
ThinkPHP的I方法使用详解
2014/06/18 PHP
Laravel 4 初级教程之Pages、表单验证
2014/10/30 PHP
ThinkPHP水印功能实现修复PNG透明水印并增加JPEG图片质量可调整
2014/11/05 PHP
用php来限制每个ip每天浏览页面数量的实现思路
2015/02/24 PHP
用PHP代码在网页上生成图片
2015/07/01 PHP
分享ThinkPHP3.2中关联查询解决思路
2015/09/20 PHP
理解PHP中的Session及对Session有效期的控制
2016/01/08 PHP
详解php中curl返回false的解决办法
2019/03/18 PHP
用jscript实现列出安装的软件列表
2007/06/18 Javascript
语义化 H1 标签
2008/01/14 Javascript
获取中文字符串的实际长度代码
2014/06/05 Javascript
基于豆瓣API+Angular开发的web App
2015/01/02 Javascript
简介JavaScript中的setHours()方法的使用
2015/06/11 Javascript
浅谈jQuery为哪般去掉了浏览器检测
2016/08/29 Javascript
ES6中Proxy与Reflect实现重载(overload)的方法
2017/03/30 Javascript
浅谈JS如何实现真正的对象常量
2017/06/25 Javascript
Angular5.1新功能分享
2017/12/21 Javascript
详解Angular结合zTree异步加载节点数据
2018/01/20 Javascript
利用Decorator如何控制Koa路由详解
2018/06/26 Javascript
[01:11:48]Fnatic vs IG 2018国际邀请赛小组赛BO2 第二场 8.17
2018/08/18 DOTA
Python基础教程之利用期物处理并发
2018/03/29 Python
解决Python安装后pip不能用的问题
2018/06/12 Python
终端命令查看TensorFlow版本号及路径的方法
2018/06/13 Python
PyQt5笔记之弹出窗口大全
2019/06/20 Python
Django中FilePathField字段的用法
2020/05/21 Python
主键(Primary Key)约束和唯一性(UNIQUE)约束的区别
2013/05/29 面试题
仓库管理专业个人的自我评价
2013/12/30 职场文书
运动会广播稿500字
2014/01/28 职场文书
股东授权委托书范文
2014/09/13 职场文书
出纳年终工作总结2014
2014/12/05 职场文书
挂职锻炼工作总结2015
2015/05/28 职场文书
安全教育主题班会教案
2015/08/12 职场文书
Redis读写分离搭建的完整步骤
2021/09/14 Redis