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 相关文章推荐
本地文件上传到七牛云服务器示例(七牛云存储)
Jan 11 Python
python网络编程学习笔记(10):webpy框架
Jun 09 Python
Python实现的简单发送邮件脚本分享
Nov 07 Python
python同时给两个收件人发送邮件的方法
Apr 30 Python
python3+mysql查询数据并通过邮件群发excel附件
Feb 24 Python
python网络爬虫学习笔记(1)
Apr 09 Python
Python实现个人微信号自动监控告警的示例
Jul 03 Python
Django 用户认证组件使用详解
Jul 23 Python
用python3读取python2的pickle数据方式
Dec 25 Python
python的setattr函数实例用法
Dec 16 Python
Python下opencv库的安装过程及问题汇总
Jun 11 Python
Python OpenGL基本配置方式
May 20 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
239军机修复记
2021/03/02 无线电
mcrypt启用 加密以及解密过程详细解析
2013/08/07 PHP
php中switch与ifelse的效率区别及适用情况分析
2015/02/12 PHP
PHP之浮点数计算比较以及取整数不准确的解决办法
2015/07/29 PHP
php用户名的密码加密更安全的方法
2019/06/21 PHP
Nigma vs Liquid BO3 第一场2.13
2021/03/10 DOTA
jQuery的强大选择器小结
2009/12/27 Javascript
兼容ie、firefox的图片自动缩放的css跟js代码分享
2012/01/21 Javascript
在jQuery中 常用的选择器介绍
2013/04/16 Javascript
jQuery获取当前对象标签名称的方法
2014/02/07 Javascript
js判断手机端(Android手机还是iPhone手机)
2015/07/22 Javascript
浅谈EasyUi ComBotree树修改 父节点选择的问题
2016/11/07 Javascript
Bootstrap源码解读排版(1)
2016/12/23 Javascript
JS常用知识点整理
2017/01/21 Javascript
jQuery插件FusionCharts绘制的3D环饼图效果示例【附demo源码】
2017/04/02 jQuery
Vue中v-show添加表达式的问题(判断是否显示)
2018/03/26 Javascript
vue2.0+ 从插件开发到npm发布的示例代码
2018/04/28 Javascript
Vue组件全局注册实现警告框的实例详解
2018/06/11 Javascript
Vue 与 Vuex 的第一次接触遇到的坑
2018/08/16 Javascript
angularJs使用ng-repeat遍历后选中某一个的方法
2018/09/30 Javascript
小程序实现短信登录倒计时
2019/07/12 Javascript
[28:48]《真视界》- 2017年国际邀请赛
2017/09/27 DOTA
Python(TensorFlow框架)实现手写数字识别系统的方法
2018/05/29 Python
Python SVM(支持向量机)实现方法完整示例
2018/06/19 Python
Pycharm设置utf-8自动显示方法
2019/01/17 Python
Python常用模块函数代码汇总解析
2020/08/31 Python
HTML5计时器小例子
2013/10/15 HTML / CSS
HTML5实现移动端复制功能
2018/04/19 HTML / CSS
送给他或她的礼物:FUN.com
2018/08/17 全球购物
高中生期末评语
2014/01/28 职场文书
继承公证书样本
2014/04/04 职场文书
本科生导师推荐信范文
2014/05/18 职场文书
2015年世界无烟日活动方案
2015/05/04 职场文书
Python基础知识之变量的详解
2021/04/14 Python
JavaScript流程控制(循环)
2021/12/06 Javascript
铁拳制作人赞《铁拳7》老头环Mod:制作精良 但别弄了
2022/04/03 其他游戏