2020年9月28日星期一

003 趣學Python程式設計 第1部分 學習程式設計 第3章 字串、清單、元組和字典

 申明本站飛宇網 https://feiyetopro.blogspot.com/自網路收集整理之書籍文章影音僅供預覽交流學習研究,其[書籍、文章、影音]情節內容, 評論屬其個人行為, 與本網站無關。版權歸原作者和出版社所有,請在下載 24 小時內刪除,不得用作商業用途;如果您喜歡其作品,請支持訂閱購買[正版]謝謝!



3章 字串、清單、元組和字典

在第2章裡,我們用Python做了一些基本的運算,並且學習了變數。在這一章裡,我們會學習Python程式設計中的另一些內容:字串(string)、清單(list)、元組(tuple)和字典(map)。你會學到字串是用於在程式中顯示消息的(比如在遊戲裡準備遊戲結束這樣的消息)。你還會學到清單、元組和字典是如何用來存儲成批的東西的。

3.1 字串

在編寫程式的術語中,我們通常把文字稱為字串string)。如果你把字串想像成一堆字的組合的話,這個名字還挺形象的。本書中的所有的字、數位以及符號都可以是一個字串。並且你的名字也可以是個字串,你家的位址也是。事實上,在第1章中我們創建的第一個Python程式用到了一個字串“Hello World”


3.1.1
 創建字串

Python中,我們通過給文本添加引號來創建一個字串。把文字用引號括起來就創建了字串。例如,在第2章中沒什麼太大用處的那個變數fred可以用來標記一個字串,像這樣:


(注意,引號為英文半形””,而非中文全形“”。)

然後,要看看fred裡放的是什麼,只要輸入print(fred),就像這樣:


你也可以用單引號來創建一個字串,像這樣:


然而,要是你只用一個單引號( ')或者雙引號( ")來輸入超過一行的文字,或者用一種引號開頭並嘗試用另一種引號結尾的話,你就會在Python Shell程式中得到一條錯誤資訊。例如,輸入如下一行:


你會看到下面的結果:


語法錯誤:掃讀字串文本時遇到了EOL行結尾

這裡的出錯資訊報告說語法有問題,因為你沒有遵守用單引號或雙引號結束字串的規則。

Syntax(語法)指語句中文字的排列和順序,或者像在本例中一樣,指程式中文字與符號的排列和順序。因此SyntaxError(語法錯誤,Error是錯誤的意思)的含義是你寫的東西的順序不在Python的意料之中,或者Python意料中應該出現的東西被你漏掉了。EOLend-of-line(行結尾)的意思,因此後面的出錯資訊是在告訴你Python碰到了行的結尾卻沒有找到結束字串的雙引號。

要在字串中使用多於一行的文字(簡稱多行字串),得使用三個單引號('''),然後在行之間輸入回車,像這樣:


現在讓我們把fred的內容列印出來看看對不對:


3.1.2
 處理字串相關的問題

現在來看看這個亂七八糟的字串例子,它會讓Python顯示一條錯誤資訊:


在第一行,我們想要創建一個由單引號括起來的字串(變數的名叫silly_string),但是其中混著一些帶有單引號的詞can’tshouldn’twouldn’t,還有一對雙引號。太亂了!

要記住Python可沒有人那麼聰明,因此它所見到的只是一個包含了 He said, "Aren的字串,後面跟著它意料之外的一大堆其他字元。當Python看到一個引號時(無論是單引號還是雙引號),它期望在同一行的後面是一個從第一個引號開始到下一個對應的引號(無論是單引號還是雙引號)結束的字串。在這個例子中,字串是從He之前的一個單引號標記開始,對於Python來講,這個字串的結尾是在Arenn之後的那個單引號。在IDLE中出錯的地方被高亮顯示,如圖3-1所示。


3-1 出錯的地方高亮顯示

IDLE中的最後一行告訴我們出現了什麼類型的錯誤。在本例中,這是個語法錯誤。

使用雙引號來代替單引號的話,仍然會產生錯誤:


這一次,Python看到了一個由雙引號括起來的字串,內容為He said, (結尾還有一個空格)。這個字串之後(從 Aren't開始)引發了錯誤。如圖3-2所示。


3-2 引發錯誤

這是因為從Python的角度來講,所有這些額外的東西根本就不應該在那裡。Python只知道要找到下個對應的引號,但卻不知道你寫在同一行上的後面的那些東西是想做什麼。


解決這個問題的方法就是用多行字串,我們在之前已經學過了,就是使用三個單引號('''),它可以讓我們在字串中加入單引號和雙引號而不會引起錯誤。事實上,如果我們用三個單引號的話,我們可以在字串中放入任意單引號和雙引號的組合(只要不把三個單引號放進去就行)。我們那個字串無錯的版本是這樣的:


別急,還有呢。在Python裡,如果你真的很想用單引號或者雙引號而不是三個單引號來括起的字串的話,你可以在字串中間的每個引號前加上一個反斜線(\)。這叫做轉義escaping)。我們用這種方式告訴Python是的,我知道在我的字串中間有引號,希望你忽略它們直到看見結束的那個引號為止。我在字串裡面放進了引號,請忽略它,接著向下找結束的那個引號。

轉義的字串很難閱讀,所以更好的方法可能還是用多行字串。可是你還是有可能會碰到使用轉義的代碼片段,所以最好也要瞭解一下為什麼用到了反斜線。

下面是幾個使用轉義的例子:


首先,在 中,我們用單引號創建了一個字串,在字串裡面的每個單引號前面加上了反斜線。在 中,我們用雙引號創建了一個字串,在字串裡的那些雙引號前面加上了反斜線。在接下來的那幾行上,我們把剛剛創建的變數列印出來。請注意反斜線字元不會出現在我們列印出的字串裡。

3.1.3 在字串裡嵌入值

如果你想顯示一條使用變數中內容的資訊,你可以用%s來把值嵌入到字串裡面,它就像為你以後所要加入的值所做的一個標記(嵌入值用程式師的話說,就是把值插入到某位置)。例如,要想先讓Python計算或者存儲你在某遊戲中的得分,然後把它加入到像我得到了     這樣的一句話中,可以在這句話中用%s來代替值,然後告訴Python這個值是什麼。就像這樣:


在這裡,我們創建了一個變數myscore,它的值是1000,還創建了一個變數message,這個字串的內容是我得到了%s,其中的%s是得分的預留位置。在下一行裡,我們在對print(message)的調用中使用%符號來告訴Python%s替換成保存在變數myscore中的值。列印這個資訊的結果是我得到了1000。這裡的值不是必須用變數。我們同樣也可以寫成print(message % 1000)

對於同一個%s預留位置我們可以用不同的變數來傳給它不同的值,就像下面這個例子:


在這裡,我們創建了三個變數。第一個,joke_text,它的內容為帶有%s標記的字串。另外兩個變數是bodypart1bodypart2。在列印變數joke_text時,我們可以再次用%運算子來替換bodypart1bodypart2的內容從而產生不同的資訊。


在一個字串中你也可以使用多個預留位置,就像這樣:


當使用多個預留位置時,一定要像示例中那樣把替換的值用括弧括起來。值排放的順序就是它們在字元中被引用到的順序。

3.1.4 字串乘法

10乘以5等於什麼?答案當然是50。可是10乘以a呢?下面是Python給出的答案:


舉個例子,當在Shell程式中顯示消息時,Python程式師可以採用這個功能來用一定數量的空格對齊字串。讓我們在Shell程式中列印一封信(在功能表上選擇新建視窗 然後輸入以下代碼):


Shell程式視窗輸入代碼完成後,選擇另存為 把你的檔命名為myletter.py


從現在開始,當你看到對於一段代碼做
另存為:某檔案名.py”時,你應該知道要先選擇新建視窗,在出現的新視窗中輸入代碼,然後像在這個例子中一樣保存代碼。

在這個例子裡的第一行,我們創建了一個變數spaces,它是把一個空格乘以25的結果。然後在接下來的三行裡,我們用這個變數來讓文本在Shell程式的右邊對齊。你可以在圖3-3中見到這些print語句的輸出結果。


3-3 檔對齊的效果

除了用乘法來對齊,我們也可以用它來讓螢幕上充滿無聊的資訊。你可以自己試試這個:


3.2
 清單比字串還強大

蜘蛛腿、青蛙腳趾頭、蠑螈眼、蝙蝠翅、鼻涕蟲油和蛇蛻皮,這不是普通的採購清單(除非你是個巫師),不過我們要用它來作為例子來看看字串和清單有什麼不同。

我們可以把清單上的這一系列元素用字串的形式放到變數wizard_list中:






但我們也可以創建一個列表(list),這是一種有點魔力的Python物件,我們可以操縱它。下面是這些元素寫成清單的樣子:


創建一個清單比創建一個字串要多敲幾下鍵盤,但是清單比字串更有用,因為我們可以對它進行操作。例如,在方括號([])中輸入列表中的位置(這叫索引位置),我們就可以列印wizard_list中的第三個元素(蠑螈眼)。就像這樣:


啊?這不是清單中的第三個元素麼?是的,但是清單是從位置0開始索引,所以清單中的第一個元素是0,第二個是1,然後第三個是2。這對於人類來講可能說不通,但對電腦來講就是這樣的。

改變清單中的一個元素比起在字串中也容易多了。可能我們不想要蠑螈眼了,而想要蝸牛舌。下面是如何讓我們的列表做到這個:


這樣就把索引位置2中原來是蠑螈眼的元素設置為蝸牛舌了。

另一個操作是顯示清單的一個子集。我們通過在方括號中使用冒號(:)來做到這一點。例如,輸入下面的代碼就能看到從第三個到第五個元素組成的一個清單(這些材料用來做一個可愛的三明治):



寫上[2:5]就如同在說:顯示從索引位置2直到(但不包含)索引位置5的元素,換句話說,就是元素234

清單可以用來存放各種元素,比如數位:


它們也可以用來放字串:


他們還可以把數位和字串混合在一起:


(譯者注:同學,你看懂這個笑話了麼?英語中ate是吃掉的意思,讀音和eight一樣……

列表中甚至可以保存其他列表:


這個列表中又有列表的例子中創建了三個變數:numbers中有四個數字,strings中有八個字串,mylist中是numbersstrings。第三個清單(mylist)只有兩個元素,因為它是變數名的清單,而不是這些變數的內容組成的清單。

3.2.1 添加元素到清單

要在清單中添加元素,我們要用到append函數。函數就是讓Python做某些事情的一段代碼。在這個例子裡,append把一個元素加到清單的最後。

例如,要在巫師的採購單上增加一項熊飽嗝(我覺得肯定有這麼個東西)可以這樣做:


你可以一直這樣向巫師的清單上添加魔法元素,像這樣:


現在,巫師的清單看起來是這樣的:


這個巫師顯然已經準備好搞出些像樣的魔法來了!

3.2.2 從清單中刪除元素

del命令(delete,刪除的縮寫)從清單中刪除元素。例如,要從巫師的清單中刪除第六個元素蛇蛻皮,要這樣做:



要記住位置是從零開始的,所以
wizard_list[5]實際上指向了清單中的第六個元素。

下面是如何把我們剛加上去的元素刪掉(曼德拉草,毒芹和沼氣):


3.2.3
 列表上的算術

把列表相加就能把它們連起來,就像使用加號(+)把數字相加。例如,假設我們有兩個列表,list1裡是從14的數字,list2裡是一些單詞。我們可以用print+符號來把它們加起來,就像這樣:


我們也可以把兩個列表相加把結果設置給另一個變數。


我們也可以把清單乘以一個數字。例如,把list1乘以5就寫作list1 * 5


這實際上就是告訴Pythonlist1重複五次,結果是1, 2, 1, 2, 1, 2, 1, 2, 1, 2

然而除法(/)和減法(-)只會產生錯誤,就像下面一樣:


可這是為什麼呢?這個麼,用+來連接列表和用*來重複列表都是很直接明瞭的操作。這些概念在現實世界中也說得通。例如,如果我交給你兩張購物清單的紙,然後和你說:把這兩個單子加在一起,你可能就會在另一張紙上把所有的元素都從頭到尾按順序寫一遍。同樣如果我說:把這個列表翻3,你也會想到再用一張紙把所有的清單元素寫三遍。

但是怎麼給列表做除法呢?例如,想想你該如何把一個由六個數字(16)組成的列表一分為二。這裡起碼有3種不同的做法:


你是想要把列表從中間分開,從第一個元素之後分開,還是隨便從什麼地方分開?這個沒有簡單的答案,如果你讓Python來分開一個列表的話,它也不知道該做什麼。這就是為什麼它回應了一條錯誤。


如果把除了列表以外的其他東西加到列表上也會得到同樣的錯誤。你也不能這樣做。例如,如果我們要把數字50加到清單上就會發生這樣的事情:


為什麼在這裡會出錯?嗯,把列表加上50是什麼意思?是要把每個元素都加上50嗎?但如果這些元素不是數位怎麼辦?是要把數字50加到清單的開頭或者結尾嗎?

在電腦程式設計中,每次你輸入同一個命令它都應該完全以同樣的方式工作。電腦這個笨蛋看東西非黑即白。如果讓它來做個混亂不清的決定,那它就只能舉手投降,報出錯誤來。

3.3 元組

元組就像是一個使用括弧的列表。例如:


這裡,我們把變數fibs定義為數位01123。然後,就像用列表一樣,我們把元組中索引位置為3的元素列印出來:print(fibs[3])

元組與列表的主要區別在於元組一旦創建就不能再做改動了。例如,如果我們想要把元組fibs中的第一個值替換成4的話(就像我們替換wizard_list裡的值一樣),我們會得到一條錯誤資訊:


那為什麼還要用元組而不用列表呢?主要是因為有時候對一些你知道永遠不會改變的事情還是很有用的。如果你創建一個由兩個元素組成的元組,它裡面將一直就放著這兩個元素。

3.4 Python裡的map不是用來指路的

Python裡,像列表和元組一樣,字典(dict,是dictionary的縮寫。也叫map,映射)也是一堆東西的組合。字典與清單或元組不同的地方在於字典中的每個元素都有一個鍵(key)和一個對應的值(value)。

例如,假設我們有一個列表,上面是一些人和他們最喜愛的運動。我們可以把這個資訊放到Python的清單中,名字在前,他們最喜愛的運動在後:


如果我問你Rebecca Clarke最喜愛的運動是什麼,你可能要流覽這個列表才能找到答案:網球。但是如果列表中有100個(或者更多)人呢?

現在,如果我們把同樣的資訊放到字典中,把人名作為鍵,把他們喜愛的運動作為值,那麼Python代碼看起是這樣的:



我們用冒號把每個鍵和它的值分開,每個鍵和值都分別用單引號括起來。還要注意字典中的所有元素都是用大括弧({})括起來的,而不是圓括號或者方括號。

這樣做的結果就得到了一個映射表(每個鍵對應一個特定的值),如表3-1所示。

3-1 最喜愛運動對照表中的鍵和所指向的值

Key

Value

Ralph Williams

Football

Michael Tippett

Basketball

Edward Elgar

Baseball

Rebecca Clarke

Netball

Ethel Smyth

Badminton

Frank Bridge

Rugby


現在,如果要得到Rebecca Clarke最喜愛的運動,我們可以通過用她的名字作為鍵來訪問我們的字典,就像這樣:


結果是網球。

想要刪除字典中的值,就要用到它的鍵。下面是如何刪除Ethel Smyth的例子:


要替換字典中的值,也要用到它的鍵:


我們用Palph Willians作為鍵,把他最喜愛的運動從足球改成了冰球。

如你所見,使用字典與使用清單和元組類似,只是你不能用+運算子來把兩個字典連在一起。如果你試一下的話就會看到一條錯誤資訊:


Python中,連接兩個字典沒有意義,所以它只能放棄。

3.5 你學到了什麼

在這一章中,你學到了Python是如何用字串來保存文字的,以及它是如何用列表和元組來處理多個元素的。你明白了清單中的元素可以改變,並且你可以把一個列表和另一個列表連在一起,但是元組中的值是不能改變的。你還學到了如何用字典來保存值,還有用來標識它們的鍵。

3.6 程式設計小測驗

下面是幾個試驗,你可以自己試一試。答案可以在網站http://python-for-kids.com/ 上找到。

#1:最愛

把你的愛好列出來,並把這個列表起個變數名games。現在把你喜歡的食物列出來,起個變數名為foods。把這兩個列表連在一起並把結果命名為favorites。最後,把變數favorites列印出來。

#2:戰士計數

如果有三座建築,每座的房頂藏有25個忍者,還有2個地道,每個地道裡藏有40個武士,那麼一共有多少個忍者和武士準備投入戰鬥?(你可以在PythonShell程式裡用一個算式做出來。)

#3:打招呼

創建兩個變數:一個指向你的姓一個指向你的名。創建一個字串,用預留位置使用這兩個變數來列印帶有你名字的資訊,比如你好,鄭尹加!

 

0 留言:

發佈留言