摘要:另一個賦值語句將名稱關(guān)聯(lián)到出現(xiàn)在莎士比亞劇本中的所有去重詞匯的集合,總計(jì)個。表達(dá)式是一個復(fù)合表達(dá)式,計(jì)算出正序或倒序出現(xiàn)的莎士比亞詞匯集合。在意圖上并沒有按照莎士比亞或者回文來設(shè)計(jì),但是它極大的靈活性讓我們用極少的代碼處理大量文本。
1.1 引言
來源:1.1 Introduction
譯者:飛龍
協(xié)議:CC BY-NC-SA 4.0
計(jì)算機(jī)科學(xué)是一個極其寬泛的學(xué)科。全球的分布式系統(tǒng)、人工智能、機(jī)器人、圖形、安全、科學(xué)計(jì)算,計(jì)算機(jī)體系結(jié)構(gòu)和許多新興的二級領(lǐng)域,每年都會由于新技術(shù)和新發(fā)現(xiàn)而擴(kuò)展。計(jì)算機(jī)科學(xué)的快速發(fā)展廣泛影響了人類生活。商業(yè)、通信、科學(xué)、藝術(shù)、休閑和政治都被計(jì)算機(jī)領(lǐng)域徹底改造。
計(jì)算機(jī)科學(xué)的巨大生產(chǎn)力可能只是因?yàn)樗鼧?gòu)建在一系列優(yōu)雅且強(qiáng)大的基礎(chǔ)概念上。所有計(jì)算都以表達(dá)信息、指定處理它所需的邏輯、以及設(shè)計(jì)管理邏輯復(fù)雜性的抽象作為開始。對這些基礎(chǔ)的掌握需要我們精確理解計(jì)算機(jī)如何解釋程序以及執(zhí)行計(jì)算過程。
這些基礎(chǔ)概念在伯克利長期教授,使用由Harold Abelson、Gerald Jay Sussman和Julie Sussman創(chuàng)作的經(jīng)典教科書《計(jì)算機(jī)科學(xué)的構(gòu)造與解釋》(SICP)。這個講義大量借鑒了這本書,原作者慷慨地使它可用于改編和復(fù)用。
我們的智力之旅一旦出發(fā)就不能回頭了,我們也永遠(yuǎn)都不應(yīng)該對此有所期待。
1.1.1 在Python中編程我們將要學(xué)習(xí)計(jì)算過程的概念。計(jì)算過程是計(jì)算機(jī)中的抽象事物。在演化中,過程操縱著叫做數(shù)據(jù)的其它事物。過程的演化由叫做程序的一系列規(guī)則主導(dǎo)。人們創(chuàng)造程序來主導(dǎo)過程。實(shí)際上,我們使用我們的咒語來憑空創(chuàng)造出計(jì)算機(jī)的靈魂。
我們用于創(chuàng)造過程的程序就像巫師的魔法。它們由一些古怪且深奧的編程語言中的符號表達(dá)式所組成,這些語言指定了我們想讓過程執(zhí)行的任務(wù)。
在一臺工作正確的計(jì)算機(jī)上,計(jì)算過程準(zhǔn)確且嚴(yán)謹(jǐn)?shù)貓?zhí)行程序。所以,就像巫師的學(xué)徒那樣,程序員新手必須學(xué)會理解和預(yù)測他們的魔法產(chǎn)生的結(jié)果。
--Abelson & Sussman, SICP (1993)
語言并不是你學(xué)到的東西,而是你參與的東西。
--Arika Okrent
為了定義計(jì)算過程,我們需要一種編程語言,最好是一種許多人和大量計(jì)算機(jī)都能懂的語言。這門課中,我們將會使用Python語言。
Python是一種廣泛使用的編程語言,并且在許多職業(yè)中都有它的愛好者:Web程序員、游戲工程師、科學(xué)家、學(xué)者,甚至新編程語言的設(shè)計(jì)師。當(dāng)你學(xué)習(xí)Python時,你就加入到了一個數(shù)百萬人的開發(fā)者社群。開發(fā)者社群是一個極其重要的組織:成員可以互相幫助來解決問題,分享他們的代碼和經(jīng)驗(yàn),以及一起開發(fā)軟件和工具。投入的成員經(jīng)常由于他們的貢獻(xiàn)而出名,并且收到廣泛的尊重。也許有一天你會被提名為Python開發(fā)者精英。
Python語言自身就是一個大型志愿者社群的產(chǎn)物,并且為其貢獻(xiàn)者的多元化而自豪。這種語言在20世紀(jì)80年代末由Guido van Rossum設(shè)計(jì)并首次實(shí)現(xiàn)。他的Python3教程的第一章解釋了為什么Python在當(dāng)今眾多語言之中如此流行。
Python適用于作為教學(xué)語言,因?yàn)榭v觀它的歷史,Python的開發(fā)者強(qiáng)調(diào)了Python代碼對人類的解釋性,并在Python之禪中美觀、簡約和可讀的原則下進(jìn)一步加強(qiáng)。Python尤其適用于課堂,因?yàn)樗鼘挿旱奶匦灾С执罅康牟煌幊田L(fēng)格,我們將要探索它們。在Python中編程沒有單一的解法,但是有一些習(xí)俗在開發(fā)者社群之間流傳,它們可以使現(xiàn)有程序的閱讀、理解,以及擴(kuò)展變得容易。所以,Python的靈活性和易學(xué)性的組合可以讓學(xué)生們探索許多編程范式,之后將它們新學(xué)到的知識用于數(shù)千個正在開發(fā)的項(xiàng)目中。
這些講義通過使用抽象設(shè)計(jì)的技巧和嚴(yán)謹(jǐn)?shù)挠?jì)算模型,來快速介紹Python的特性。此外,這些講義提供了Python編程的實(shí)踐簡介,包含一些高級語言特性和展示示例。通過這門課,學(xué)習(xí)Python將會變成自然而然的事情。
然而,Python是一門生態(tài)豐富的語言,帶有大量特性和用法。我們講到基本的計(jì)算機(jī)科學(xué)概念時,會刻意慢慢地介紹他們。對于有經(jīng)驗(yàn)的學(xué)生,他們打算一口氣學(xué)完語言的所有細(xì)節(jié),我們推薦他們閱讀Mark Pilgrim的書Dive Into Python 3,它在網(wǎng)上可以免費(fèi)閱讀。這本書的主題跟這門課極其不同,但是這本書包含了許多關(guān)于使用Python的寶貴的實(shí)用信息。事先告知:不像這些講義,Dive Into Python 3需要一些編程經(jīng)驗(yàn)。
開始在Python中編程的最佳方法就是直接和解釋器交互。這一章會描述如何安裝Python3,使用解釋器開始交互式會話,以及開始編程。
1.1.2 安裝Python3就像所有偉大的軟件一樣,Python具有許多版本。這門課會使用Python3最新的穩(wěn)定版本(本書編寫時是3.2)。許多計(jì)算機(jī)都已經(jīng)安裝了Python的舊版本,但是它們可能不滿足這門課。你應(yīng)該可以在這門課上使用任何能安裝Python3的計(jì)算機(jī)。不要擔(dān)心,Python是免費(fèi)的。
Dive Into Python 3擁有一個為所有主流平臺準(zhǔn)備的詳細(xì)的安裝指南。這個指南多次提到了Python3.1,但是你最好安裝3.2(雖然它們的差異在這門課中非常微小)。EECS學(xué)院的所有教學(xué)機(jī)都已經(jīng)安裝了Python3.2。
1.1.3 交互式會話在Python交互式會話中,你可以在提示符>>>之后鍵入一些Python代碼。Python解釋器讀取并計(jì)算你輸入的東西,并執(zhí)行你的各種命令。
有幾種開始交互式會話的途徑,并且具有不同的特性。把它們嘗試一遍來找出你最喜歡的方式。它們?nèi)慷荚诒澈笫褂昧讼嗤慕忉屍鳎–Python)。
最簡單且最普遍的方式就是運(yùn)行Python3應(yīng)用。在終端提示符后(Mac/Unix/Linux)鍵入python3,或者在Windows上打開Python3應(yīng)用。(譯者注:Windows上設(shè)置完P(guān)ython的環(huán)境變量之后,就可以在cmd或PowerShell中執(zhí)行相同操作了。)
有一個更加用戶友好的應(yīng)用叫做Idle3(idle3),可用于學(xué)習(xí)這門語言。Idie會高亮你的代碼(叫做語法高亮),彈出使用提示,并且標(biāo)記一些錯誤的來源。Idle總是由Python自帶,所以你已經(jīng)安裝它了。
Emacs編輯器可以在它的某個緩沖區(qū)中運(yùn)行交互式會話。雖然它學(xué)習(xí)起來有些挑戰(zhàn),Emacs是個強(qiáng)大且多功能的編輯器,適用于任何語言。請閱讀61A的Emacs教程來開始。許多程序員投入大量時間來學(xué)習(xí)Emacs,之后他們就不再切換編輯器了。
在所有情況中,如果你看見了Python提示符>>>,你就成功開啟了交互式會話。這些講義使用提示符來展示示例,同時帶有一些輸入。
>>> 2 + 2 4
控制:每個會話都保留了你的歷史輸入。為了訪問這些歷史,需要按下
想像會把不知名的事物用一種形式呈現(xiàn)出來,詩人的筆再使它們具有如實(shí)的形象,空虛的無物也會有了居處和名字。
--威廉·莎士比亞,《仲夏夜之夢》
為了介紹Python,我們會從一個使用多個語言特性的例子開始。下一節(jié)中,我們會從零開始,一步一步構(gòu)建整個語言。你可以將這章視為即將到來的特性的預(yù)覽。
Python擁有常見編程功能的內(nèi)建支持,例如文本操作、顯示圖形以及互聯(lián)網(wǎng)通信。導(dǎo)入語句
>>> from urllib.request import urlopen
為訪問互聯(lián)網(wǎng)上的數(shù)據(jù)加載功能。特別是,它提供了叫做urlopen的函數(shù),可以訪問到統(tǒng)一資源定位器(URL)處的內(nèi)容,它是互聯(lián)網(wǎng)上的某個位置。
語句和表達(dá)式:Python代碼包含語句和表達(dá)式。廣泛地說,計(jì)算機(jī)程序包含的語句
計(jì)算某個值
或執(zhí)行某個操作
語句通常用于描述操作。當(dāng)Python解釋器執(zhí)行語句時,它執(zhí)行相應(yīng)操作。另一方面,表達(dá)式通常描述產(chǎn)生值的運(yùn)算。當(dāng)Python計(jì)算表達(dá)式時,就會計(jì)算出它的值。這一章介紹了幾種表達(dá)式和語句。
賦值語句
>>> shakespeare = urlopen("http://inst.eecs.berkeley.edu/~cs61a/fa11/shakespeare.txt")
將名稱shakespeare和后面的表達(dá)式的值關(guān)聯(lián)起來。這個表達(dá)式在URL上調(diào)用urlopen函數(shù),URL包含了莎士比亞的37個劇本的完整文本,在單個文本文件中。
函數(shù):函數(shù)封裝了操作數(shù)據(jù)的邏輯。Web地址是一塊數(shù)據(jù),莎士比亞的劇本文本是另一塊數(shù)據(jù)。前者產(chǎn)生后者的過程可能有些復(fù)雜,但是我們可以只通過一個表達(dá)式來調(diào)用它們,因?yàn)閺?fù)雜性都塞進(jìn)函數(shù)里了。函數(shù)是這一章的主要話題。
另一個賦值語句
>>> words = set(shakespeare.read().decode().split())
將名稱words關(guān)聯(lián)到出現(xiàn)在莎士比亞劇本中的所有去重詞匯的集合,總計(jì)33,721個。這個命令鏈調(diào)用了read、decode和split,每個都操作銜接的計(jì)算實(shí)體:從URL讀取的數(shù)據(jù)、解碼為文本的數(shù)據(jù)、以及分割為單詞的文本。所有這些單詞都放在set中。
對象:集合是一種對象,它支持取交和測試成員的操作。對象整合了數(shù)據(jù)和操作數(shù)據(jù)的邏輯,并以一種隱藏其復(fù)雜性的方式。對象是第二章的主要話題。
表達(dá)式
>>> {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"}
是一個復(fù)合表達(dá)式,計(jì)算出正序或倒序出現(xiàn)的“莎士比亞詞匯”集合。神秘的記號w[::-1]遍歷單詞中的每個字符,然而-1表明倒序遍歷(::表示第一個和最后一個單詞都使用默認(rèn)值)。當(dāng)你在交互式會話中輸入表達(dá)式時,Python會在隨后打印出它的值,就像上面那樣。
解釋器:計(jì)算復(fù)合表達(dá)式需要可預(yù)測的過程來精確執(zhí)行解釋器的代碼。執(zhí)行這個過程,并計(jì)算復(fù)合表達(dá)式和語句的程序就叫解釋器。解釋器的設(shè)計(jì)與實(shí)現(xiàn)是第三章的主要話題。
與其它計(jì)算機(jī)程序相比,編程語言的解釋器通常比較獨(dú)特。Python在意圖上并沒有按照莎士比亞或者回文來設(shè)計(jì),但是它極大的靈活性讓我們用極少的代碼處理大量文本。
最后,我們會發(fā)現(xiàn),所有這些核心概念都是緊密相關(guān)的:函數(shù)是對象,對象是函數(shù),解釋器是二者的實(shí)例。然而,對這些概念,以及它們在代碼組織中的作用的清晰理解,是掌握編程藝術(shù)的關(guān)鍵。
1.1.5 實(shí)踐指南Python正在等待你的命令。你應(yīng)當(dāng)探索這門語言,即使你可能不知道完整的詞匯和結(jié)構(gòu)。但是,要為錯誤做好準(zhǔn)備。雖然計(jì)算機(jī)極其迅速和靈活,它們也十分古板。在斯坦福的導(dǎo)論課中,計(jì)算機(jī)的本性描述為
計(jì)算機(jī)的基本等式是:計(jì)算機(jī) = 強(qiáng)大 + 笨拙
計(jì)算機(jī)非常強(qiáng)大,能夠迅速搜索大量數(shù)據(jù)。計(jì)算機(jī)每秒可以執(zhí)行數(shù)十億次操作,其中每個操作都非常簡單。
計(jì)算機(jī)也非常笨拙和脆弱。它們所做的操作十分古板、簡單和機(jī)械化。計(jì)算機(jī)缺少任何類似真實(shí)洞察力的事情...它并不像電影中的HAL 9000。如果不出意外,你不應(yīng)被計(jì)算機(jī)嚇到,就像它擁有某種大腦一樣。它在背后非常機(jī)械化。
程序是一個人使用他的真實(shí)洞察力來構(gòu)建出的一些實(shí)用的東西,它由這些簡單的小操作所組成。
—Francisco Cai & Nick Parlante, 斯坦福 CS101
在你實(shí)驗(yàn)Python解釋器的時候,你會馬上意識到計(jì)算機(jī)的古板:即使最小的拼寫和格式修改都會導(dǎo)致非預(yù)期的輸出和錯誤。
學(xué)習(xí)解釋錯誤和診斷非預(yù)期錯誤的原因叫做調(diào)試(debugging)。它的一些指導(dǎo)原則是:
逐步測試:每個寫好的程序都由小型的組件模塊組成,這些組件可以獨(dú)立測試。盡快測試你寫好的任何東西來及早捕獲錯誤,并且從你的組件中獲得自信。
隔離錯誤:復(fù)雜程序的輸出、表達(dá)式、或語句中的錯誤,通常可以歸于特定的組件模塊。當(dāng)嘗試診斷問題時,在你能夠嘗試修正錯誤之前,一定要將它跟蹤到最小的代碼片段。
檢查假設(shè):解釋器將你的指令執(zhí)行為文字 -- 不多也不少。當(dāng)一些代碼不匹配程序員所相信的(或所假設(shè)的)行為,它們的輸出就會是非預(yù)期的。了解你的假設(shè),之后專注于驗(yàn)證你的假設(shè)是否整理來調(diào)試。
詢問他人:你并不是一個人!如果你不理解某個錯誤信息,可以詢問朋友、導(dǎo)師或者搜索引擎。如果你隔離了一個錯誤,但是不知道如何改正,可以讓其它人來看一看。在小組問題解決中,會分享一大堆有價值的編程知識。
逐步測試、模塊化設(shè)計(jì)、明確假設(shè)和團(tuán)隊(duì)作業(yè)是貫穿這門課的主題。但愿它們也能夠一直伴隨你的計(jì)算機(jī)科學(xué)生涯。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/38105.html
摘要:為通用語言設(shè)計(jì)解釋器的想法可能令人畏懼。但是,典型的解釋器擁有簡潔的通用結(jié)構(gòu)兩個可變的遞歸函數(shù),第一個求解環(huán)境中的表達(dá)式,第二個在參數(shù)上調(diào)用函數(shù)。這一章接下來的兩節(jié)專注于遞歸函數(shù)和數(shù)據(jù)結(jié)構(gòu),它們是理解解釋器設(shè)計(jì)的基礎(chǔ)。 3.1 引言 來源:3.1 Introduction 譯者:飛龍 協(xié)議:CC BY-NC-SA 4.0 第一章和第二章描述了編程的兩個基本元素:數(shù)據(jù)和函數(shù)之間的...
摘要:對象表示信息,但是同時和它們所表示的抽象概念行為一致。通過綁定行為和信息,對象提供了可靠獨(dú)立的日期抽象。名稱來源于實(shí)數(shù)在中表示的方式浮點(diǎn)表示。另一方面,對象可以表示很大范圍內(nèi)的分?jǐn)?shù),但是不能表示所有有理數(shù)。 2.1 引言 來源:2.1 Introduction 譯者:飛龍 協(xié)議:CC BY-NC-SA 4.0 在第一章中,我們專注于計(jì)算過程,以及程序設(shè)計(jì)中函數(shù)的作用。我們看到了...
摘要:第四章分布式和并行計(jì)算來源譯者飛龍協(xié)議引言目前為止,我們專注于如何創(chuàng)建解釋和執(zhí)行程序。一個交互的例子就是在線閱讀紐約時報(bào)。當(dāng)上的服務(wù)器與瀏覽器客戶端比如通信時,它的任務(wù)就是發(fā)送回來紐約時報(bào)主頁的。消息有三個必要部分發(fā)送者接收者和內(nèi)容。 第四章 分布式和并行計(jì)算 來源:Chapter 4: Distributed and Parallel Computing 譯者:飛龍 協(xié)議:CC B...
摘要:實(shí)踐指南函數(shù)的藝術(shù)來源譯者飛龍協(xié)議函數(shù)是所有程序的要素,無論規(guī)模大小,并且在編程語言中作為我們表達(dá)計(jì)算過程的主要媒介。目前為止,我們討論了函數(shù)的形式特性,以及它們?nèi)绾问褂谩5谝恍忻枋龊瘮?shù)的任務(wù)。 1.4 實(shí)踐指南:函數(shù)的藝術(shù) 來源:1.4 Practical Guidance: The Art of the Function 譯者:飛龍 協(xié)議:CC BY-NC-SA 4.0 函...
摘要:的最常見的作用是構(gòu)造異常實(shí)例并拋出它。子句組只在執(zhí)行過程中的異常產(chǎn)生時執(zhí)行。每個子句指定了需要處理的異常的特定類。將強(qiáng)制轉(zhuǎn)為字符串會得到由返回的人類可讀的字符串。 3.4 異常 來源:3.4 Exceptions 譯者:飛龍 協(xié)議:CC BY-NC-SA 4.0 程序員必須總是留意程序中可能出現(xiàn)的錯誤。例子數(shù)不勝數(shù):一個函數(shù)可能不會收到它預(yù)期的信息,必需的資源可能會丟失,或者網(wǎng)...
閱讀 3975·2021-11-18 13:22
閱讀 1812·2021-11-17 09:33
閱讀 2877·2021-09-26 09:46
閱讀 1208·2021-08-21 14:11
閱讀 2883·2019-08-30 15:53
閱讀 2706·2019-08-30 15:52
閱讀 1885·2019-08-30 10:52
閱讀 1516·2019-08-29 15:30