來源:1.1 Introductionhtml
譯者:飛龍python
協議:CC BY-NC-SA 4.0git
計算機科學是一個極其寬泛的學科。全球的分佈式系統、人工智能、機器人、圖形、安全、科學計算,計算機體系結構和許多新興的二級領域,每一年都會因爲新技術和新發現而擴展。計算機科學的快速發展普遍影響了人類生活。商業、通訊、科學、藝術、休閒和政治都被計算機領域完全改造。程序員
計算機科學的巨大生產力可能只是由於它構建在一系列優雅且強大的基礎概念上。全部計算都以表達信息、指定處理它所需的邏輯、以及設計管理邏輯複雜性的抽象做爲開始。對這些基礎的掌握須要咱們精確理解計算機如何解釋程序以及執行計算過程。github
這些基礎概念在伯克利長期教授,使用由Harold Abelson、Gerald Jay Sussman和Julie Sussman創做的經典教科書《計算機科學的構造與解釋》(SICP)。這個講義大量借鑑了這本書,原做者慷慨地使它可用於改編和複用。編程
咱們的智力之旅一旦出發就不能回頭了,咱們也永遠都不該該對此有所期待。安全
咱們將要學習計算過程的概念。計算過程是計算機中的抽象事物。在演化中,過程操縱着叫作數據的其它事物。過程的演化由叫作程序的一系列規則主導。人們創造程序來主導過程。實際上,咱們使用咱們的咒語來憑空創造出計算機的靈魂。app
咱們用於創造過程的程序就像巫師的魔法。它們由一些古怪且深奧的編程語言中的符號表達式所組成,這些語言指定了咱們想讓過程執行的任務。編程語言
在一臺工做正確的計算機上,計算過程準確且嚴謹地執行程序。因此,就像巫師的學徒那樣,程序員新手必須學會理解和預測他們的魔法產生的結果。編輯器
--Abelson & Sussman, SICP (1993)
語言並非你學到的東西,而是你參與的東西。
爲了定義計算過程,咱們須要一種編程語言,最好是一種許多人和大量計算機都能懂的語言。這門課中,咱們將會使用Python語言。
Python是一種普遍使用的編程語言,而且在許多職業中都有它的愛好者:Web程序員、遊戲工程師、科學家、學者,甚至新編程語言的設計師。當你學習Python時,你就加入到了一個數百萬人的開發者社羣。開發者社羣是一個極其重要的組織:成員能夠互相幫助來解決問題,分享他們的代碼和經驗,以及一塊兒開發軟件和工具。投入的成員常常因爲他們的貢獻而出名,而且收到普遍的尊重。也許有一天你會被提名爲Python開發者精英。
Python語言自身就是一個大型志願者社羣的產物,而且爲其貢獻者的多元化而自豪。這種語言在20世紀80年代末由Guido van Rossum設計並首次實現。他的Python3教程的第一章解釋了爲何Python在當今衆多語言之中如此流行。
Python適用於做爲教學語言,由於縱觀它的歷史,Python的開發者強調了Python代碼對人類的解釋性,並在Python之禪中美觀、簡約和可讀的原則下進一步增強。Python尤爲適用於課堂,由於它寬泛的特性支持大量的不一樣編程風格,咱們將要探索它們。在Python中編程沒有單一的解法,可是有一些習俗在開發者社羣之間流傳,它們可使現有程序的閱讀、理解,以及擴展變得容易。因此,Python的靈活性和易學性的組合可讓學生們探索許多編程範式,以後將它們新學到的知識用於數千個正在開發的項目中。
這些講義經過使用抽象設計的技巧和嚴謹的計算模型,來快速介紹Python的特性。此外,這些講義提供了Python編程的實踐簡介,包含一些高級語言特性和展現示例。經過這門課,學習Python將會變成天然而然的事情。
然而,Python是一門生態豐富的語言,帶有大量特性和用法。咱們講到基本的計算機科學概念時,會刻意慢慢地介紹他們。對於有經驗的學生,他們打算一口氣學完語言的全部細節,咱們推薦他們閱讀Mark Pilgrim的書Dive Into Python 3,它在網上能夠免費閱讀。這本書的主題跟這門課極其不一樣,可是這本書包含了許多關於使用Python的寶貴的實用信息。事先告知:不像這些講義,Dive Into Python 3須要一些編程經驗。
開始在Python中編程的最佳方法就是直接和解釋器交互。這一章會描述如何安裝Python3,使用解釋器開始交互式會話,以及開始編程。
就像全部偉大的軟件同樣,Python具備許多版本。這門課會使用Python3最新的穩定版本(本書編寫時是3.2)。許多計算機都已經安裝了Python的舊版本,可是它們可能不知足這門課。你應該能夠在這門課上使用任何能安裝Python3的計算機。不要擔憂,Python是免費的。
Dive Into Python 3擁有一個爲全部主流平臺準備的詳細的安裝指南。這個指南屢次提到了Python3.1,可是你最好安裝3.2(雖然它們的差別在這門課中很是微小)。EECS學院的全部教學機都已經安裝了Python3.2。
在Python交互式會話中,你能夠在提示符>>>
以後鍵入一些Python代碼。Python解釋器讀取並計算你輸入的東西,並執行你的各類命令。
有幾種開始交互式會話的途徑,而且具備不一樣的特性。把它們嘗試一遍來找出你最喜歡的方式。它們所有都在背後使用了相同的解釋器(CPython)。
最簡單且最廣泛的方式就是運行Python3應用。在終端提示符後(Mac/Unix/Linux)鍵入python3
,或者在Windows上打開Python3應用。(譯者注:Windows上設置完Python的環境變量以後,就能夠在cmd
或PowerShell中執行相同操做了。)
有一個更加用戶友好的應用叫作Idle3(idle3
),可用於學習這門語言。Idie會高亮你的代碼(叫作語法高亮),彈出使用提示,而且標記一些錯誤的來源。Idle老是由Python自帶,因此你已經安裝它了。
Emacs編輯器能夠在它的某個緩衝區中運行交互式會話。雖然它學習起來有些挑戰,Emacs是個強大且多功能的編輯器,適用於任何語言。請閱讀61A的Emacs教程來開始。許多程序員投入大量時間來學習Emacs,以後他們就再也不切換編輯器了。
在全部狀況中,若是你看見了Python提示符>>>
,你就成功開啓了交互式會話。這些講義使用提示符來展現示例,同時帶有一些輸入。
>>> 2 + 2 4
控制:每一個會話都保留了你的歷史輸入。爲了訪問這些歷史,須要按下<Control>-P
(上一個)和<Control>-N
(下一個)。<Control>-D
會退出會話,這會清除全部歷史。
想像會把不知名的事物用一種形式呈現出來,詩人的筆再使它們具備如實的形象,空虛的無物也會有了居處和名字。
--威廉·莎士比亞,《仲夏夜之夢》
爲了介紹Python,咱們會從一個使用多個語言特性的例子開始。下一節中,咱們會從零開始,一步一步構建整個語言。你能夠將這章視爲即將到來的特性的預覽。
Python擁有常見編程功能的內建支持,例如文本操做、顯示圖形以及互聯網通訊。導入語句
>>> from urllib.request import urlopen
爲訪問互聯網上的數據加載功能。特別是,它提供了叫作urlopen
的函數,能夠訪問到統一資源定位器(URL)處的內容,它是互聯網上的某個位置。
語句和表達式:Python代碼包含語句和表達式。普遍地說,計算機程序包含的語句
計算某個值
或執行某個操做
語句一般用於描述操做。當Python解釋器執行語句時,它執行相應操做。另外一方面,表達式一般描述產生值的運算。當Python計算表達式時,就會計算出它的值。這一章介紹了幾種表達式和語句。
賦值語句
>>> shakespeare = urlopen('http://inst.eecs.berkeley.edu/~cs61a/fa11/shakespeare.txt')
將名稱shakespeare
和後面的表達式的值關聯起來。這個表達式在URL上調用urlopen
函數,URL包含了莎士比亞的37個劇本的完整文本,在單個文本文件中。
函數:函數封裝了操做數據的邏輯。Web地址是一塊數據,莎士比亞的劇本文本是另外一塊數據。前者產生後者的過程可能有些複雜,可是咱們能夠只經過一個表達式來調用它們,由於複雜性都塞進函數裏了。函數是這一章的主要話題。
另外一個賦值語句
>>> words = set(shakespeare.read().decode().split())
將名稱words
關聯到出如今莎士比亞劇本中的全部去重詞彙的集合,總計33,721個。這個命令鏈調用了read
、decode
和split
,每一個都操做銜接的計算實體:從URL讀取的數據、解碼爲文本的數據、以及分割爲單詞的文本。全部這些單詞都放在set
中。
對象:集合是一種對象,它支持取交和測試成員的操做。對象整合了數據和操做數據的邏輯,並以一種隱藏其複雜性的方式。對象是第二章的主要話題。
表達式
>>> {w for w in words if len(w) >= 5 and w[::-1] in words} {'madam', 'stink', 'leets', 'rever', 'drawer', 'stops', 'sessa', 'repaid', 'speed', 'redder', 'devil', 'minim', 'spots', 'asses', 'refer', 'lived', 'keels', 'diaper', 'sleek', 'steel', 'leper', 'level', 'deeps', 'repel', 'reward', 'knits'}
是一個複合表達式,計算出正序或倒序出現的「莎士比亞詞彙」集合。神祕的記號w[::-1]
遍歷單詞中的每一個字符,然而-1
代表倒序遍歷(::
表示第一個和最後一個單詞都使用默認值)。當你在交互式會話中輸入表達式時,Python會在隨後打印出它的值,就像上面那樣。
解釋器:計算複合表達式須要可預測的過程來精確執行解釋器的代碼。執行這個過程,並計算複合表達式和語句的程序就叫解釋器。解釋器的設計與實現是第三章的主要話題。
與其它計算機程序相比,編程語言的解釋器一般比較獨特。Python在乎圖上並無按照莎士比亞或者回文來設計,可是它極大的靈活性讓咱們用極少的代碼處理大量文本。
最後,咱們會發現,全部這些核心概念都是緊密相關的:函數是對象,對象是函數,解釋器是兩者的實例。然而,對這些概念,以及它們在代碼組織中的做用的清晰理解,是掌握編程藝術的關鍵。
Python正在等待你的命令。你應當探索這門語言,即便你可能不知道完整的詞彙和結構。可是,要爲錯誤作好準備。雖然計算機極其迅速和靈活,它們也十分古板。在斯坦福的導論課中,計算機的本性描述爲
計算機的基本等式是:
計算機 = 強大 + 笨拙
計算機很是強大,可以迅速搜索大量數據。計算機每秒能夠執行數十億次操做,其中每一個操做都很是簡單。
計算機也很是笨拙和脆弱。它們所作的操做十分古板、簡單和機械化。計算機缺乏任何相似真實洞察力的事情...它並不像電影中的HAL 9000。若是不出意外,你不該被計算機嚇到,就像它擁有某種大腦同樣。它在背後很是機械化。
程序是一我的使用他的真實洞察力來構建出的一些實用的東西,它由這些簡單的小操做所組成。
—Francisco Cai & Nick Parlante, 斯坦福 CS101
在你實驗Python解釋器的時候,你會立刻意識到計算機的古板:即便最小的拼寫和格式修改都會致使非預期的輸出和錯誤。
學習解釋錯誤和診斷非預期錯誤的緣由叫作調試(debugging)。它的一些指導原則是:
逐步測試:每一個寫好的程序都由小型的組件模塊組成,這些組件能夠獨立測試。儘快測試你寫好的任何東西來及早捕獲錯誤,而且從你的組件中得到自信。
隔離錯誤:複雜程序的輸出、表達式、或語句中的錯誤,一般能夠歸於特定的組件模塊。當嘗試診斷問題時,在你可以嘗試修正錯誤以前,必定要將它跟蹤到最小的代碼片斷。
檢查假設:解釋器將你的指令執行爲文字 -- 很少也很多。當一些代碼不匹配程序員所相信的(或所假設的)行爲,它們的輸出就會是非預期的。瞭解你的假設,以後專一於驗證你的假設是否整理來調試。
詢問他人:你並非一我的!若是你不理解某個錯誤信息,能夠詢問朋友、導師或者搜索引擎。若是你隔離了一個錯誤,可是不知道如何改正,可讓其它人來看一看。在小組問題解決中,會分享一大堆有價值的編程知識。
逐步測試、模塊化設計、明確假設和團隊做業是貫穿這門課的主題。希望它們也可以一直伴隨你的計算機科學生涯。