天天看點

《Python程式設計》——2.4 清單、元組和檔案

本節書摘來自華章計算機《python程式設計》一書中的第2章,第2.4節,作者:[美]戴維 i.施奈德(david i. schneider)著,更多章節内容可以通路雲栖社群“華章計算機”公衆号檢視

python文檔和本書均使用術語對象,用于代表一種資料類型的任意執行個體。python的核心對象是數值、字元串、清單、元組、檔案、集合和字典。我們已經介紹過了數值和字元串。本節将介紹清單、元組和檔案。集合和字典将在第5章中介紹。

2.4.1 清單對象

清單(list)是python對象的一個有序序列。其中的對象可以是任何類型,并不要求類型必須一緻。

清單的建立可以使用中括号将所有元素括起來,并且每個元素之間用逗号分隔。

清單的一些例子如下:

《Python程式設計》——2.4 清單、元組和檔案

清單通常要賦予一個名字。例如,我們可以寫成:

《Python程式設計》——2.4 清單、元組和檔案
《Python程式設計》——2.4 清單、元組和檔案

與字元串中的字元類似,清單中的元素也是從前往後使用由0開始的正向索引進行索引,而且從後往前使用由-1開始的逆向索引進行索引。索引i對應元素的值記為listname [i]。例如,team[1]的值是2014,words[-2]的值是"spam"。

表2-5給出了清單的一些函數和方法。

提示:在執行了del函數或remove方法後,清單中被删除元素後的其他元素會依次向左移動一個位置。在執行了insert方法後,清單中大于或等于給定索引位置元素的其他元素會依次向右移動一個位置。

例1 成績

下面的程式需要5個成績作為輸入,去掉兩個最低分後給出平均值。這些成績放入清單grades中,最低的兩個成績從清單中移除,然後使用sum和len函數計算剩餘成績的平均值。

《Python程式設計》——2.4 清單、元組和檔案
《Python程式設計》——2.4 清單、元組和檔案

索引i對應元素的值可以通過下面形式的語句給出:

《Python程式設計》——2.4 清單、元組和檔案

例如,在執行了words[1] = "eggs"語句後,words的值将變為["spam", "eggs"]。

注意:在2.2節中,我們曾提到在一對封閉括号中的任何代碼都可以在多行顯示。這樣的規則對封閉的中括号同樣有效。是以,語句:

《Python程式設計》——2.4 清單、元組和檔案

可以寫成:

《Python程式設計》——2.4 清單、元組和檔案

2.4.2 切片

切片是由冒号文法表示的子清單。用法和字元串的切片非常類似。表2-6顯示了一些切片的表示文法。

《Python程式設計》——2.4 清單、元組和檔案

注意:del函數可用于從清單中移除一個切片。同樣,如果索引m對應的元素不在索引n對應的元素的左邊,那麼list1[m:n]将是一個空清單。

表2-7給出了切片的一些例子。

《Python程式設計》——2.4 清單、元組和檔案

2.4.3 split和join方法

split和join是非常有用的方法,但它們的作用正好相反。split方法将一個字元串變成其子串組成的清單,而join方法将一個字元串清單變成一個字元串。

一般而言,如果strvar指派為“value0,value1,value2,…, valuen”形式的字元串,那麼下面形式的語句:

《Python程式設計》——2.4 清單、元組和檔案

建立了包含n+1個字元串作為其元素的清單l。即清單中的第一個元素是strval中第一個逗号前的文本,第二個元素是第一個逗号和第二個逗号之間的文本,…,最後一個元素是最後一個逗号之後的文本。包含逗号的字元串稱為上述語句的分隔符。任意字元串都可以作為分隔符(三種常用的單字元分隔符是逗号(,)、換行符(n)和空格)。如果沒有指定分隔符,split方法将使用空白作為分隔符,其中空白字元串是由換行符、制表符和空格組成的任意字元串。在第5章,split方法将發揮重要的作用。

join方法,作為split方法的逆操作,将一個字元串清單變成一個由清單中所有元素用指定字元串分隔連接配接而成的字元串。使用join方法并用","作為分隔符的一般語句形式為:

《Python程式設計》——2.4 清單、元組和檔案

例2 split方法

下面的每條語句都顯示了清單['a', 'b', 'c']。

《Python程式設計》——2.4 清單、元組和檔案

例3 join方法

下面的程式展示了如何使用join方法顯示一個字元串清單中的所有元素。

《Python程式設計》——2.4 清單、元組和檔案

2.4.4 文本檔案

python程式中使用的資料都存儲在記憶體中,當程式終止時就消失了。然而,如果程式将資料寫入到儲存設備(如硬碟或閃存盤)上的檔案中,任何程式都可以稍後繼續通路這些資料。也就是說,檔案建立了長期存儲的資料。

文本檔案是由沒有任何格式(即粗體或斜體)的文本行組成的簡單檔案,可以通過notepad(pc)或textedit(mac)進行建立和閱讀。一般情況下,文本檔案有txt的字尾。實際上,文本檔案可以使用任何文本處理器來建立。例如,在word中建立一個文檔,你可以選擇“另存為”,然後選擇“存儲為:純文字(*.txt)”将文檔存為文本檔案。

任何已有的文本檔案也可以由word打開和編輯。文本檔案的每一行都以換行符結尾(可能除了最後一行)。

文本檔案的所有行(移除最後的換行符)可以通過以下形式的代碼放入到一個清單中:

《Python程式設計》——2.4 清單、元組和檔案

之後的三章将解釋這個語句是如何完成這項任務的。目前,我們就假設它能夠完成這項工作。

如果文本檔案中資料都是數字,下面段落的處理過程将産生一個字元串清單,其中的每個字元串存儲一個數字。對于由數字組成的檔案,我們可以通過以下形式的代碼将所有數字放入到一個清單中:

《Python程式設計》——2.4 清單、元組和檔案

2.4.5 元組對象

元組(tuple)與清單類似,是元素的有序序列。元組和清單的主要差別在于元組不可以直接修改,即元組沒有append、extend和insert方法。元組中的元素也不可以直接删除或修改。除此之外,清單中的其他函數和方法對元組同樣适用。元組中的元素可以索引。元組可以切片、連接配接和重複。

元組的定義可以通過由逗号分隔和括号包圍的一個序列來完成。然而,元組經常還可以不使用括号來定義。例如,語句

《Python程式設計》——2.4 清單、元組和檔案

建立了元組t,并賦予相同的值。但是,print函數總是會顯示由括号包圍的元組。

例4 元組函數

下面的程式顯示了元組具有和清單一樣的一些函數。

《Python程式設計》——2.4 清單、元組和檔案

下列的語句:

《Python程式設計》——2.4 清單、元組和檔案

建立了三個變量,并分别指派給它們。這個語句也可以寫成:

《Python程式設計》——2.4 清單、元組和檔案

它可以看作是用一個語句同時給三個變量進行了指派。

例5 交換數值

下面的程式交換了兩個變量的值。其實程式的第三行是将元組tuple (6, 5) 指派給元組tuple (x, y)。

《Python程式設計》——2.4 清單、元組和檔案

2.4.6 嵌套清單

到目前為止,清單和元組中的所有元素都是數字或者字元串。但是,其中的元素也可以是清單或元組。由元組構成的清單在資料分析中扮演着至關重要的角色。如果l是一個由元組構成的清單,那麼l[0]是第一個元組,l0是第一個元組中的第一個元素。l[-1](等同于l[len(l)-1])是最後一個元組,l-1是最後一個元組中的最後一個元素。像l0這樣的表達式可以看做是(l[0])[0]。

例6 美國地域

清單regions包含了四個元組,每個元組給出了美國的一個地域名及其2010年的人口(百萬計)。下面的程式顯示了中西部2010年的人口,并計算出美國2010的總人口。

《Python程式設計》——2.4 清單、元組和檔案

2.4.7 不可變和可變對象

對象是一個可以存儲資料并有可以操縱資料的操作或方法的實體。數值、字元串、清單和元組都是對象。當一個變量使用指派語句建立出來後,等号右邊的值變成了記憶體中的一個對象,而變量引用(即指向)那個對象。當改變一個清單時,這個變化是作用在清單記憶體位置中的對象上的。但是,當一個變量要改變它的值并且這個值是數值、字元串或元組時,python會配置設定一個新的記憶體位置存儲新值,并将變量引用到新的對象上。

可以說清單能夠原地修改,但是數值、字元串和元組不可以。能夠原地修改的對象稱為可變的,而不能原地修改的對象稱為不可變的。圖2-29顯示了8行代碼以及執行完前4行代碼和所有8行代碼後的記憶體配置設定情況。

《Python程式設計》——2.4 清單、元組和檔案

2.4.8 清單複制

如果變量var1是一個可變資料(如清單),那麼var2 = var1的這種語句形式會将var2和var1一樣引用同一個對象。是以,任何對var2的值的改變都會影響var1的值。請思考下面的四行代碼:

《Python程式設計》——2.4 清單、元組和檔案

在第二行代碼中,變量list2引用的是和list1一樣的記憶體位置。是以,對list2中一個元素的任意改變将對list1産生相同的變化。如果将第二行代碼變成list2 = list(list1)或list2 = list1[:],這種影響就不會出現了。在這種情況下,list2指向了包含與list1一樣的值,但list2是一個在不同記憶體位置上的對象。之後第三行代碼并不會影響list1所指向的記憶體位置,是以輸出結果是['a', 'b']。

2.4.9 索引、删除和切片越界

python不允許清單和元組中單個元素的索引越界,但是在切片中可以允許索引越界。例如,如果

《Python程式設計》——2.4 清單、元組和檔案

那麼print(list1[7])、print(list1[-7])和del list1[7]會産生回溯的錯誤消息indexerror。

如果切片的左邊索引過小,切片會從清單的第一項開始,如果切片的右邊索引過大,切片會一直到清單的最後一項。例如,

《Python程式設計》——2.4 清單、元組和檔案

注釋

當max和min作用于包含字元串的清單時,字元串按照字典排序進行比較。字元串的字典排序會在3.1節中介紹。

空元組可以寫成空的括号對。

單個元素組成的元組有一個末尾的逗号,如(0,)。

list函數可以将元組或字元串轉化為清單。例如,list(('a', 'b'))的值為['a', 'b'],list("python")的值為['p', 'y', 't', 'h', 'o', 'n']。

tuple函數可以将清單或字元串轉化為元組。例如,tuple(['a', 'b'])的值為('a', 'b'),tuple("spam")的值為('s', 'p', 'a', 'm')。

元組比清單更加高效,是以應該在元素不會發生改變的情況下使用。它們執行得更快、記憶體占用更少,而且能夠“寫保護”資料。第5章會介紹一種強大的叫作字典的python對象。字典的一個重要特性就是需要使用元組。

正如我們所見到的,清單中元素的值是可以通過它的索引以listname[i] = newvalue 的語句形式進行更改。即使字元串中的字元和元組中的元素可以通過索引進行通路,但是stringname[i] = newvalue和tuplename[i] = newvalue這樣的語句是不合法的。

對于清單和元素,操作符+=表示增量指派。

我們已經介紹過了核心對象數值、字元串、清單和元組。其他兩個核心對象(集合和字典)會在第5章中進行介紹。盡管它們已經在2.4節中出現過,我們仍打算推遲到有需要的時候再介紹它們。

實踐問題2.4

給出以下程式的輸出。

《Python程式設計》——2.4 清單、元組和檔案
《Python程式設計》——2.4 清單、元組和檔案

語句s = 'a' + 'b'和語句s = "".join(['a', 'b'])是将相同的值賦給了變量s嗎?

習題2.4

在習題1~48中,假定清單states包含了美國50個州的名字,并按照它們加入聯邦的時間順序進行排列。給出下列代碼行相應的輸出。

《Python程式設計》——2.4 清單、元組和檔案
《Python程式設計》——2.4 清單、元組和檔案
《Python程式設計》——2.4 清單、元組和檔案

在習題49~54中,假定list1包含100個元素,給出下面每個切片中元素的數目。

《Python程式設計》——2.4 清單、元組和檔案

在習題55~58中,假定清單nums = [6, 2, 8, 0],給出下列代碼行相應的輸出。

《Python程式設計》——2.4 清單、元組和檔案
《Python程式設計》——2.4 清單、元組和檔案

在習題59~94中,給出下列代碼行相應的輸出。

《Python程式設計》——2.4 清單、元組和檔案
《Python程式設計》——2.4 清單、元組和檔案
《Python程式設計》——2.4 清單、元組和檔案
《Python程式設計》——2.4 清單、元組和檔案
《Python程式設計》——2.4 清單、元組和檔案
《Python程式設計》——2.4 清單、元組和檔案
《Python程式設計》——2.4 清單、元組和檔案

在習題95~100中,找到所有的錯誤。

《Python程式設計》——2.4 清單、元組和檔案

分析語句 編寫一個程式,分析由使用者輸入的句子中單詞的個數。如圖2-30所示。

分析語句 編寫一個程式,顯示由使用者輸入的句子中起始和末尾的單詞。如圖2-31所示。假定唯一的标點符号是句子末尾的句号。

《Python程式設計》——2.4 清單、元組和檔案

姓名 編寫一個程式,輸入姓名的兩個部分,然後以“lastname, firstname”的方式顯示姓名。如圖2-32所示。

姓名 編寫一個程式,輸入姓名的三個部分,顯示中間名。如圖2-33所示。

《Python程式設計》——2.4 清單、元組和檔案

實踐問題2.4的解答

amazon.com is located in seattle, wa。

清單companies是元組組成的清單,其中的每一項可以通過companies[0]、companies[1]和companies[2]進行引用。程式引用了amazon對應的元組companies[1]。amazon元組中的三個元素可以通過companies1、companies1和companies1引用。提示:companies1可以看做(companies[1])[0],companies1可以看做(companies[1])[1],companies1可以看做(companies[1])[2]。

(5,)

5

()

第一個和第三個print函數的參數是元組。第一個print函數中的逗号表明這個參數是一個單個元素構成的元組,是以函數顯示為一個元組。由于第二個print函數中的參數沒有逗号,是以括号對僅僅包含了一個表達式。第三個print語句顯示了一個空元組。

是。出于性能的考慮,使用join的語句更勝一籌。

《Python程式設計》——2.4 清單、元組和檔案
《Python程式設計》——2.4 清單、元組和檔案
《Python程式設計》——2.4 清單、元組和檔案
《Python程式設計》——2.4 清單、元組和檔案
《Python程式設計》——2.4 清單、元組和檔案

程式設計項目

找零錢 編寫一個程式,将使用者輸入的從0~99美分的金額變為零錢。程式的輸出需要顯示用于找零的各種面額硬币的數量。如圖2-34所示。

汽車貸款 如果以r%的月複合利率借貸a美元用于購買汽車,按月歸還貸款n年,每月應歸還的貸款可以通過以下公式給出:

《Python程式設計》——2.4 清單、元組和檔案

其中。編寫一個程式,在使用者輸入貸款額、利率和貸款年限後,計算每月的還款額。如圖2-35所示。

《Python程式設計》——2.4 清單、元組和檔案

債券收益 債券表現的一個度量是它的到期收益率(ytm)。政府債券的ytm值計算複雜,并且公布在表格上。但是,它們可以通過一個簡單的公式

《Python程式設計》——2.4 清單、元組和檔案

進行估算,其中intr是每年獲得的利息,

《Python程式設計》——2.4 清單、元組和檔案

。例如,假定債券的面值為1 000美元,票面利率為4%,15年到期,目前售出價1 180美元。那麼intr = 0.04×

000 = 40,

《Python程式設計》——2.4 清單、元組和檔案

提示:債券的面值是當它到期贖回時的金額,票面利率是債券定期的利率。如果債券是首次發行時購買,ytm與票面利率相同。編寫一個程式,要求輸入面值、票面利率、目前市場價格和債券到期年數,然後計算債券的ytm。如圖2-36所示。

機關價格 編寫一個程式,要求輸入物品的價格和重量(磅和盎司),然後給出每盎司的價格。如圖 2-37所示。

《Python程式設計》——2.4 清單、元組和檔案

股票投資組合 投資者的股票投資組合包括四個交易所基金(spy、qqq、eem和vxx)。編寫一個程式,要求輸入每個基金的投資額,然後顯示總投資額和每項基金在總投資額中的占比。如圖2-38所示。

長度轉換 編寫一個程式,将美國慣用機關制的英裡、碼、英尺和英寸轉換為公制機關的千米、米和厘米。一個例子如圖2-39所示。在輸入了英裡數、碼數、英尺數和英寸數後,長度全部轉換為英寸,然後再除以39.37得到米數。int函數可用來将總米數分為整數千米數和米數。厘米數可以通過小數部分進行顯示。所需要的計算公式如下所示:

《Python程式設計》——2.4 清單、元組和檔案
《Python程式設計》——2.4 清單、元組和檔案