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重新引入被覆盖的自带function
Jul 16 Python
python字典get()方法用法分析
Apr 17 Python
Python实现给qq邮箱发送邮件的方法
May 28 Python
python变量不能以数字打头详解
Jul 06 Python
利用Celery实现Django博客PV统计功能详解
May 08 Python
Python父目录、子目录的相互调用方法
Feb 16 Python
python使用matplotlib画柱状图、散点图
Mar 18 Python
python处理大日志文件
Jul 23 Python
Python变量、数据类型、数据类型转换相关函数用法实例详解
Jan 09 Python
Python爬虫之Selenium警告框(弹窗)处理
Dec 04 Python
python+selenium实现12306模拟登录的步骤
Jan 21 Python
python基于scrapy爬取京东笔记本电脑数据并进行简单处理和分析
Apr 14 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
解析thinkphp import 文件内容变量失效的问题
2013/06/20 PHP
微信公众号点击菜单即可打开并登录微站的实现方法
2014/11/14 PHP
PHP+Mysql基于事务处理实现转账功能的方法
2015/07/08 PHP
非常强大的 jQuery.AsyncBox 弹出对话框插件
2011/08/29 Javascript
JS中的log对象获取以及debug的写法介绍
2014/03/03 Javascript
用JS在浏览器中创建下载文件
2014/03/05 Javascript
关闭浏览器窗口弹出提示框并且可以控制其失效
2014/04/15 Javascript
js中的如何定位固定层的位置
2014/06/15 Javascript
教你如何使用firebug调试功能了解javascript闭包和this
2015/03/04 Javascript
JS显示表格内指定行html代码的方法
2015/03/31 Javascript
使用getBoundingClientRect方法实现简洁的sticky组件的方法
2016/03/22 Javascript
jQuery ajax提交Form表单实例(附demo源码)
2016/04/06 Javascript
ES6新特征数字、数组、字符串
2016/10/01 Javascript
详解网站中图片日常使用以及优化手法
2017/01/09 Javascript
超全面的JavaScript开发规范(推荐)
2017/01/21 Javascript
解决node.js含有%百分号时发送get请求时浏览器地址自动编码的问题
2019/11/20 Javascript
vue中如何添加百度统计代码
2020/12/19 Vue.js
[01:33:59]真人秀《加油 DOTA》 第六期
2014/09/09 DOTA
Python打印scrapy蜘蛛抓取树结构的方法
2015/04/08 Python
Python构建XML树结构的方法示例
2017/06/30 Python
python读文件的步骤
2019/10/08 Python
python Cartopy的基础使用详解
2020/11/01 Python
Python约瑟夫生者死者小游戏实例讲解
2021/01/04 Python
AP澳洲中文网:澳洲正品直邮,包税收件无忧
2019/07/12 全球购物
美国职棒大联盟的官方手套、球和头盔:Rawlings
2020/02/15 全球购物
Belstaff英国官方在线商店:Belstaff.co.uk
2021/02/09 全球购物
什么时候用assert
2015/05/08 面试题
会计电算化专业个人的自我评价
2013/11/24 职场文书
护士岗前培训自我评鉴
2014/02/28 职场文书
古汉语文学求职信范文
2014/03/16 职场文书
党支部对照检查材料
2014/08/25 职场文书
销售简历自我评价怎么写
2014/09/26 职场文书
毕业班班主任工作总结2015
2015/07/23 职场文书
最美劳动诗,致敬所有的劳动者!
2019/07/12 职场文书
MySQL索引失效的典型案例
2021/06/05 MySQL
Go语言基础函数基本用法及示例详解
2021/11/17 Golang