Python學習札記(1)——Python的數據結構(序列)

  1. 相關知識的介紹python

    1.1 序列的類型數據結構

    序列是Python最基本的數據結構。app

    python有6種內建序列:列表、元組、字符串、unicode字符串、buffer對象和xrange對象。函數

    序列能夠插入、刪除、替換而且全部序列都支持迭代。spa

    1.2 索引code

    索引能夠理解爲序列裏每個元素的標號,從0開始,以-1結束,對象

    也就是說第一個元素的索引是0,而最後一個元素的索引是-1,排序

    如c='2011',c[0]=2,c[1]=0,c[2]=1,c[-1]=1。索引

    1.3 分片隊列

    使用分片,訪問必定範圍內的元素。分片經過冒號相隔的兩個索引實現。

    如:c='Python',當要輸出tho時能夠編寫如:print c[2:5],即輸出從索引爲二到索引爲五的全部元素

    將c所有輸出,能夠編寫爲:print c[0:len(c)]或者print c[:]

    輸出最後三位能夠編寫爲:print c[:-3]

    輸出前三位能夠編寫爲:print c[:3]或print c[-3:]

    但print c[0:-1]或者print c[0:-2]等沒法輸出所有字符。

    由於[前索引:後索引)輸出從前索引開始到後索引以前結束,不包括後索引自己所指的元素


    1.4 步長

    當咱們要跳躍式的輸出元素時,咱們可使用步長。

    步長默認值爲1,能夠爲負數(步長爲負數時將倒序輸出),但不能爲0!
    若是更改步長則在兩個索引後用冒號分隔:如[前索引:後索引:步長]
    如:mynumber = [1,2,3,4,5,6,7,8,9,10]
          mynumber[::4] =》 [1,5,9]                       #步長爲4,隔3個元素輸出第四個元素
          mynumber[8:3:-1] =》 [9,8,7,6,5]            #從第8個元素倒序到第4個元素
          mynumber[0:10:-2] =》 []                       #0比10在序列中更早出現,因此無輸出
          mynumber[::-2] =》 [10,8,6,4,2]              #倒序輸出
          mynumber[5::-2] =》[6,4,2]
          mynumber[:5:-2] =》[10,8]

    1.5 相加

    同類型的能夠相加,不一樣類型的不能夠相加

    1.6 相乘

    1.7 None、空列表和初始化

    None是python的內建值,表示爲空(相似於c的null)
    若是想創建一個長度必定的空列表能夠:[None]*n

    1.8 成員資格

    判斷一個值是否在序列中,使用in運算符,若是存在返回True,不然返回False

  2. 列表

    2.1 列表的建立

    list(‘Hello’);//list函數用於建立一個列表,能夠由其它類型序列建立,如例子中由字符串建立列表。

    或:shoplist=['apple','banana','carrot','pear','grape']

    2.2 列表元素賦值

    用索引能夠改變該索引所在的列表元素的值。

    如:numberlist[2] =  100

    2.3 列表元素刪除

    使用del操做符能夠刪除列表中某個索引的元素。

    固然也能夠分片刪除,如del numberlist[2:3]或者numberlist[2:3] = []


    2.4 分片賦值

    numberlist = list('12345678');
    numberlist[1:4] = []; =》['1','5','6','7','8']//替換空元素,實現刪除
    numberlist[1:1] = list('234'); =》['1','2','3','4','5','6','7','8']//使用相同的索引位置,能夠在該位置實現插入
    numberlist[1:] = list('abc'); =》['1','a','b','c']//從某個索引位置開始替換到結尾

    2.5 綁定

    當我在用替換空元素來刪除元素時,遇到了一個問題:

    爲何事先將numberlist的值用 = 賦給olditem,在修改了numberlist後,olditem的值也一塊兒被修改了呢?

    首先,咱們要清楚的是:

    當咱們建立一個對象並給它賦一個變量的時候,這個變量僅僅參考那個對象,

    而不是表示這個對象自己!也就是說,變量名指向你計算機中存儲那個對象的內存

    這被稱做名稱到對象的綁定

    咱們能夠試着證實。

    證實前,咱們得了解一個函數id(),函數id()的解釋以下:

    那咱們能夠看看不管是olditem仍是numberlist所指向的內存地址是否是同一個。

           

      如上圖所示,olditem及numberlist指向的內存地址是同一個,

      這也就不難解釋爲何修改了numberlist的同時olditem也被修改了。

      那咱們如何將numberlist的值賦給olditem才能保證他們所指的不是同一個內存單元地址或者說

      當咱們該別numberlist的值時olditem的值保持不變呢?

      答案就是:得使用切片操做符來創建序列的拷貝!

        

      上圖是否是很好的證實了列表的賦值語句建立拷貝。必須使用切片操做符來才能創建序列的拷貝?

      2.6 列表方法

      python中方法的概念:方法是與對象有緊密聯繫的函數。
      方法的調用方式:對象.方法(參數)
      列表的方法:

            (1)append用於列表尾追加元素。append方法直接修改原列表而不是返回一個新列表。
            (2)count方法用於統計某個元素出現測次數。
            (3)extend方法用於在列表尾追加另外一個列表(擴展)。list1.extend(list2),修改list1,list2不變。
            extend看起來像鏈接(+)操做,可是鏈接只會生成新的列表副本,而不會改變原有兩個列表。
            用鏈接實現擴展(extend):a= a+b,雖然能夠實現可是沒有extend方法效率高。
            用分片替換實現擴展(extend):a[len(a):] = b;能夠實現可是可讀性很差。
            (4)index方法用於找出第一個與給定值匹配的元素的索引位置。若是沒有該值則異常。
            (5)insert方法用於向列表中插入對象。對象.insert(插入位置,插入值);也能夠用分片賦值實現插入。
            (6)pop方法用於刪除列表中某一元素。默認刪除最後一個元素。該方法返回被刪除的元素的值。
            pop是惟一一個既能修改列表又返回元素值的列表方法。
            默認的append和pop方法結合使用能夠實現棧的操做(LIFO)
            使用insert(0,...)和pop方法能夠實現隊列的操做(FIFO)
            (7)remove用於移除列表中的某個值的第一個匹配項。remove是一個沒有返回值的原位置改變方法,
            它修改列表可是沒有返回值。
            (8)reverse方法將列表中的方法反向存儲。
            (9)sort方法用於在原位置對列表排序,原位置意味着改變列表而不是返回列表副本。(升序排列)
            注意sort沒有返回值,若是當遇到想對某列表進行排序,可是又不想改變原列表的狀況下,則須要
            以下操做:
            y = x[:];//將列表x複製給y   注意若是隻簡單的用y = x,實際上y和x仍是指向的同一個對象!
            y.sort();
            sorted函數能夠生成一個列表的副本,sorted是函數不是方法,它能夠用於任何序列,但返回值都爲列表。
            高級排序:
            sort方法參數:1.能夠指定排序比較函數,lst.sort(cmp);
            2.能夠給每一個元素建立鍵,按照鍵排序,lst.sort(key = len);
            3.能夠指定是否反向排序,lst.sort(reverse = True);

  3. 元組

    3.1 元組的基本介紹

        元組能夠看做是元素值不能改變的列表。由於元素值 不能改變,因此元組沒有方法。

        即便元組只有一個值也要用‘,’分開

        42 不是元組,(42)也不是元組,(42,)纔是元組。

        3*(40+2)  =》126

        3*(40+2,) =》(42,42,42)

     3.2 tuple函數

        上面說的是元組沒有方法,不是說元組沒有函數!

         tuple函數將列表轉換爲元組.

       

     3.3 元組不可替代的緣由:

        (1)元組能夠在映射中看成鍵使用,但列表不能夠

        (2)元組做爲不少內建函數和方法的返回值存在

相關文章
相關標籤/搜索