python中xrange和range(转)
说到序列,我们第一想到的是一组有序元素组成的集合。同时,每个元素都有唯一的下标作为索引。
在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(转)的更多相关文章
- Python 中xrange和range区别
先看看Python help()的说明 help(range) Help on built-in function range in module __builtin__: range(...) ra ...
- python中xrange和range的异同
本文章系转载,原文来源不详. range 函数说明:range([start,] stop[, step]),根据start与stop指定的范围以及step设定的步长,生成一个序列.range示 ...
- python中xrange()和range()函数的区别使用:
1.range()函数: 函数说明:range([start,] stop[, step]),根据start与stop指定的范围以及step设定的步长,生成一个序列. >>> #ra ...
- python中xrange和range的区别
这两个基本上都是在循环的时候用. for i in range(0, 100): print i for i in xrange(0, 100): print i 这两个输出的结果都是一样的,实际上有 ...
- python中xrange与range的异同
转载自:http://ciniao.me/article.php?id=17 >>> range(5) [0, 1, 2, 3, 4] >>> range(1, 5 ...
- python中xrange用法分析
本文实例讲述了python中xrange用法.分享给大家供大家参考.具体如下: 先来看如下示例: >>> x=xrange(0,8) >>> print x xra ...
- python中xrange和yield的用法
相信很多人对xrange和yield都不是很清楚,网上很多文章也是写的云里雾里的,今天我用最简单的例子给大家说下. 说起xrange的时候就一定要提range,其实xrange 用法与 range 完 ...
- python 中 len()和range()
https://blog.csdn.net/qq_36357820/article/details/77850841
- Python中的range和xrange区别
range 函数说明:range([start,] stop[, step]),根据start与stop指定的范围以及step设定的步长,生成一个序列. range示例: >>> r ...
随机推荐
- Android远程桌面助手之性能监测篇
<Android下获取FPS的几种方法>一文中提到了Gamebench工具,它不仅可以获取FPS,还可以获取CPU及内存占用率等系统状态信息.其局限性也非常明显,切换应用时需要重新选择监控 ...
- 使用Connector/C++(VS2015)连接MySQL的完整例子
完整示例代码1 /* Copyright 2008, 2010, Oracle and/or its affiliates. All rights reserved. This program is ...
- SQL学习笔记---常用命令
常用命令 变量 1.声明 declare @变量名 类型,… 2.赋值 1.同时赋值多个变量(可以结合查询) select @变量名=表达式1,表达式2 2.单个赋值(推荐) set @变量名=表达式 ...
- Operating system error 32(failed to retrieve text for this error. Reason: 15105)
一台数据库服务器的事务日志备份作业偶尔会出现几次备份失败的情况,具体的错误信息为: DATE/TIME: 2018/7/30 12:10:52 DESCRIPTION: BackupDiskFi ...
- javascript Json和String互转
var jsonText = "{\"id\":\"123\",\"name\":\"tom\",\&qu ...
- Django学习开发--笔记一(从零开始)
创建django项目注: 首先需在python中下载django 命令:pip install django1.任意文件中创建django项目 diango-admin startproject my ...
- Python距离放弃又近了Day02
今天,来时大概复习了上一天讲过的一些计算机基础和简单数据类型和if语句,第二天就来了循环,还是个while的死循环,突然想到还是电脑好,不管循环多少次,只要电脑不崩溃,就能一直精准的算下去,这就和人不 ...
- SQL NOT NULL 约束
SQL NOT NULL 约束 NOT NULL 约束强制列不接受 NULL 值. NOT NULL 约束强制字段始终包含值.这意味着,如果不向字段添加值,就无法插入新记录或者更新记录. 下面的 SQ ...
- vue.js sha256加密
sha256: 1.使用cnpm安装 :cnpm install js-sha256 2.然后在组件中methods定义方法,在调用 let sha256 = require("js-sha ...
- 一文搞懂Raft算法
raft是工程上使用较为广泛的强一致性.去中心化.高可用的分布式协议.在这里强调了是在工程上,因为在学术理论界,最耀眼的还是大名鼎鼎的Paxos.但Paxos是:少数真正理解的人觉得简单,尚未理解 ...