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处理json数据中的中文
Mar 06 Python
pandas 条件搜索返回列表的方法
Oct 30 Python
python画图系列之个性化显示x轴区段文字的实例
Dec 13 Python
Python3实现的反转单链表算法示例
Mar 08 Python
详解Python self 参数
Aug 30 Python
python实现代码统计器
Sep 19 Python
python装饰器原理与用法深入详解
Dec 19 Python
Python魔法方法 容器部方法详解
Jan 02 Python
Tensorflow tensor 数学运算和逻辑运算方式
Jun 30 Python
python时间序列数据转为timestamp格式的方法
Aug 03 Python
如何在windows下安装配置python工具Ulipad
Oct 27 Python
python代码实现图书管理系统
Nov 30 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
Look And Say 序列php实现代码
2011/05/22 PHP
ThinkPHP模板引擎之导入资源文件方法详解
2014/06/18 PHP
PHP浮点比较大小的方法
2016/02/14 PHP
PHP高并发和大流量解决方案整理
2019/12/24 PHP
My Desktop :) 桌面式代码
2008/12/29 Javascript
javascript打开新窗口同时关闭旧窗口
2009/01/16 Javascript
javascript面向对象之对象的深入理解
2015/01/13 Javascript
jquery通过load获取文件的内容并跳到锚点的方法
2015/01/29 Javascript
jquery模拟alert的弹窗插件
2015/07/31 Javascript
JS函数的几种定义方式分析
2015/12/17 Javascript
SVG描边动画
2017/02/23 Javascript
node文件上传功能简易实现代码
2017/06/16 Javascript
移动设备手势事件库Touch.js使用详解
2017/08/18 Javascript
Vue模拟数据,实现路由进入商品详情页面的示例
2018/08/31 Javascript
ES6 系列之 Generator 的自动执行的方法示例
2018/10/19 Javascript
新版小程序登录授权的方法
2018/12/12 Javascript
Echart折线图手柄触发事件示例详解
2018/12/16 Javascript
JavaScript学习笔记之图片库案例分析
2019/01/08 Javascript
vue 全局封装loading加载教程(全局监听)
2020/11/05 Javascript
浅谈vue.watch的触发条件是什么
2020/11/07 Javascript
js仿淘宝放大镜效果
2020/12/28 Javascript
用virtualenv建立多个Python独立虚拟开发环境
2017/07/06 Python
virtualenv实现多个版本Python共存
2017/08/21 Python
python实现K最近邻算法
2018/01/29 Python
Python中的二维数组实例(list与numpy.array)
2018/04/13 Python
Python使用pyautogui模块实现自动化鼠标和键盘操作示例
2018/09/04 Python
python消除序列的重复值并保持顺序不变的实例
2018/11/08 Python
python新手学习使用库
2020/06/11 Python
英国巧克力贸易公司:Chocolate Trading Company
2017/03/21 全球购物
家乐福台湾线上购物网:Carrefour台湾
2020/09/15 全球购物
物业管理员岗位职责范文
2013/11/25 职场文书
养殖行业的创业计划书
2014/01/05 职场文书
绩效考核实施方案
2014/03/18 职场文书
工商管理本科生求职信
2014/07/13 职场文书
2014年食品安全工作总结
2014/12/04 职场文书
Python基础学习之奇异的GUI对话框
2021/05/27 Python