说到序列,我们第一想到的是一组有序元素组成的集合。同时,每个元素都有唯一的下标作为索引。

Python中,有许多内界的序列。包括元组tuple,列表list,字符串str等。上面提到的序列类型(list,tuple,str)有一个共同的特点,就是当序列对象创建时,需要开辟专门的内存空间,保存序列中的所有元素。换句话说,这些序列对象本质上,是一个集合。

例如,下面代码创建了一个序列对象s。在该对象序列创建时,需要开辟内存空间将序列中的3个元素(整数1,2,3)保存下来。

s=[1,2,3]  

然而,根据python官方文档的定义,一个序列对象不必要保存所有的元素。一般来说,一个序列对象至少需要实现如下两个方法。

  • __len__方法。该方法返回序列长度,也即序列中元素个数。
  • __getitem__方法。该方法有一个整型参数(不妨记为index)。它需要返回序列中下标为index的元素的值。

例如,下面的代码定义了一个序列类型。

class MyRange:
def __init__(self, start, end):
self.start = start
self.end = end def __len__(self):
return self.end - self.start def __getitem__(self, index):
if index < 0 or index >= len(self):
raise IndexError
return index + self.start

它定义的是从start到end-1之间所有整数组成的序列。

  • 代码中的__len__方法返回序列的长度。
  • 代码中的__getitem__方法返回序列中第index个元素。其中第10-11行判断index的是否越界。值得一提的是,第10行调用的len方法是Python的内建方法,它会调用序列对象的__len__方法。可以想见,__getitem__方法其实实现了序列对象的通项公式。

下面的测试代码

myrange = MyRange(0, 10)
print myrange[9]
print myrange[10]

输出如下

9
Traceback (most recent call last):
File "test.py", line 25, in <module>
print myrange[10]
File "test.py", line 19, in __getitem__
raise IndexError
IndexError

当然,在Python中,序列的下标是可以为负的。因此,我们对__getitem__方法做如下修改。

class MyRange:
def __getitem__(self, index):
index = index if index >= 0 else index + self.end
if index < 0 or index >= len(self):
raise IndexError
return index + self.start

测试代码

myrange = MyRange(0, 10)
print myrange[-1]
print myrange[-2]

输出结果

9
8

有了上面的介绍以后,我们可以很容易理解python中range方法与xrange方法区别了。

  • range方法返回的是一个list对象,它需要开辟专门的空间保存序列中所有的元素。
  • xrange方法返回的是xrange对象,它是一个序列对象,但并不保存序列中的元素。其实现方法与本文介绍的MyRange类型类似。

因此,如果只对序列进行读操作,xrange方法效率较高;但是如果需要改变序列的元素,或者需要往序列增删元素,那只能通过range方法生成一个list对象。

转自:http://blog.csdn.net/hedan2013/article/details/55000018

python中xrange和range(转)的更多相关文章

  1. Python 中xrange和range区别

    先看看Python help()的说明 help(range) Help on built-in function range in module __builtin__: range(...) ra ...

  2. python中xrange和range的异同

    本文章系转载,原文来源不详. range    函数说明:range([start,] stop[, step]),根据start与stop指定的范围以及step设定的步长,生成一个序列.range示 ...

  3. python中xrange()和range()函数的区别使用:

    1.range()函数: 函数说明:range([start,] stop[, step]),根据start与stop指定的范围以及step设定的步长,生成一个序列. >>> #ra ...

  4. python中xrange和range的区别

    这两个基本上都是在循环的时候用. for i in range(0, 100): print i for i in xrange(0, 100): print i 这两个输出的结果都是一样的,实际上有 ...

  5. python中xrange与range的异同

    转载自:http://ciniao.me/article.php?id=17 >>> range(5) [0, 1, 2, 3, 4] >>> range(1, 5 ...

  6. python中xrange用法分析

    本文实例讲述了python中xrange用法.分享给大家供大家参考.具体如下: 先来看如下示例: >>> x=xrange(0,8) >>> print x xra ...

  7. python中xrange和yield的用法

    相信很多人对xrange和yield都不是很清楚,网上很多文章也是写的云里雾里的,今天我用最简单的例子给大家说下. 说起xrange的时候就一定要提range,其实xrange 用法与 range 完 ...

  8. python 中 len()和range()

    https://blog.csdn.net/qq_36357820/article/details/77850841

  9. Python中的range和xrange区别

    range 函数说明:range([start,] stop[, step]),根据start与stop指定的范围以及step设定的步长,生成一个序列. range示例: >>> r ...

随机推荐

  1. Android下实现一个简单的计算器源码

    下面的内容是关于Android下实现一个简单的计算器的内容. import android.app.Activity; import android.os.Bundle;import android. ...

  2. jsp用el表达式获取后台传来的值,或者获取session中的值

    <script type="text/javascript"> var usernameC = ${sessionScope.SESSION_USER_PROFILE. ...

  3. 使用web3.js监听以太坊智能合约event

    传送门: 柏链项目学院 使用web3.js监听以太坊智能合约event   当我们在前端页面调用合约时发现有些数据不会立即返回,这时还需要再调用更新数据的函数.那么这样的方法使用起来非常不便,监听ev ...

  4. AngularJS学习之旅—AngularJS HTML DOM(十三)

    1.AngularJS HTML DOM AngularJS 为 HTML DOM 元素的属性提供了绑定应用数据的指令. ng-disabled 指令:ng-disabled 指令直接绑定应用程序数据 ...

  5. IOS判断NSArray是否为空

    场景描述:判断一个集合是否为空,如果不为空执行A,如果为空执行B Java实现方法 public void exec(){ List<String> list = this.getCont ...

  6. 英语口语练习系列-C10-up and down

    <长恨歌>·白居易 长恨歌朗读视频,点我可听,thanks 长恨歌-白居易 汉皇重色思倾国,御宇多年求不得.杨家有女初长成,养在深闺人未识. 天生丽质难自弃,一朝选在君王侧.回眸一笑百媚生 ...

  7. Redis内存优化memory-optimization

    https://redis.io/topics/memory-optimization  官方文档 一.特殊编码: 自从Redis 2.2之后,很多数据类型都可以通过特殊编码的方式来进行存储空间的优化 ...

  8. ElasticSearch(八):elasticsearch.yml配置说明

    集群名称:cluster.name: my-application确保在不同的环境中的集群的名称不重复,否则,节点可能会连接到错误的集群上 节点名称:node.name: node-1默认情况下,当节 ...

  9. uWSGI、WSGI和uwsgi

    WSGI wsgi server (比如uWSGI) 要和 wsgi application(比如django )交互,uwsgi需要将过来的请求转给django 处理,那么uWSGI 和 djang ...

  10. Autoware(1)——快速开始

    该部分可参照github Autoware中的 Demo Quick_Start. 1. 建立目录“.autoware”来保存demo数据 mkdir .autoware 2. 下载Demo数据下载d ...