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模拟登录百度贴吧(百度贴吧登录)实例
Dec 18 Python
Python读取系统文件夹内所有文件并统计数量的方法
Oct 23 Python
selenium+python自动化测试之使用webdriver操作浏览器的方法
Jan 23 Python
tensorflow使用指定gpu的方法
Feb 04 Python
Django单元测试中Fixtures的使用方法
Feb 26 Python
Python中SQLite如何使用
May 27 Python
Python脚本实现Zabbix多行日志监控过程解析
Aug 26 Python
Python实现壁纸下载与轮换
Oct 19 Python
python 通过 pybind11 使用Eigen加速代码的步骤
Dec 07 Python
python matplotlib工具栏源码探析二之添加、删除内置工具项的案例
Feb 25 Python
PyQt5实现多张图片显示并滚动
Jun 11 Python
python playwrigh框架入门安装使用
Jul 23 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
WordPress开发中自定义菜单的相关PHP函数使用简介
2016/01/05 PHP
php、mysql查询当天,查询本周,查询本月的数据实例(字段是时间戳)
2017/02/04 PHP
php中输出json对象的值(实现方法)
2018/03/07 PHP
使用UglifyJS合并/压缩JavaScript的方法
2012/03/07 Javascript
JavaScript创建一个欢迎cookie弹出窗实现代码
2013/03/15 Javascript
jQuery 获取和设置select下拉框的值实现代码
2013/11/08 Javascript
js动态创建上传表单通过iframe模拟Ajax实现无刷新
2014/02/20 Javascript
$.each与$().each的区别示例介绍
2014/03/20 Javascript
浅谈javascript的call()、apply()、bind()的用法
2016/02/21 Javascript
Bootstrap在线电子商务网站实战项目5
2016/10/14 Javascript
H5上传本地图片并预览功能
2017/05/08 Javascript
使用axios发送post请求,将JSON数据改为form类型的示例
2019/10/31 Javascript
AngularJS动态生成select下拉框的方法实例
2019/11/17 Javascript
基于Vue实现微前端的示例代码
2020/04/24 Javascript
javascript中call,apply,bind的区别详解
2020/12/11 Javascript
浅谈Python中的闭包
2015/07/08 Python
python中numpy包使用教程之数组和相关操作详解
2017/07/30 Python
python 读取txt中每行数据,并且保存到excel中的实例
2018/04/29 Python
Python实现网站表单提交和模板
2019/01/15 Python
关于不懂Chromedriver如何配置环境变量问题解决方法
2019/06/12 Python
pytorch 实现cross entropy损失函数计算方式
2020/01/02 Python
Ubuntu16.04安装python3.6.5步骤详解
2020/01/10 Python
Python API len函数操作过程解析
2020/03/05 Python
对Python 字典元素进行删除的方法
2020/07/31 Python
Python 操作 MySQL数据库
2020/09/18 Python
Selenium获取登录Cookies并添加Cookies自动登录的方法
2020/12/04 Python
AE美国鹰美国官方网站:American Eagle Outfitters
2016/08/22 全球购物
英国的一家创新礼品和小工具零售商:Menkind
2019/08/24 全球购物
L’Artisan Parfumeur官网:法国香水品牌
2020/08/11 全球购物
利用promise及参数解构封装ajax请求的方法
2021/03/24 Javascript
大专毕业生简历的自我评价
2013/10/20 职场文书
护士实习自我鉴定
2013/10/22 职场文书
平面网站制作专科生的自我评价分享
2013/12/11 职场文书
文秘应聘自荐书范文
2014/02/18 职场文书
学生会竞选演讲稿学习部
2014/08/25 职场文书
加薪通知
2015/04/25 职场文书