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递归遍历列表及输出的实现方法
May 19 Python
浅谈Python数据类型之间的转换
Jun 08 Python
pandas DataFrame实现几列数据合并成为新的一列方法
Jun 08 Python
python画微信表情符的实例代码
Oct 09 Python
python机器学习实现决策树
Nov 11 Python
Selenium向iframe富文本框输入内容过程图解
Apr 10 Python
为什么python比较流行
Jun 19 Python
完美解决keras 读取多个hdf5文件进行训练的问题
Jul 01 Python
python爬取网易云音乐热歌榜实例代码
Aug 07 Python
Python爬取你好李焕英豆瓣短评生成词云的示例代码
Feb 24 Python
python实战之一步一步教你绘制小猪佩奇
Apr 22 Python
方法汇总:Python 安装第三方库常用
Apr 26 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中return 和 exit 、break和contiue 区别与用法
2012/04/09 PHP
超级简单的图片防盗(HTML),好用
2007/04/08 Javascript
服务器端的JavaScript脚本 Node.js 使用入门
2012/03/07 Javascript
js图片滚动效果时间可随意设定当鼠标移上去时停止
2014/06/26 Javascript
jQuery选择器querySelector的使用指南
2015/01/23 Javascript
JavaScript中常用的六种互动方法示例
2015/03/13 Javascript
简单谈谈javascript中this的隐式绑定
2016/02/22 Javascript
浅谈Vue2.0父子组件间事件派发机制
2018/01/08 Javascript
vuejs 动态添加input框的实例讲解
2018/08/24 Javascript
Node.js中package.json中库的版本号(~和^)
2019/04/02 Javascript
在Vue中使用icon 字体图标的方法
2019/06/14 Javascript
支付宝小程序实现省市区三级联动
2020/06/21 Javascript
vue 手机物理监听键+退出提示代码
2020/09/09 Javascript
vant-ui框架的一个bug(解决切换后onload不触发)
2020/11/11 Javascript
[16:19]教你分分钟做大人——风暴之灵
2015/03/11 DOTA
[00:36]我的中国心——Serenity vs Fnatic
2018/08/21 DOTA
详解Canvas实用库Fabric.js使用手册
2019/01/07 HTML / CSS
Sneaker Studio匈牙利:购买运动鞋
2018/03/26 全球购物
世界上最大的艺术和工艺用品商店:MisterArt.com
2018/07/13 全球购物
澳大利亚在线奢侈品时尚零售平台:Azura Runway
2021/01/13 全球购物
电焊工岗位职责
2014/03/06 职场文书
教师产假请假条范文
2014/04/10 职场文书
法院信息化建设方案
2014/05/21 职场文书
学校爱国卫生月活动总结
2014/06/25 职场文书
环保项目建议书
2014/08/26 职场文书
法英专业大学生职业生涯规划书范文
2014/09/22 职场文书
校园游戏活动新闻稿
2014/10/15 职场文书
2014年底个人工作总结
2015/03/10 职场文书
自主招生推荐信格式模板
2015/03/24 职场文书
2015年司法局工作总结
2015/05/22 职场文书
公司管理制度范本
2015/08/03 职场文书
学生会任命书范本
2015/09/21 职场文书
班干部竞选演讲稿(精选5篇)
2019/09/24 职场文书
Python使用DFA算法过滤内容敏感词
2022/04/22 Python
解决Vmware虚拟机安装centos8报错“Section %Packages Does Not End With %End. Pane Is Dead”
2022/06/01 Servers
nginx静态资源的服务器配置方法
2022/07/07 Servers