天天看點

Python書籍閱讀與記錄 6.10 II 變量和簡單資料類型

我感覺這樣記錄,對于我來說挺好的。因為我看兩端對齊的語句容易走神,這樣記錄閱讀的話,就很少出現之前的情況。

我寫的初衷,也是自己來看,是以感覺寫的不好的,請保留下意見,謝謝。

裡面的每一個字我都看過,加粗 括号  下劃線 等均是我的筆記。

我準備在接下來10天的時間把python從入門到實踐看一遍,然後把其中的重點都寫下來。

第二章 變量和簡單資料類型 型 在本章中,你将學習可在 Python 程式中使用的各種資料,還将學習如何将資料存儲到變量中,以及如何在程式中使用這些變量。 2.1 運作hello_world.py時發生的情況 運作 hello_world.py 時, Python 都做了些什麼呢?下面來深入研究一下。實際上,即便是運作簡單的程式, Python 所做的工作也相當多: hello_world.py print("Hello Python world!") 運作上述代碼時,你将看到如下輸出: Hello Python world! 運作檔案 hello_world.py 時,末尾的 .py 指出這是一個 Python 程式,是以編輯器将使用 Python 解 解釋   器 來運作它。 Python 解釋器讀取整個程式,确定其中每個單詞的含義。例如,看到單 詞 print 時,解釋器就會将括号中的内容列印到螢幕,而不會管括号中的内容是什麼。 編寫程式時,編輯器會以各種方式突出程式的不同部分。例如,它知道 print 是一個函數的名稱,是以将其顯示為藍色;它知道 “Hello Pythonworld!” 不是 Python 代碼,是以将其顯 示為橙色。這種功能稱為語 文法突   出 ,在你剛開始編寫程式時很有幫助。 2.2 變量 下面來嘗試在 hello_world.py 中使用一個變量。在這個檔案開頭添加一行代碼,并對第 2 行代碼進行修改,如下所示: message = "Hello Python world!" print(message) 運作這個程式,看看結果如何。你會發現,輸出與以前相同: Hello Python world! 我們添加了一個名為 message 的 變量  。每個變量都存儲了一個值 —— 與變量相關聯的資訊。在這裡,存儲的值為文本 “Hello Pythonworld!” 。 添加變量導緻 Python 解釋器需要做更多工作。處理第 1 行代碼時,它将文本 “Hello Pythonworld!” 與變量 message 關聯起來;而處理第 2 行代碼時,它将與變量 message 關聯的值打 印到螢幕。 下面來進一步擴充這個程式:修改 hello_world.py ,使其再列印一條消息。為此,在 hello_world.py 中添加一個空行,再添加下面兩行代碼: message = "Hello Python world!" print(message) message = "Hello Python Crash Course world!" print(message) 現在如果運作這個程式,将看到兩行輸出: Hello Python world! Hello Python Crash Course world! 在程式中可随時修改變量的值,而 Python 将始終記錄變量的最新值。 2.2.1 變量的命名和使用 在 Python 中使用變量時,需要遵守一些規則和指南。違反這些規則将引發錯誤,而指南旨在讓你編寫的代碼更容易閱讀和了解。請務必牢記下述有關變量的規則。 變量名隻能包含字母、數字和下劃線。變量名可以字母或下劃線打頭,但不能以數字打頭,例如,可将變量命名為 message_1 ,但不能将其命名為 1_message 。 變量名不能包含空格,但可使用下劃線來分隔其中的單詞。例如,變量名 greeting_message 可行,但變量名 greeting message 會引發錯誤。 不要将Python 關鍵字和函數名用作變量名,即不要使用 Python 保留用于特殊用途的單詞,如 print (請參見附錄 A.4 )(隻要說到附錄,我統統沒加,體諒下,這隻是我個人的筆記)。 變量名應既簡短又具有描述性。例如,name比n好,student_name比s_n好,name_length比length_of_persons_name好。 慎用小寫字母l和大寫字母O,因為它們可能被人錯看成數字1和0。 要建立良好的變量名,需要經過一定的實踐,在程式複雜而有趣時尤其如此。随着你編寫的程式越來越多,并開始閱讀别人編寫的代碼,将越來越善于建立有意義的變量名。  注意 就目前而言,應使用小寫的 Python 變量名。在變量名中使用大寫字母雖然不會導緻錯誤,但避免使用大寫字母是個不錯的主意。 2.2.2 使用變量時避免命名錯誤 程式員都會犯錯,而且大多數程式員每天都會犯錯。雖然優秀的程式員也會犯錯,但他們也知道如何高效地消除錯誤。下面來看一種你可能會犯的錯誤,并學習如何消除它。 我們将有意地編寫一些引發錯誤的代碼。請輸入下面的代碼,包括其中以粗體顯示但拼寫不正确的單詞 mesage : message = "Hello Python Crash Course reader!" print(mesage) 程式存在錯誤時, Python 解釋器将竭盡所能地幫助你找出問題所在。程式無法成功地運作時,解釋器會提供一個 traceback(n. 回溯)。 traceback 是一條記錄,指出了解釋器嘗試運作代碼時, 在什麼地方陷入了困境。下面是你不小心錯誤地拼寫了變量名時, Python 解釋器提供的 traceback : Traceback (most recent call last): ❶ File "hello_world.py", line 2, in <module> ❷ print(mesage) ❸ NameError: name 'mesage' is not defined 解釋器指出,檔案 hello_world.py 的第 2 行存在錯誤(見 ❶ );它列出了這行代碼,旨在幫助你快速找出錯誤(見 ❷ );它還指出了它發現的是什麼樣的錯誤(見 ❸ )。在這裡,解 釋器發現了一個名稱錯誤,并指出列印的變量 mesage 未定義: Python 無法識别你提供的變量名。名稱錯誤通常意味着兩種情況:要麼是使用變量前忘記了給它指派,要麼是輸入 變量名時拼寫不正确。 在這個示例中,第 2 行的變量名 message 中遺漏了字母 s 。 Python 解釋器不會對代碼做拼寫檢查,但要求變量名的拼寫一緻。例如,如果在代碼的另一個地方也将 message 錯誤地拼 寫成了 mesage ,結果将如何呢? mesage = "Hello Python Crash Course reader!" print(mesage) 在這種情況下,程式将成功地運作: Hello Python Crash Course reader! 計算機一絲不苟,但不關心拼寫是否正确。是以,建立變量名和編寫代碼時,你無需考慮英語中的拼寫和文法規則。 很多程式設計錯誤都很簡單,隻是在程式的某一行輸錯了一個字元。為找出這種錯誤而花費很長時間的大有人在。很多程式員天資聰穎、經驗豐富,卻為找出這種細微的錯誤花費數 小時。你可能覺得這很好笑,但别忘了,在你的程式設計生涯中,經常會有同樣的遭遇。 注 注意 要了解新的程式設計概念,最佳的方式是嘗試在程式中使用它們。如果你在做本書的練習時陷入了困境,請嘗試做點其他的事情。如果這樣做後依然無法擺脫困 境,請複習相關内容。如果這樣做後情況依然如故,請參閱附錄 C 的建議。 動手試一試 請完成下面的練習,在做每個練習時,都編寫一個獨立的程式。儲存每個程式時,使用符合标準 Python 約定的檔案名:使用小寫字母和下劃線,如 simple_message.py 和 simple_messages.py 。 2-1 簡單消息 : 将一條消息存儲到變量中,再将其列印出來。 2-2 多條簡單消息: 将一條消息存儲到變量中,将其列印出來;再将變量的值修改為一條新消息,并将其列印出來。 2.3 字元串 大多數程式都定義并收集某種資料,然後使用它們來做些有意義的事情。鑒于此,對資料進行分類大有裨益。我們将介紹的第一種資料類型是字元串。字元串雖然看似簡單,但 能夠以很多不同的方式使用它們。字元 串 就是一系列字元。在 Python 中,用引号括起的都是字元串,其中的引号可以是單引号,也可以是雙引号,如下所示: "This is a string." 'This is also a string.' 這種靈活性讓你能夠在字元串中包含引号和撇号: 'I told my friend, "Python is my favorite language!"' "The language 'Python' is named after Monty Python, not the snake." "One of Python's strengths is its diverse and supportive community." 下面來看一些使用字元串的方式。 2.3.1 使用方法修改字元串的大小寫 對于字元串,可執行的最簡單的操作之一是修改其中的單詞的大小寫。請看下面的代碼,并嘗試判斷其作用: name.py name = "ada lovelace" print(name.title()) 将這個檔案儲存為 name.py ,再運作它。你将看到如下輸出: Ada Lovelace 在這個示例中,小寫的字元串 "ada lovelace" 存儲到了變量 name 中。在 print() 語句中,方法 title() 出現在這個變量的後面。方 方法 是 Python 可對資料執行的操作。 在 name.title() 中, name 後面的句點( . )讓 Python 對變量 name 執行方法 title() 指定的操作。每個方法後面都跟着一對括号,這是因為方法通常需要額外的資訊來完成 其工作。(注意啊:title是方法,括号是緊跟這個方法需要的額外資訊,比如參數,此處沒有傳參)這種資訊是在括号内提供的。函數 title() 不需要額外的資訊,是以它後面的括号是空的。 title() 以首字母大寫的方式顯示每個單詞,即将每個單詞的首字母都改為大寫 。這很有用,因為你經常需要将名字視為資訊。例如,你可能希望程式将值 Ada 、ADA 和ada 視為同一個名字,并将它們都顯示為Ada 。 還有其他幾個很有用的大小寫處理方法。例如,要将字元串改為全部大寫或全部小寫,可以像下面這樣做: name = "Ada Lovelace" print(name.upper()) print(name.lower()) 這些代碼的輸出如下: ADA LOVELACE ada lovelace 存儲資料時,方法 lower() 很有用。很多時候,你無法依靠使用者來提供正确的大小寫,是以需要将字元串先轉換為小寫,再存儲它們。以後需要顯示這些資訊時,再将其轉換為 最合适的大小寫方式。 2.3.2 合并(拼接)字元串 在很多情況下,都需要合并字元串。例如,你可能想将姓和名存儲在不同的變量中,等要顯示姓名時再将它們合而為一: first_name = "ada" last_name = "lovelace" ❶ full_name = first_name + " " + last_name print(full_name) Python使用加号(+ )來合并字元串。在這個示例中,我們使用 + 來合并 first_name 、空格和 last_name ,以得到完整的姓名(見 ❶ ),其結果如下: ada lovelace 這種合并字元串的方法稱為 拼接  。通過拼接,可使用存儲在變量中的資訊來建立完整的消息。下面來看一個例子: first_name = "ada" last_name = "lovelace" full_name = first_name + " " + last_name ❶ print("Hello, " + full_name.title() + "!") 在這裡,一個問候使用者的句子中使用了全名(見 ❶ ),并使用了方法 title() 來将姓名設定為合适的格式。這些代碼顯示一條格式良好的簡單問候語: Hello, Ada Lovelace! 你可以使用拼接來建立消息,再把整條消息都存儲在一個變量中: first_name = "ada" last_name = "lovelace" full_name = first_name + " " + last_name ❶ message = "Hello, " + full_name.title() + "!" ❷ print(message) 上述代碼也顯示消息 “Hello, Ada Lovelace!” ,但将這條消息存儲在了一個變量中(見 ❶ ),這讓最後的 print 語句簡單得多(見 ❷ )。 2.3.3 使用制表符或換行符來添加空白 在程式設計中, 空白 泛指任何非列印字元,如空格、制表符和換行符。你可使用空白來組織輸出,以使其更易讀。 要在字元串中添加制表符,可使用字元組合 \t ,如下述代碼的 ❶ 處所示: >>> print("Python") Python ❶ >>> print("\tPython") Python 要在字元串中添加換行符,可使用字元組合 \n : >>> print("Languages:\nPython\nC\nJavaScript") Languages: Python C JavaScript 還可在同一個字元串中同時包含制表符和換行符。字元串 "\n\t" 讓 Python 換到下一行,并在下一行開頭添加一個制表符。下面的示例示範了如何使用一個單行字元串來生成四行 輸出: >>> print("Languages:\n\tPython\n\tC\n\tJavaScript") Languages:     Python     C     JavaScript 在接下來的兩章中,你将使用為數不多的幾行代碼來生成很多行輸出,屆時制表符和換行符将提供極大的幫助。 2.3.4 删除空白 在程式中,額外的空白可能令人迷惑。對程式員來說, 'python' 和 'python ' 看起來幾乎沒什麼兩樣,但對程式來說,它們卻是兩個不同的字元串。 Python 能夠發 現 'python ' 中額外的空白,并認為它是有意義的 —— 除非你告訴它不是這樣的。 空白很重要,因為你經常需要比較兩個字元串是否相同。例如,一個重要的示例是,在使用者登入網站時檢查其使用者名。但在一些簡單得多的情形下,額外的空格也可能令人迷 惑。所幸在 Python 中,删除使用者輸入的資料中的多餘的空白易如反掌。 Python 能夠找出字元串開頭和末尾多餘的空白。要確定字元串末尾沒有空白,可使用方法 rstrip() 。 ❶ >>> favorite_language = 'python ' ❷ >>> favorite_language 'python ' ❸ >>> favorite_language.rstrip() 'python' ❹ >>> favorite_language 'python ' 存儲在變量 favorite_language 中的字元串末尾包含多餘的空白(見 ❶ )。你在終端會話中向 Python 詢問這個變量的值時,可看到末尾的空格(見 ❷ )。對變 量 favorite_language 調用方法 rstrip() 後(見 ❸ ),這個多餘的空格被删除了。然而,這種删除隻是暫時的,接下來再次詢問 favorite_language 的值時,你會發 現這個字元串與輸入時一樣,依然包含多餘的空白(見 ❹ )。 要永久删除這個字元串中的空白,必須将删除操作的結果存回到變量中: >>> favorite_language = 'python ' ❶ >>> favorite_language = favorite_language.rstrip() >>> favorite_language 'python' 為删除這個字元串中的空白,你需要将其末尾的空白剔除,再将結果存回到原來的變量中(見 ❶ )。在程式設計中,經常需要修改變量的值,再将新值存回到原來的變量中。這就是 變量的值可能随程式的運作或使用者輸入資料而發生變化的原因。 你還可以剔除字元串開頭的空白,或同時剔除字元串兩端的空白。為此,可分别使用方法 lstrip() 和 strip() :

strip

英 /strɪp/  v 脫去

❹ >>> favorite_language = ' python ' ❷ >>> favorite_language.rstrip() ' python' ❸ >>> favorite_language.lstrip() 'python ' ❹ >>> favorite_language.strip() 'python' 在這個示例中,我們首先建立了一個開頭和末尾都有空白的字元串(見 ❶ )。接下來,我們分别删除末尾(見 ❷ )、開頭(見 ❸ )和兩端(見 ❹ )的空格。嘗試使用這些剝除函 數有助于你熟悉字元串操作。在實際程式中,這些剝除函數最常用于在存儲使用者輸入前對其進行清理。 2.3.5 使用字元串時避免文法錯誤  是一種時不時會遇到的錯誤。程式中包含非法的 Python 代碼時,就會導緻文法錯誤。例如,在用單引号括起的字元串中,如果包含撇号,就将導緻錯誤。這是因為這會 導緻 Python 将第一個單引号和撇号之間的内容視為一個字元串,進而将餘下的文本視為 Python 代碼,進而引發錯誤。 下面示範了如何正确地使用單引号和雙引号。請将該程式儲存為 apostrophe.py ,再運作它: apostrophe.py message = "One of Python's strengths is its diverse community." print(message) 撇号位于兩個雙引号之間,是以 Python 解釋器能夠正确地了解這個字元串: One of Python's strengths is its diverse community. 然而,如果你使用單引号, Python 将無法正确地确定字元串的結束位置: message = 'One of Python's strengths is its diverse community.' print(message) 而你将看到如下輸出: File "apostrophe.py", line 1 message = 'One of Python's strengths is its diverse community.' ^ ❶ SyntaxError: invalid syntax 從上述輸出可知,錯誤發生在第二個單引号後面(見 ❶ )。這種語 法錯 誤 表明,在解釋器看來,其中的有些内容不是有效的 Python 代碼。錯誤的來源多種多樣,這裡指出一些常 見的。學習編寫 Python 代碼時,你可能會經常遇到文法錯誤。文法錯誤也是最不具體的錯誤類型,是以可能難以找出并修複。受困于非常棘手的錯誤時,請參閱附錄 C 提供的建 議。  注意 編寫程式時,編輯器的文法突出功能可幫助你快速找出某些文法錯誤。看到 Python代碼以普通句子的顔色顯示,或者普通句子以Python 代碼的顔色顯示時,就可 能意味着檔案中存在引号不比對的情況。 2.3.6 python2 中的print語句 在 Python 2 中, print 語句的文法稍有不同: >>> python2.7 >>> print "Hello Python 2.7 world!" Hello Python 2.7 world! 在 Python 2 中,無需将要列印的内容放在括号内。從技術上說, Python 3 中的 print 是一個函數,是以括号必不可少。有些 Python 2 print 語句也包含括号,但其行為與 Python 3 中 稍有不同。簡單地說,在 Python 2 代碼中,有些 print 語句包含括号,有些不包含。 動手試一試   在做下面的每個練習時,都編寫一個獨立的程式,并将其儲存為名稱類似于 name_cases.py 的檔案。如果遇到了困難,請休息一會兒或參閱附錄 C 提供的建議。 2-3 個性化的消息 : 将使用者的姓名存到一個變量中,并向該使用者顯示一條消息。顯示的消息應非常簡單,如 “Hello Eric, would you liketo learn some Python today?” 。 2-4 調整名字大小寫 : 将一個人名存儲到一個變量中,再以小寫、大寫和首字母大寫的方式顯示這個人名。 2-5 名 名 言: : 找一句你欽佩的名人說的名言,将這個名人的姓名和他的名言列印出來。輸出應類似于下面這樣(包括引号): Albert Einstein oncesaid,“Apersonwho never madea mistake never tried anything new.” 2-6 名言 2 : 重複練習 2-5 ,但将名人的姓名存儲在變量 famous_person 中,再建立要顯示的消息,并将其存儲在變量 message 中,然後列印這條消息。 2-7 剔除人名中的空白 : 存儲一個人名,并在其開頭和末尾都包含一些空白字元。務必至少使用字元組合 "\t" 和 "\n" 各一次。 列印這個人名,以顯示其開頭和末尾的空白。然後,分别使用剔除函數 lstrip() 、 rstrip() 和 strip() 對人名進行處理,并将結果列印出來。 2.4 數字 在程式設計中,經常使用數字來記錄遊戲得分、表示可視化資料、存儲 Web 應用資訊等。 Python 根據數字的用法以不同的方式處理它們。鑒于整數使用起來最簡單,下面就先來看看 Python 是如何管理它們的。 2.4.1 整數 在 Python 中,可對整數執行加( + )減( - )乘( * )除( / )運算。 >>> 2 + 3 5 >>> 3 - 2 1 >>> 2 * 3 6 >>> 3 / 2 1.5 在終端會話中, Python 直接傳回運算結果。 Python 使用兩個乘号表示乘方運算: >>> 3 ** 2 9 >>> 3 ** 3 27 >>> 10 ** 6 1000000 Python 還支援運算次序,是以你可在同一個表達式中使用多種運算。你還可以使用括号來修改運算次序,讓 Python按你指定的次序執行運算,如下所示: >>> 2 + 3*4 14 >>> (2 + 3) * 4 20 在這些示例中,空格不影響Python 計算表達式的方式,它們的存在旨在讓你閱讀代碼時,能迅速确定先執行哪些運算。 2.4.2 浮點數 Python 将帶小數點的數字都稱為浮 點 數 。大多數程式設計語言都使用了這個術語,它指出了這樣一個事實:小數點可出現在數字的任何位置。每種程式設計語言都須細心設計,以妥善地 處理浮點數,確定不管小數點出現在什麼位置,數字的行為都是正常的。 從很大程度上說,使用浮點數時都無需考慮其行為。你隻需輸入要使用的數字, Python 通常都會按你期望的方式處理它們: >>> 0.1 + 0.1 0.2 >>> 0.2 + 0.2 0.4 >>> 2 * 0.1 0.2 >>> 2 * 0.2 0.4 但需要注意的是,結果包含的小數位數可能是不确定的: >>> 0.2 + 0.1 0.30000000000000004 >>> 3 * 0.1 0.30000000000000004 所有語言都存在這種問題,沒有什麼可擔心的。 Python 會盡力找到一種方式,以盡可能精确地表示結果,但鑒于計算機内部表示數字的方式,這在有些情況下很難。就現在而言, 暫時忽略多餘的小數位數即可;在第二部分的項目中,你将學習在需要時處理多餘小數位的方式。 2.4.3 使用函數str()避免類型錯誤 你經常需要在消息中使用變量的值。例如,假設你要祝人生日快樂,可能會編寫類似于下面的代碼: birthday.py age = 23 message = "Happy " + age + "rd Birthday!" print(message) 你可能認為,上述代碼會列印一條簡單的生日祝福語: Happy 23rd birthday! 。但如果你運作這些代碼,将發現它們會引發錯誤: Traceback (most recent call last): File "birthday.py", line 2, in <module> message = "Happy " + age + "rd Birthday!" ❶ TypeError: Can't convert 'int' object to str implicitly 這是一個類 型錯 誤 ,意味着 Python 無法識别你使用的資訊。在這個示例中, Python 發現你使用了一個值為整數( int )的變量,但它不知道該如何解讀這個值(見 ❶ )。 Python 知 道,這個變量表示的可能是數值 23 ,也可能是字元 2 和 3 。像上面這樣在字元串中使用整數時,需要顯式地指出你希望 Python将這個整數用作字元串。為此,可調用函數str() , 它讓 Python 将非字元串值表示為字元串: age = 23 message = "Happy " + str(age) + "rd Birthday!" print(message) 這樣, Python 就知道你要将數值 23 轉換為字元串,進而在生日祝福消息中顯示字元 2 和 3 。經過上述處理後,将顯示你期望的消息,而不會引發錯誤: Happy 23rd Birthday! 大多數情況下,在 Python 中使用數字都非常簡單。如果結果出乎意料,請檢查 Python是否按你期望的方式将數字解讀為了數值或字元串。 2.4.4 Python 2中的整數 在 Python 2 中,将兩個整數相除得到的結果稍有不同: >>> python2.7 >>> 3 / 2 1 Python 傳回的結果為 1 ,而不是 1.5 。在 Python 2 中,整數除法的結果隻包含整數部分,小數部分被删除。請注意,計算整數結果時,采取的方式不是四舍五入,而是将小數部分直 接删除。 (類似c裡面的向下取整) 在Python 2中,若要避免這種情況,務必確定至少有一個操作數為浮點數,這樣結果也将為浮點數: >>> 3 / 2 1 >>> 3.0 / 2 1.5 >>> 3 / 2.0 1.5 >>> 3.0 / 2.0 1.5 從 Python 3 轉而用 Python 2 或從 Python 2 轉而用 Python 3 時,這種除法行為常常會令人迷惑。使用或編寫同時使用浮點數和整數的代碼時,一定要注意這種異常行為。 動手試一試   2-8 數 字 8 : 編寫 4 個表達式,它們分别使用加法、減法、乘法和除法運算,但結果都是數字 8 。為使用 print 語句來顯示結果,務必将這些表達式用括号括起來,也 就是說,你應該編寫 4 行類似于下面的代碼: print(5 + 3) 輸出應為 4 行,其中每行都隻包含數字 8 。 2-9 最 喜歡的數 字: : 将你最喜歡的數字存儲在一個變量中,再使用這個變量建立一條消息,指出你最喜歡的數字,然後将這條消息列印出來。 2.5 注釋 在大多數程式設計語言中,注釋都是一項很有用的功能。本書前面編寫的程式中都隻包含 Python 代碼,但随着程式越來越大、越來越複雜,就應在其中添加說明,對你解決問題的方法 進行大緻的闡述。 注釋 讓你能夠使用自然語言在程式中添加說明。 2.5.1 如何編寫注釋 在 Python 中,注釋用井号( # )辨別。井号後面的内容都會被 Python 解釋器忽略,如下所示: comment.py # 向大家問好 print("Hello Python people!") Python 解釋器将忽略第 1 行,隻執行第 2 行。 Hello Python people! 2.5.2 該編寫什麼樣的注釋 編寫注釋的主要目的是闡述代碼要做什麼,以及是如何做的。在開發項目期間,你對各個部分如何協同工作了如指掌,但過段時間後,有些細節你可能不記得了。當然,你總是 可以通過研究代碼來确定各個部分的工作原理,但通過編寫注釋,以清晰的自然語言對解決方案進行概述,可節省很多時間。 要成為專業程式員或與其他程式員合作,就必須編寫有意義的注釋。目前,大多數軟體都是合作編寫的,編寫者可能是同一家公司的多名員工,也可能是衆多緻力于同一個開源 項目的人員。訓練有素的程式員都希望代碼中包含注釋,是以你最好從現在開始就在程式中添加描述性注釋。作為新手,最值得養成的習慣之一是,在代碼中編寫清晰、簡潔的 注釋。 如果不确定是否要編寫注釋,就問問自己,找到合理的解決方案前,是否考慮了多個解決方案。如果答案是肯定的,就編寫注釋對你的解決方案進行說明吧。相比回過頭去再添 加注釋,删除多餘的注釋要容易得多。從現在開始,本書的示例都将使用注釋來闡述代碼的工作原理。 動手試一試   2-10 添 加 注 釋: : 選擇你編寫的兩個程式,在每個程式中都至少添加一條注釋。如果程式太簡單,實在沒有什麼需要說明的,就在程式檔案開頭加上你的姓名和目前日 期,再用一句話闡述程式的功能。 2.6 Python之禅 禅 程式設計語言 Perl 曾在網際網路領域長期占據着統治地位,早期的大多數互動式網站使用的都是 Perl 腳本。彼時, “ 解決問題的辦法有多個 ” 被 Perl 社群奉為座右銘。這種理念一度深受大家 的喜愛,因為這種語言固有的靈活性使得大多數問題都有很多不同的解決之道。在開發項目期間,這種靈活性是可以接受的,但大家最終認識到,過于強調靈活性會導緻大型項 目難以維護:要通過研究代碼搞清楚當時解決複雜問題的人是怎麼想的,既困難又麻煩,還會耗費大量的時間。 經驗豐富的程式員倡導盡可能避繁就簡。Python社群的理念都包含在TimPeters撰寫的“Python之禅”中。要獲悉這些有關編寫優秀Python代碼的指導原則,隻需在解釋器中執行命 令import this 。這裡不打算贅述整個 “Python 之禅 ” ,而隻與大家分享其中的幾條原則,讓你明白為何它們對 Python 新手來說至關重要。 >>> import this The Zen of Python, by Tim Peters Beautiful is better than ugly. Python 程式員笃信代碼可以編寫得漂亮而優雅。程式設計是要解決問題的,設計良好、高效而漂亮的解決方案都會讓程式員心生敬意。随着你對 Python 的認識越來越深入,并使用它來 編寫越來越多的代碼,有一天也許會有人站在你後面驚呼: “ 哇,代碼編寫得真是漂亮! ” Simple is better than complex. 如果有兩個解決方案,一個簡單,一個複雜,但都行之有效,就選擇簡單的解決方案吧。這樣,你編寫的代碼将更容易維護,你或他人以後改進這些代碼時也會更容易。 Complex is better than complicated.   #複雜總比複雜好。 現實是複雜的,有時候可能沒有簡單的解決方案。在這種情況下,就選擇最簡單可行的解決方案吧。 Readability counts. #可讀性。 即便是複雜的代碼,也要讓它易于了解。開發的項目涉及複雜代碼時,一定要為這些代碼編寫有益的注釋。 There should be one-- and preferably only one --obvious way to do it.  #應該有一種——最好隻有一種——顯而易見的方法來做 #到這一點。 如果讓兩名Python 程式員去解決同一個問題,他們提供的解決方案應大緻相同。這并不是說程式設計沒有創意空間,而是恰恰相反!然而,大部分程式設計工作都是使用常見解決方案來解 決簡單的小問題,但這些小問題都包含在更龐大、更有創意空間的項目中。在你的程式中,各種具體細節對其他 Python程式員來說都應易于了解。 Now is better than never. #現在總比沒有好。 你可以将餘生都用來學習 Python 和程式設計的紛繁難懂之處,但這樣你什麼項目都完不成。不要企圖編寫完美無缺的代碼;先編寫行之有效的代碼,再決定是對其做進一步改進,還是 轉而去編寫新代碼。 等你進入下一章,開始研究更複雜的主題時,務必牢記這種簡約而清晰的理念。如此,經驗豐富的程式員定将對你編寫的代碼心生敬意,進而樂意向你提供回報,并與你合作開 發有趣的項目。 動手試一試   2-11 Python 之 之 禅: : 在 Python 終端會話中執行指令 import this ,并粗略地浏覽一下其他的指導原則。 2.7 小結 在本章中,你學習了:如何使用變量;如何建立描述性變量名以及如何消除名稱錯誤和文法錯誤;字元串是什麼,以及如何使用小寫、大寫和首字母大寫方式顯示字元串;使用 空白來顯示整潔的輸出,以及如何剔除字元串中多餘的空白;如何使用整數和浮點數;使用數值資料時需要注意的意外行為。你還學習了如何編寫說明性注釋,讓代碼對你和其 他人來說更容易了解。最後,你了解了讓代碼盡可能簡單的理念。 在第 3 章,你将學習如何在被稱為列 表的變量中存儲資訊集,以及如何通過周遊清單來操作其中的資訊。