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实现简单socket程序在两台电脑之间传输消息的方法
Mar 13 Python
Python的自动化部署模块Fabric的安装及使用指南
Jan 19 Python
Sanic框架配置操作分析
Jul 17 Python
Python字典中的键映射多个值的方法(列表或者集合)
Oct 17 Python
在python中利用GDAL对tif文件进行读写的方法
Nov 29 Python
用Python逐行分析文件方法
Jan 28 Python
Python3.4解释器用法简单示例
Mar 22 Python
Python可迭代对象操作示例
May 07 Python
python如何更新包
Jun 11 Python
appium+python自动化配置(adk、jdk、node.js)
Nov 17 Python
python绘制高斯曲线
Feb 19 Python
python利用xpath爬取网上数据并存储到django模型中
Feb 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网上商城购物车设计代码分享
2012/02/15 PHP
PHP内核探索:变量存储与类型使用说明
2014/01/30 PHP
PHP生成条形码大揭秘
2015/09/24 PHP
php 删除指定文件夹的实例讲解
2017/07/25 PHP
php实现断点续传大文件示例代码
2020/06/19 PHP
驱动事件的addEvent.js代码
2007/03/27 Javascript
Jquery Autocomplete 结合asp.net使用要点
2010/10/29 Javascript
jQuery扁平化风格下拉框美化插件FancySelect使用指南
2015/02/10 Javascript
javascript笛卡尔积算法实现方法
2015/04/08 Javascript
在线引用最新jquery文件的实现方法
2016/08/26 Javascript
基于jquery实现弹幕效果
2016/09/29 Javascript
jQuery的ready方法实现原理分析
2016/10/26 Javascript
分类解析jQuery选择器
2016/11/23 Javascript
JSON键值对序列化和反序列化解析
2017/01/24 Javascript
vue结合element-ui使用示例
2019/01/24 Javascript
vuex管理状态 刷新页面保持不被清空的解决方案
2019/11/11 Javascript
小谈angular ng deploy的实现
2020/04/07 Javascript
antd日期选择器禁止选择当天之前的时间操作
2020/10/29 Javascript
python采用django框架实现支付宝即时到帐接口
2016/05/17 Python
python装饰器常见使用方法分析
2019/06/26 Python
解决pycharm不能自动补全第三方库的函数和属性问题
2020/03/12 Python
Django之腾讯云短信的实现
2020/06/12 Python
python开根号实例讲解
2020/08/30 Python
美国在线眼镜店:GlassesShop
2018/11/15 全球购物
英国标准协会商店:BSI Shop
2019/02/25 全球购物
西部世纪面试题
2014/12/05 面试题
建筑装饰学院室内设计专业个人自我评价
2013/12/07 职场文书
小学生打架检讨书
2014/01/26 职场文书
20年同学聚会感言
2014/02/03 职场文书
政治学求职信
2014/06/03 职场文书
搞笑的获奖感言
2014/08/16 职场文书
2015年世界环境日活动总结
2015/02/11 职场文书
如何书写先进事迹材料?
2019/07/02 职场文书
WordPress多语言翻译插件 - WPML使用教程
2021/04/01 PHP
python基础之文件操作
2021/10/24 Python
Win11 Build 21996.1 Dev版怎么样? win11系统截图欣赏
2021/11/21 数码科技