Think Python

CHAPTER 1 The Way of the Program - 程式設計的方法

這本書的目標是教你如何像電腦科學家一樣的思考方式,這種思考方式結合了一些數學,工程學,自然科學的最好特色。

就像個數學家,電腦科學家使用正式的語言來表達思想(具體的數值)。

就像個工程師,他們設計東西,組裝零件到系統內,而且評估替代方案之間的折衷辦法。

就像個自然科學家,他們觀察複雜系統的運作,成立假設,而且預測測試的結果。

電腦科學家一個最重要的技能就是解決問題,解決問題代表著有能力去闡述問題的所在,想出創新的解決方法,與清晰準確地去表達解決方法。

這就是為什麼第一章叫作 “程式設計的方法”。

在第一個階段,你將會去學習一個本身就很有用的技能叫作程式設計。

在其他的階段,你將會寫程式來達到目標。

如果我們順著走下去,目標將會愈來愈清晰。

The Python Programming Language - Python程式語言

你將要學習的程式語言是Python,Python是一種高階(high-level)的程式語言,其他也許你也聽過的高階程式語言像是C,C++,Perl,Java。

當然也有低階語言(low-level),有時也會被稱為”機械語言”或是”彙編語言”,粗略的來說,電腦只能執行低階語言寫的程式。

因此用高階語言寫的程式要讓它可以執行之前,必須先經過處理,這些額外的處理需要一點時間,這也是高階程式語言小小的缺點。

可是優點卻是巨大的。

第一,相當容易去撰寫高階程式語言,用高階語言去撰寫程式花費更少的時間,閱讀時間更短且更簡單,而且更符合一般的語言。

第二,高階語言是輕便的,這代表它們不需修改就可以在不同的電腦上執行,低階語言只能在同一台電腦執行,如果要在別台電腦執行就必須重寫。

由於這些優點,幾乎所有的程式都用高階語言去撰寫,低階語言只用於在某些特定的應用程式。

兩種不同的程式處理將高階語言轉變成低階語言,直譯器(interpreters)與編譯器(compilers)。

一個直譯器讀取高階程式語言並且執行它,這代表著程式怎麼說,直譯器就照著程式所說的去做。

直譯器處理一個程式需要一點點時間,因為它必須交叉閱讀與執行運算。

編譯器在程式執行前,會先讀取程式碼並翻譯完成,在這個部份,高階語言會被叫作程式碼(source code),被翻譯過後的程式碼被叫作 object code 或是 executable(可執行的檔案)。

只要程式被翻譯完成一次之後,你可以反覆的執行翻譯過後的程式,且不用再次翻譯它。

Python被認為是一種直譯的程式語言,因為Python的程式是用直譯器去執行的。

有兩種方法去使用直譯器:交互模式與腳本模式。

在交互作用模式,你在直議器內輸入Python程式碼並顯示的結果是:

>>> 1+1
2

chevron(>>>)這個符號是用來表示直譯器已經準備好了。如果你輸入1+1,直譯器會回覆2。

或者,你可以把程式碼儲存為一個檔案,並使用直譯器去執行這個檔案的內容,這就是所謂的腳本(script)。

按照慣例,Python的script會有 .py 的結尾名稱。

要執行script,你必須告訴直譯器這個script的名字,如果你有一個叫作 dinsdale.py 的script,而且你是在unix的指令window上作業,你只要輸入 python dinsdale.py

在其他開發環境中,執行script的細節都不同,你可以在Python_的網站找到適合你的開發環境。

在 interactive mode 下作業時,因為你可以輸入程式碼並馬上執行它,所以是方便用來測試小區塊的程式碼。

但是任何超過幾行的程式碼,你應該把你的code存成script,未來你就可以修改並且執行它。

What Is a Program? - 什麼是程式?

程式是一個連續的命令,去詳細指示如何去完成運算。運算的部份有可能是數學的運算,像是解決一組方程式,或是找尋多項式的根,

但是它也可以是象徵性的運算,例如搜索文件中替換的text,或是編輯程式。

細看之下,不同程式語言都有不同的地方,但是有幾個基本的命令幾乎都會出現在每一種程式語言:

input:

從鍵盤,檔案或是設備獲取資料。

output:

顯示資料在螢幕上,或是發送資料到一個檔案或是設備。

math:

執行基本的數學計算,例如加法減法。

conditional execution(有條件的執行):

檢查某些條件並執行適當的檔案

repetition(重複):

重複執行某些動作,通常有一些變化

不管你信不信,他們幾乎都會做這些事情.

每個你使用過的程式,不管有多麼複雜,他幾乎都是靠這些指令去組合起來的,所以你可以把大型,複雜的程式分解成小的子程式,

直到小的子程式簡單到只需要處理以上這些指令。

這種說法可能有點含糊,但是當我們談到演算法的時候,我們會再回來討論這些問題。

What Is Debugging? - 什麼是除錯?

程式是很容易出錯的,古怪的理由,程式出錯我們都叫他bugs,追蹤這些bugs的過程,我們叫它debugging。

程式會發生的三種錯誤,syntax errors(語法錯誤), runtime errors(運行錯誤),和 semantic errors(語意錯誤)。

這幾個錯誤的區別方法,讓我們在程式出錯時,可以更快速的追蹤出錯的地方。

Syntax Errors - 語法錯誤

Python只能在語法正確的情況下執行,否則直譯器會就會顯示錯誤訊息。

Syntax 指的是該程式的結構與該程式的結構規則,舉例來說,括號式成對存在的,所以 (1+2) 是合法的規則,

但是 8) 就會是 syntax error

使用英文閱讀的讀者最能容忍語法錯誤,這就是為什麼我們可以閱讀 e. e. cummings 的詩而不會出現錯誤訊息。

Python並不算太寬鬆,如果在你的程式中的任何地方出現了一個語法錯誤,Python會顯示一個錯誤訊息並且退出,而且你的程式將無法繼續運行。

在你撰寫程式生涯中的前幾周,你可能會花大量的時間去追蹤 syntax errors ,但是當你有個經驗之後,你會犯下更少的錯誤,且快速的追蹤那些錯誤。

Runtime Errors - 執行錯誤

第二種錯誤就是所謂的運行錯誤,被稱作運行錯誤的原因是因為這個錯誤不會在程式開始執行後出現。

這些錯誤也被稱為 exceptions(異常) ,這代表著程式已經發生了一些異常的情況(或是不好的情況)。

運行錯誤你在前幾章的簡單程式中並不常見,所以你可能會過一陣子才會遇到這種問題

Semantic Errors - 語意錯誤

第三種錯誤是語意錯誤,如果在你的程式中有任何的語意錯誤,程式還是會成功執行,電腦也不會產生任何做誤訊息,

但是程式並不會做出正確的事情,它會去做其他事情,具體來說,他會照著你要程式做的事情去做完這些事情。

問題是,你寫的程式並不是你想這樣寫的,這代表著你程式的語意是錯的。

找出語意錯誤是非常棘手的,因為它需要你透過output的結果去尋找錯誤,並試著搞清楚程式到底做了哪些事情。

Experimental Debugging - 測試性的debug

你將獲得重要的技能就是debug,雖然debug會令人洩氣,debug卻是在撰寫程式中最具智力,挑戰和有趣的部份。

在某些方面來說,debugging就像偵探的工作,你將會對照這些線索,推斷整個過程與事件,然後讓程式執行的結果呈現出來。

Debugging也像是一門實驗科學,只要你有一個想法出錯了,你會修改你的程式,然後再執行一次。

如果你的假設是正確的,那你就可以預測你修改之後的結果,而且離你可以使用的程式更進一步了。

如果你的假設是錯誤的,那你必須提出一個新的假設,就像福爾摩斯指出的 “When you have eliminated the impossible, whatever remains, however improbable, m ust be the truth.” (A. Conan Doyle, The Sign of Four)