python入門教程(四)——列表、字符串和元組

本教程根據《python編程快速上手》製作,如需轉載,請註明出處。

一、列表數據類型

“列表”是一個值,它包含多個字構成的序列。術語“列表值”指的是列表本身(它作爲一個值,可以保存在變量中,或傳遞給函數,像所有其他值一樣),而不是指列表值之內的那些值。列表中的值也稱爲“表項”。表項用逗號分隔(就是說,它們是“逗號分隔的”)。

列表用左方括號開始,右方括號結束,即[](一對中括號)。

例如:

注意:列表中值的類型可以不一致,這和一般語言中的數組不同,一個數組的類型一般都是事先指定的。

1.1 下標訪問列表的單個值

可以用下標直接訪問列表中的值。

例子如下:

注意:列表中第一個值的下標是0,最後一個值的下標是列表最大值減1,而且下標值值只能是整數。這點與數組一致。

如果使用的下標超出了列表中值的個數,Python 將給出 IndexError 出錯信息。

列表也可以包含其他列表值。這些列表的列表中的值,可以通過多重下標來訪。

例子如下:

第一個下標表明使用哪個列表值,第二個下標表明該列表值中的值。如果只使用一個下標,程序將打印出該下標處的完整列表值。這與二維數組的訪問類似。

1.2 負數下標

雖然下標從 0 開始並向上增長,但也可以用負整數作爲下標。整數值−1 指的是列表中的最後一個下標,−2 指的是列表中倒數第二個下標,以此類推。

例子如下:

1.3 利用切片獲取子列表

“切片”可以從列表中取得多個值,結果是一個新列表。切片輸入在一對方括號中,像下標一樣,但它有兩個冒號分隔的整數。

在一個切片中,第一個整數是切片開始處的下標。第二個整數是切片結束處的下標。切片向上增長,直至第二個下標的值,但不包括它。切片求值爲一個新的列表值。

例子如下:

可以省略切片中冒號兩邊的一個下標或兩個下標。省略第一個下標相當於使用 0,或列表的開始。省略第二個下標相當於使用列表的長度,意味着分片直至列表的末尾。

例子如下:

1.4 用 len()取得列表的長度

len()函數將返回傳遞給它的列表中值的個數,就像它能計算字符串中字符的個數一樣。

例子如下:

1.5 用下標改變列表中的值

可以使用列表的下標來改變下標處的值,這點和數組一模一樣。

例子如下:

1.6 列表連接和列表複製

+操作符可以連接兩個列表,得到一個新列表,就像它將兩個字符串合併成一個新字符串一樣。*操作符可以用於一個列表和一個整數,實現列表的複製。

例子如下:

1.7 用 del 語句從列表中刪除值

del 語句將刪除列表中下標處的值,表中被刪除值後面的所有值,都將向前移動一個下標。

例子如下:

注意:del 語句也可用於一個簡單變量,刪除它,作用就像是“取消賦值”語句。如果在刪除之後試圖使用該變量,就會遇到 NameError 錯誤,因爲該變量已不再存在。del 語句幾乎總是用於刪除列表中的值。

二、使用列表

使用列表的好處在於,現在數據放在一個結構中,所以程序能夠更靈活的處理數據,比放在一些重複的變量中方便。

2.1 列表用於循環

從技術上說,循環是針對一個列表或類似列表中的每個值,重複地執行代碼塊。

例子如下:

這是因爲 range(4)的返回值是類似列表的值。Python 認爲它類似於[0, 1, 2, 3]。下面的程序和前面的程序輸出相同:

一個技巧:是在 for 循環中使用 range(len(someList)),迭代列表的每一個下標。這樣,循環中的代碼可以訪問下標(通過變量 i),以及下標處的值。

2.2 in 和 not in 操作符

利用 in 和 not in 操作符,可以確定一個值否在列表中。像其他操作符一樣,in和 not in 用在表達式中,連接兩個值:一個要在列表中查找的值,以及待查找的列表。這些表達式將求值爲布爾值。

例子如下:

2.3 多重賦值技巧

多重賦值技巧是一種快捷方式,讓你在一行代碼中,用列表中的值爲多個變量賦值。

例子如下:

注意:變量的數目和列表的長度必須嚴格相等,否則 Python 將給出 ValueError。

三 增強的賦值操作

增強型的複製操作符如下:

+=操作符也可以完成字符串和列表的連接,*=操作符可以完成字符串和列表的複製。

例子如下:

四 方法

方法和函數是一回事,只是它是調用在一個值上。

4.1 用 index()方法在列表中查找值

列表值有一個 index()方法,可以傳入一個值,如果該值存在於列表中,就返回它的下標。如果該值不在列表中,Python 就報 ValueError。

例子如下:

注意:如果列表中存在重複的值,就返回它第一次出現的下標。

4.2 用 append()和 insert()方法在列表中添加值

要在列表中添加新值,就使用 append()和 insert()方法。

append()方法調用,將參數添加到列表末尾。insert()方法可以在列表任意下標處插入一個值。insert()方法的第一個參數是新值的下標,第二個參數是要插入的新值。

例子如下:

注意:代碼是 spam.append('moose')和 spam.insert(1, 'chicken'),而不是 spam = spam.append('moose')和 spam = spam.insert(1, 'chicken')。append()和 insert()都不會將spam 的新值作爲其返回值(實際上,append()和 insert()的返回值是 None,所以你肯定不希望將它保存爲變量的新值)。但是,列表被“當場”修改了。

方法屬於單個數據類型。append()和 insert()方法是列表方法,只能在列表上調用,不能在其他值上調用,例如字符串和整型。

4.3 用 remove()方法從列表中刪除值

給 remove()方法傳入一個值,它將從被調用的列表中刪除。、

例子如下:

注意:試圖刪除列表中不存在的值,將導致 ValueError 錯誤。如果該值在列表中出現多次,只有第一次出現的值會被刪除。如果知道想要刪除的值在列表中的下標,del 語句就很好用。如果知道想要從列表中刪除的值,remove()方法就很好用。

4.4 用 sort()方法將列表中的值排序

數值的列表或字符串的列表,能用 sort()方法排序。

例子如下:

也可以指定 reverse 關鍵字參數爲 True,讓 sort()按逆序排序。

注意:

  1. sort()方法當場對列表排序。不要寫出 spam = spam.sort()這樣的代碼,試圖記錄返回值。
  2. 不能對既有數字又有字符串值的列表排序,因爲 Python 不知道如何比較它們。
  3. sort()方法對字符串排序時,使用“ASCII 字符順序”,而不是實際的字典順序。這意味着大寫字母排在小寫字母之前。因此在排序時,小寫的 a 在大寫的Z 之後。
  4. 如果需要按照普通的字典順序來排序,就在 sort()方法調用時,將關鍵字參數key 設置爲 str.lower。

五 字符串個元組

列表並不是唯一表示序列值的數據類型。對列表的許多操作,也可以作用於字符串:按下標取值、切片、用於 for 循環、用於 len(),以及用於 in 和 not in 操作符。

5.1 可變和不可變數據類型

列表和字符串在一個重要的方面是不同的。列表是“可變的”數據類型,它的值可以添加、刪除或改變。但是,字符串是“不可變的”,它不能被更改。嘗試對字符串中的一個字符重新賦值,將導致 TypeError 錯誤。

例子如下:

“改變”一個字符串的正確方式,是使用切片和連接。構造一個“新的”字符串,從老的字符串那裏複製一些部分。

例子如下:

請注意,原來的'Zophie a cat'字符串沒有被修改,因爲字符串是不可變的。

5.2 元組

除了兩個方面,“元組”數據類型幾乎與列表數據類型一樣。

  1. 元組輸入時用圓括號(),而不是用方括號[]。
  2. 元組像字符串一樣,是不可變的。元組不能讓它們的值被修改、添加或刪除。

例子如下:

注意:如果元組中只有一個值,你可以在括號內該值的後面跟上一個逗號,表明這種情況。否則,Python 將認爲,你只是在一個普通括號內輸入了一個值。逗號告訴Python,這是一個元組(不像其他編程語言,Python 接受列表或元組中最後表項後面跟的逗號)。

使用元組的兩大好處:

  1. 如果需要一個永遠不會改變的值的序列,就使用元組。
  2. 因爲它們是不可變的,它們的內容不會變化,Python 可以實現一些優化,讓使用元組的代碼比使用列表的代碼更快

5.3 用 list()和 tuple()函數來轉換類型

函數 list()和 tuple()將返回傳遞給它們的值的列表和元組版本。

如果需要元組值的一個可變版本,將元組轉換成列表就很方便。

六 引用

當將列表賦給一個變量時,實際上是將列表的“引用”賦給了該變量。引用是一個值,指向某些數據。列表引用是指向一個列表的值。

例子如下:

當創建列表時,你將對它的引用賦給了變量。但下一行只是將 spam 中的列表引用拷貝到 cheese,而不是列表值本身。這意味着存儲在 spam 和 cheese 中的值,現在指向了同一個列表。底下只有一個列表,因爲列表本身實際從未複製。所以當你修改 cheese 變量的第一個元素時,也修改了 spam 指向的同一個列表。

變量包含對列表值的引用,而不是列表值本身。

但對於字符串和整數值,變量就包含了字符串或整數值。

在變量必須保存可變數據類型的值時,例如列表或字典,Python 就使用引用。

對於不可變的數據類型的值,例如字符串、整型或元組,Python變量就保存值本身

6.1 傳遞引用

參數如何傳遞給函數,引用就特別重要。當函數被調用時,參數的值被複制給變元。對於列表(以及字典,我將在下一章中討論),這意味着變元得到的是引用的拷貝。

例子如下:

運行結果:

可以看出spam的值已經發生變化了。

當 eggs()被調用時,沒有使用返回值來爲 spam 賦新值。相反,它直接當場修改了該列表。儘管 spam 和 someParameter 包含了不同的引用,但它們都指向相同的列表。這就是爲什麼函數內的 append('Hello')方法調用在函數調用返回後,仍然會對該列表產生影響。

注意:如果忘了 Python 處理列表和字典變量時採用這種方式,可能會導致令人困惑的缺陷。

C語言中的數組名稱就是一個指針,可以作爲參數傳遞個函數,從而可以在函數內部修改數組的名稱。這個與那個機理基本一致。

6.2 copy 模塊的 copy()和 deepcopy()函數

在處理列表和字典時,儘管傳遞引用常常是最方便的方法,但如果函數修改了傳入的列表或字典,你可能不希望這些變動影響原來的列表或字典。要做到這一點,Python 提供了名爲 copy 的模塊,其中包含 copy()和 deepcopy()函數。第一個函數
copy.copy(),可以用來複制列表或字典這樣的可變值,而不只是複製引用。

例子如下:

import copy
spam=['A','B','C','D']
cheese=copy.copy(spam)
cheese[1]=42
print(spam)
print(cheese)

執行結果:

可以看出,cheese改變並沒有引起spam的變化。

如果要複製的列表中包含了列表,那就使用 copy.deepcopy()函數來代替。deepcopy()函數將同時複製它們內部的列表。

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章