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

时间: 2024-11-12 17:25:33

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

python中xrange和range的区别

这两个基本上都是在循环的时候用. for i in range(0, 100): print i for i in xrange(0, 100): print i 这两个输出的结果都是一样的,实际上有很多不同,range会直接生成一个list对象: a = range(0,100) print type(a) print a #[0,1,2...] print a[0], a[1] 而xrange则不会直接生成一个list,而是每次调用返回其中的一个值 a = xrange(0,100) pri

python中xrange和range的异同

range    函数说明:range([start,] stop[, step]),根据start与stop指定的范围以及step设定的步长,生成一个序列(列表). >>> range(5) [0, 1, 2, 3, 4] >>> range(1,5) [1, 2, 3, 4] >>> range(0,6,2) [0, 2, 4] xrange    函数说明:用法与range完全相同,所不同的是生成的不是一个数组,而是一个生成器.xrange示例:

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

1.range()函数: 函数说明:range([start,] stop[, step]),根据start与stop指定的范围以及step设定的步长,生成一个序列. >>> #range()函数不支持0参数 ... >>> range() Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: range expect

python中xrange用法分析

本文实例讲述了python中xrange用法.分享给大家供大家参考.具体如下: 先来看如下示例: >>> x=xrange(0,8) >>> print x xrange(8) >>> print x[0] 0 >>> print x[7] 7 >>> print x[8] Traceback (most recent call last): File "<stdin>", line

python中xrange和yield的用法

相信很多人对xrange和yield都不是很清楚,网上很多文章也是写的云里雾里的,今天我用最简单的例子给大家说下. 说起xrange的时候就一定要提range,其实xrange 用法与 range 完全相同,所不同的是生成的不是一个list对象,而是一个生成器. >>> xrange(5) xrange(5) >>> list(xrange(5)) [0, 1, 2, 3, 4] >>> xrange(1,5) xrange(1, 5) >>

Python细说 xrange 和 range 的区别

Python版本2.X: range的返回值是list,这意味着内存将会分布相应的长度的空间给list. xrange的返回值是一个生成器,有利于节省内存空间. Python版本3.X: 在3.X版本中,Python对range函数做了优化,并且取消了xrange函数. 3.X版本中,range函数返回的是一个range对象,如下. 1 >>> print(sys.version) 2 3.5.3 (v3.5.3:1880cb95a742, Jan 16 2017, 16:02:32)

Python中range的用法

Python中range的用法 函数原型:range(start, end, scan): 参数含义:start:计数从start开始.默认是从0开始.例如range(5)等价于range(0, 5); end:技术到end结束,但不包括end.例如:range(0, 5) 是[0, 1, 2, 3, 4]没有5 scan:每次跳跃的间距,默认为1.例如:range(0, 5) 等价于 range(0, 5, 1)

python 中UnicodeEncodeError: &#39;ascii&#39; codec can&#39;t encode characters in position 0-7: ordinal not in range(128)的解决方法

SyntaxError: Non-ASCII character '\xe6' in file出现这个问题是因为中文出现在了代码中,解决方法为在代码最上面添加:#coding:utf-8 UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-7: ordinal not in range(128) 这个问题则是在程序中写入中文时出错,解决方法为在开头添加: import sys reload(sys) sy

python中for _ in range () 中&#39;_&#39;的意思

python中for _ in range () 中’_'的意思 以斐波那契数列为例 #求前20项的斐波那契数 a = 0 b = 1 for _ in range(20): (a, b) = (b, a + b) print(a, end=' ') 其中’_’ 是一个循环标志,也可以用i,j 等其他字母代替,下面的循环中不会用到,起到的是循环此数的作用就像C语言中 for (int i ; i<100 ; i++){ 代码块; } 其中的’i’在下面并不会用到,起到的只是控制循环此数的作用——