在本章中,你將學習可在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 Python
world!”不是Python代碼,因此將其顯示為橙色。這種功能稱為語法突出 ,在你剛開始編寫程式時很有説明。
2.2 變數
下麵來嘗試在hello_world.py中使用一個變數。在這個檔開頭添加一行代碼,並對第2行代碼進行修改,如下所示:
message = "Hello Python world!"
print(message)
運行這個程式,看看結果如何。你會發現,輸出與以前相同:
Hello Python world!
我們添加了一個名為message 的變數 。每個變數都存儲了一個值 ——與變數相關聯的資訊。在這裡,存儲的值為文本“Hello Python world!”。
添加變數導致Python解譯器需要做更多工作。處理第1行代碼時,它將文本“Hello Python world!”與變數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。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 多條簡單消息: 將一條消息存儲到變數中,將其列印出來;再將變數的值修改為一條新消息,並將其列印出來。
msg = "I love learning to use Python."
print(msg)
msg = "It's really satisfying!"
print(msg)
輸出:
I love learning to use Python.
It's really satisfying!
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() 以首字母大寫的方式顯示每個單詞,即將每個單詞的首字母都改為大寫。這很有用,因為你經常需要將名字視為資訊。例如,你可能希望程式將值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() :
❹ >>> 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 Python 2中的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 like to learn some Python today?”。
2-4 調整名字的大小寫: 將一個人名存儲到一個變數中,再以小寫、大寫和首字母大寫的方式顯示這個人名。
2-5 名言: 找一句你欽佩的名人說的名言,將這個名人的姓名和他的名言列印出來。輸出應類似於下面這樣(包括引號):
Albert Einstein once said, “A person who
never made a mistake never tried anything new.”
print('Albert Einstein
once said, "A person who never made a mistake')
print('never tried
anything new."')
輸出:
Albert Einstein once said, "A person who never made a mistake
never tried anything new."
2-6 名言2: 重複練習2-5,但將名人的姓名存儲在變數famous_person 中,再創建要顯示的消息,並將其存儲在變數message 中,然後列印這條消息。
2-7 剔除人名中的空白: 存儲一個人名,並在其開頭和末尾都包含一些空白字元。務必至少使用字元組合"\t" 和"\n" 各一次。
列印這個人名,以顯示其開頭和末尾的空白。然後,分別使用剔除函數lstrip() 、rstrip() 和strip() 對人名進行處理,並將結果列印出來。
name = "\tEric Matthes\n"
print("Unmodified:")
print(name)
print("\nUsing
lstrip():")
print(name.lstrip())
print("\nUsing
rstrip():")
print(name.rstrip())
print("\nUsing
strip():")
print(name.strip())
輸出:
Unmodified:
Eric Matthes
Using lstrip():
Eric Matthes
Using rstrip():
Eric Matthes
Using strip():
Eric Matthes
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中,整數除法的結果只包含整數部分,小數部分被刪除。請注意,計算整數結果時,採取的方式不是四捨五入,而是將小數部分直接刪除。
在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 最喜歡的數位: 將你最喜歡的數位存儲在一個變數中,再使用這個變數創建一條消息,指出你最喜歡的數字,然後將這條消息列印出來。
fav_num = 42
msg = "My favorite number is " + str(fav_num) + "."
print(msg)
輸出:
My favorite number is 42.
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社區的理念都包含在Tim Peters撰寫的“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章,你將學習如何在被稱為清單 的變數中存儲資訊集,以及如何通過遍歷清單來操作其中的資訊。


0 留言:
發佈留言