• 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

  • 相关阅读:
    为什么网站不被百度收录或收录清零?
    XmlSerializer序列化一组成员到文本文件
    windows phone不同页面间传值
    windows phone下进行Isolated的IO读写
    windows Phone 后退键历史的清除
    Window Phone ListBox的DataBinding:
    VGA的相关代码
    如何避免Quartus II自動將未宣告的信號視為wire?
    XINLINX约束心得
    VIM配置文件备份
  • 原文地址:https://www.cnblogs.com/shixisheng/p/7089930.html
Copyright © 2020-2023  润新知