本書的目標(biāo)是教你像計算機科學(xué)家一樣思考。這一思考方式集成了數(shù)學(xué)、工程以及自然科學(xué)的一些最好的特點。像數(shù)學(xué)家一樣,計算機科學(xué)家使用形式語言表示思想(具體來說是計算)。像工程師一樣,計算機科學(xué)家設(shè)計東西,將零件組成系統(tǒng),在各種選擇之間尋求平衡。像科學(xué)家一樣,計算機科學(xué)家觀察復(fù)雜系統(tǒng)的行為,形成假設(shè)并且對預(yù)測進(jìn)行檢驗。 對于計算機科學(xué)家,最重要的技能是 解決問題的能力 。解決問題(problem solving)意味著對問題進(jìn)行形式化,尋求創(chuàng)新型的解決方案,并且清晰、準(zhǔn)確地表達(dá)解決方案的能力。事實證明,學(xué)習(xí)編程的過程是鍛煉問題解決能力的一個絕佳機會。這就是為什么本章被稱為“程序之道”。 一方面,你將學(xué)習(xí)如何編程,這本身就是一個有用的技能。另一方面,你將把編程作為實現(xiàn)自己目的的手段。隨著學(xué)習(xí)的深入,你會更清楚自己的目的。 什么是程序??程序 是一系列說明如何執(zhí)行計算(computation)的指令。計算可以是數(shù)學(xué)上的計算,例如尋找公式的解或多項式的根,也可以是一個符號計算(symbolic computation),例如在文檔中搜索并替換文本或者圖片,就像處理圖片或播放視頻。 不同編程語言中,程序的具體細(xì)節(jié)也不一樣,但是有一些基本的指令幾乎出現(xiàn)在每種語言當(dāng)中:
無論你是否相信,這幾乎是程序的全部指令了。每個你曾經(jīng)用過的程序,無論多么復(fù)雜,都是由跟這些差不多的指令構(gòu)成的。因此,你可以認(rèn)為編程就是將龐大、復(fù)雜的任務(wù)分解為越來越小的子任務(wù),直到這些子任務(wù)簡單到可以用這其中的一個基本指令執(zhí)行。 運行Python?Python入門的一個障礙,是你可能需要在電腦上安裝Python和相關(guān)軟件。如果你熟悉電腦的操作系統(tǒng),特別是如果你能熟練使用命令行(command-line interface),安裝Python對你來說就不是問題了。但是對于初學(xué)者,同時學(xué)習(xí)系統(tǒng)管理(system administration)和編程這兩方面的知識是件痛苦的事。 為了避免這個問題,我建議你首先在瀏覽器中運行Python。等你對Python更加了解之后,我會建議你在電腦上安裝Python。 網(wǎng)絡(luò)上有許多網(wǎng)頁可以讓你運行Python。如果你已經(jīng)有最喜歡的網(wǎng)站,那就打開網(wǎng)頁運行Python吧。如果沒有,我推薦PythonAnywhere。我在 http:///thinkpython2e 給出了詳細(xì)的使用指南。 目前Python有兩個版本,分別是Python 2和Python 3。二者十分相似,因此如果你學(xué)過某個版本,可以很容易地切換到另一個版本。事實上,作為初學(xué)者,你只會接觸到很少數(shù)的不同之處。本書采用的是Python 3,但是我會加入一些關(guān)于Python 2的說明。 Python的 解釋器 是一個讀取并執(zhí)行Python代碼的程序。根據(jù)你的電腦環(huán)境不同,你可以通過雙擊圖標(biāo),或者在命令行輸入 Python 3.4.0 (default, Jun 19 2015, 14:20:21)[GCC 4.8.2] on linuxType 'help', 'copyright', 'credits' or 'license' for more information.>>> 前三行中包含了關(guān)于解釋器及其運行的操作系統(tǒng)的信息,因此你看到的內(nèi)容可能不一樣。但是你應(yīng)該檢查下版本號是否以3開頭,上面示例中的版本號是3.4.0。如果以3開頭,那說明你正在運行Python 3。如果以2開頭,那說明你正在運行(你猜對了)Python 2。 最后一行是一個提示符(prompt),表明你可以在解釋器中輸入代碼了。如果你輸入一行代碼然后按回車(Enter),解釋器就會顯示結(jié)果: >>> 1 + 12 現(xiàn)在你已經(jīng)做好了開始學(xué)習(xí)的準(zhǔn)備。接下來,我將默認(rèn)你已經(jīng)知道如何啟動Python解釋器和執(zhí)行代碼。 第一個程序?根據(jù)傳統(tǒng),你用一門新語言寫的第一個程序叫做“Hello, World!”,因為它的功能只不過是顯示單詞“Hello, World!”。在Python中,它看起來是這樣: >>> print('Hello, World!') 這是一個 Hello, World! 程序中的單引號標(biāo)記了被打印文本的首尾;它們不會出現(xiàn)在結(jié)果中。 括號說明 >>> print 'Hello, World!' 很快你就會明白二者之間的區(qū)別,現(xiàn)在知道這些就足夠了。
算術(shù)運算符?接下來介紹算術(shù)。Python提供了許多代表加法和乘法等運算的特殊符號,叫做 運算符 (operators)。 運算符 >>> 40 + 242>>> 43 - 142>>> 6 * 742 運算符 >>> 84 / 242.0 你可能會問,為什么結(jié)果是42.0,而不是42。在下節(jié)中,我會進(jìn)行解釋。 最后,運算符 >>> 6**2 + 642 某些語言使用 >>> 6 ^ 24 我不打算在本書中介紹位運算符,但是你可以閱讀 Python官方百科 ,了解相關(guān)內(nèi)容。 值和類型?值(value) 是程序處理的基本數(shù)據(jù)之一,比如說一個單詞或一個數(shù)字。我們目前已經(jīng)接觸到的值有:2,42.0,和 這些值又屬于不同的 類型(types) :2是一個 整型數(shù)(integer),42.0 是一個 浮點數(shù)(floating point number),而 如果你不確定某個值的類型是什么,解釋器可以告訴你: >>> type(2)<class 'int'>>>> type(42.0)<class 'float'>>>> type('Hello, World!')<class 'str'> “class”一詞在上面的輸出結(jié)果中,是類別的意思;一個類型就是一個類別的值。 不出意料,整型數(shù)屬于 那么像 >>> type('2')<class 'str'>>>> type('42.0')<class 'str'> 它們其實是字符串。 當(dāng)你輸入一個大數(shù)值的整型數(shù)時,你可能會想用逗號進(jìn)行區(qū)分,比如說像這樣:1,000,000。在Python中,這不是一個合法的 整型數(shù),但卻是合法的值。 >>> 1,000,000(1, 0, 0) 結(jié)果和我們預(yù)料的完全不同!Python把1,000,000當(dāng)作成了一個以逗號區(qū)分的整型數(shù)序列。在后面的章節(jié)中,我們會介紹更多有關(guān)這種序列的知識。 形式語言和自然語言?自然語言(natural language) 是人們交流所使用的語言,例如英語、西班牙語和法語。它們不是人為設(shè)計出來的(盡管有人試圖這樣做);而是自然演變而來。 形式語言(formal languages)是人類為了特殊用途而設(shè)計出來的。例如,數(shù)學(xué)家使用的記號(notation)就是形式語言,特別擅長表示數(shù)字和符號之間的關(guān)系。化學(xué)家使用形式語言表示分子的化學(xué)結(jié)構(gòu)。 最重要的是:
形式語言通常擁有嚴(yán)格的 語法 規(guī)則,規(guī)定了詳細(xì)的語句結(jié)構(gòu)。例如,3+3=6是語法正確的數(shù)學(xué)表達(dá)式,而3+=3$6則不是;H2O是語法正確的化學(xué)式,而2Zz則不是。 語法規(guī)則有兩種類型,分別涉及記號(tokens)和結(jié)構(gòu)。記號是語言的基本元素,例如單詞、數(shù)字和化學(xué)元素。3+=3$6這個式子的問題之一,就是 $ 在數(shù)學(xué)中不是一個合法的記號(至少據(jù)我所知)。類似的,2Zz 也不合法,因為沒有一個元素的簡寫是 Zz。 第二種語法規(guī)則與標(biāo)記的組合方式有關(guān)。3+=3這個方程是非法的,因為即使+和=都是合法的記號,但是你卻不能把它們倆緊挨在一起。類似的,在化學(xué)式中,下標(biāo)位于元素之后,而不是之前。 This is @ well-structured Engli$h sentence with invalid t*kens in it.This sentence all valid tokens has, but invalid structure with.
當(dāng)你讀一個用英語寫的句子或者用形式語言寫的語句時,你都必須要理清各自的結(jié)構(gòu)(盡管在閱讀自然語言時,你是下意識地進(jìn)行的)。這個過程被稱為 解析(parsing)。 雖然形式語言和自然語言有很多共同點——標(biāo)記、結(jié)構(gòu)和語法,它們也有一些不同:
由于我們都是說著自然語言長大的,我們有時候很難適應(yīng)形式語言。形式語言與自然語言之間的不同,類似詩歌與散文之間的差異,而且更加明顯:
形式語言要比自然語言更加稠密,因此閱讀起來花的時間會更長。另外,形式語言的結(jié)構(gòu)也很重要,所以從上往下、從左往右閱讀,并不總是最好的策略。相反,你得學(xué)會在腦海里分析一個程序,識別不同的標(biāo)記并理解其結(jié)構(gòu)。最后,注重細(xì)節(jié)。拼寫和標(biāo)點方面的小錯誤在自然語言中無傷大雅,但是在形式語言中卻會產(chǎn)生很大的影響。 調(diào)試?程序員都會犯錯。由于比較奇怪的原因,編程錯誤被稱為 故障(譯者注:英文為bug,一般指蟲子),追蹤錯誤的過程被稱為 調(diào)試(debugging)。 編程,尤其是調(diào)試,有時會讓人動情緒。如果你有個很難的bug解決不了,你可能會感到憤怒、憂郁抑或是丟人。 有證據(jù)表明,人們很自然地把計算機當(dāng)人來對待。當(dāng)計算機表現(xiàn)好的時候,我們認(rèn)為它們是隊友,而當(dāng)它們固執(zhí)或無禮的時候,我們也會像對待固執(zhí)或無禮人的一樣對待它們(Reeves and Nass, The Media Equation:How People Treat Computers, Television, and New Media Like Real Peopleand Places)。 對這些反應(yīng)做好準(zhǔn)備有助于你對付它們。一種方法是將計算機看做是一個雇員,擁有特定的長處,例如速度和精度,也有些特別的缺點,像缺乏溝通以及不善于把握大局。 你的工作是當(dāng)一個好的管理者:找到充分利用優(yōu)點、摒棄弱點的方法。并且找到使用你的情感來解決問題的方法,而不是讓你的情緒干擾你有效工作的能力。 學(xué)習(xí)調(diào)試可能很令人泄氣,但是它對于許多編程之外的活動也是一個非常有價值的技能。在每一章的結(jié)尾,我都會花一節(jié)內(nèi)容介紹一些調(diào)試建議,比如說這一節(jié)。希望能幫到你! 術(shù)語表?
練習(xí)題?習(xí)題 1-1?你最好在電腦前閱讀此書,因為你可以隨時測試書中的示例。 每當(dāng)你試驗一個新特性的時候,你應(yīng)該試著去犯錯。舉個例子,在“Hello, World!”程序中,如果你漏掉一個引號會發(fā)生什么情況?如果你去掉兩個引號呢?如果你把print寫錯了呢? 這類試驗?zāi)軒椭阌洃涀x過的內(nèi)容;對你平時編程也有幫助,因為你可以了解不同的錯誤信息代表的意思?,F(xiàn)在故意犯錯誤,總勝過以后不小心犯錯。
習(xí)題 1-2?啟動Python解釋器,把它當(dāng)計算器使用。
|
|