本書不僅僅是傳統的程序設計導論性教材,而且囊括了包羅萬象的計算機科學。書中采用Python作為學生的*門程序設計語言,提出“正確的時刻+正確的工具”的教學方法,尤為重視應用程序的開發訓練和計算思維的培養,易于教學和實踐。書中首先講解命令式編程,但也很早便引入了對象的概念;在學生具備足夠的基礎知識也更有學習動力之后,書中開始講解自定義類、面向對象編程等更多高級技巧。書中涵蓋了問題求解的核心技術和各類經典算法,這一版還增加了案例章節,所涉及的廣度也有所拓展。
本教程介紹程序設計、計算機應用程序開發和計算科學的基礎知識及應用實踐,適用于大學水平的程序設計導論課程。本教程不僅僅是程序設計的入門教程,更提供了計算機科學概念和現代計算機應用程序開發工具的廣泛知識和應用。
本教程采用的計算機程序設計語言是Python—一種比大多數語言學習曲線更加平滑的語言。Python提供了強大的軟件庫,使得復雜的任務很容易上手,例如開發圖形應用或者查找Web網頁上的所有超鏈接。在這本教科書中,我們充分利用Python語言的易學性和易用性,同時使用Python庫進行更多的計算機科學研究,并將重點放在現代應用程序開發上。這樣做的好處是使得本書充分介紹了計算和現代應用程序開發領域的相關知識和應用。
本教程的教學方法是以廣度優先的方式介紹計算的概念和Python程序設計知識。本教程的方法更接近自然語言的學習方法,從若干通用的詞匯開始,逐漸擴展相關知識,而不是逐一羅列計算的概念和Python語言結構知識。本教程采用面向問題的敘述方式,只有在需要的時候才介紹相關的計算概念、Python結構、算法技術和其他工具,即采用了“在正確的時間使用正確的工具”的模型。
本教程采用了命令式編程優先和面向過程的程序設計理念,但并不回避在早期討論對象的概念。當激發了學生的興趣并做好思想準備之后,再討論用戶自定義的類和面向對象的程序設計。教科書的最后三章和相關的案例研究使用Web爬取、搜索引擎和數據挖掘的上下文來介紹一系列廣泛的主題。這些主題包括有關遞歸、正則表達式、深度優先搜索、數據壓縮和谷歌的MapReduce框架的基本概念,以及諸如圖形用戶界面組件、HTML解析器、SQL、JSON、輸入/輸出流以及多核編程的實用工具。
這本教科書適用于計算機科學專業計算機科學和程序設計知識的課堂教學。本教程覆蓋了廣泛而又基本的計算機科學主題以及當前流行的技術,這些有助于學生廣泛理解該領域,并有信心開發與Web或數據庫交互的“真正”的現代應用程序。教科書廣泛的知識覆蓋也使得它非常適合于那些同時需要掌握程序設計和計算概念但又不愿意選修一門或兩門以上計算課程的學生。
技術特性
本教程具有許多吸引學生的特性,并積極鼓勵學生動手實踐。首先,本書提供了大量基于Python的交互式命令行的示例。學生可以很容易地自己復制這些代碼行。通過運行這些代碼并觀測代碼的執行結果,學生可能會使用交互式命令行的即時反饋來進行更深入的實驗。
貫穿整本教程,我們將一些練習題穿插在正文當中,其目的是加深對正文中剛剛討論過的概念的理解。這些問題的答案包含在相應的章節或者是案例研究的末尾,以允許學生檢查他們的答案是否正確,或者在思路堵塞的情況下作為參考。
對于程序設計過程中可能出現的潛在陷阱,本教程以“注意事項”的形式來警示學生。教程中還使用“知識拓展”的形式來簡要地探索有趣但稍微偏離正文內容的主題。正文中大量的練習題、圖和表等,為正文內容提供了更棒的視覺效果,從而使學生更容易閱讀和理解正文內容。
最后,本教程各章結尾均包含了大量的思考題,其中許多思考題與入門級教科書中常見的思考題截然不同。
本教程的電子版還提供額外的教學材料,其中包括11個案例研究。每一個案例研究都與一章(第2~12章)的正文內容相關聯,并充分展示對應章節中所涉及的概念和工具。案例研究中包括額外的思考題,以及相應的練習題及其答案。
在線補充資料
在本教程的配套網站上,提供了以下補充資料:
每個章節的PowerPoint教學幻燈片
每個章節的學習目標
教程中出現的所有代碼示例
習題和思考題的參考答案(僅供教師使用)
考試題(僅供教師使用)
致學生:如何閱讀本教程
本教程的目的是幫助讀者掌握程序設計和開發計算思維的技能。程序設計和計算思維是實踐行為,除了需要一臺安裝了Python集成開發環境的計算機以外,還需要用于演算的紙和筆。理想情況下,當讀者閱讀本教程的時候,必須擁有這些工具。
本教程大量使用了Python的交互式命令行示例。請讀者嘗試在命令行中運行這些示例。歡迎讀者進一步實驗。請讀者放心,即使你不小心犯了錯誤,計算機也不大可能大發雷霆的!
讀者還應該嘗試完成正文中給出的所有練習題。練習題的參考答案位于相應章節的結尾。如果你思路堵塞了,去偷看一眼參考答案也可以,但是偷看一眼之后,請嘗試自己解決問題而不要繼續偷看。
對于編程過程中潛在的陷阱,在正文中使用“注意事項”的形式來警示讀者。這些警示是非常重要的,讀者閱讀時不應該跳過。“知識拓展”部分則討論與主題稍微相關的話題,讀者愿意的話閱讀時可以跳過,或者感興趣的話也可以更加深入地探索這些話題。
在閱讀正文的某些內容的時候,讀者可能會靈感閃現,想開發自己的應用程序,也許是一個紙牌游戲,或一個實時跟蹤一系列股票市場指數的應用程序。如果靈感閃現,那就勇敢地去嘗試吧!相信你一定會收獲滿滿。
本教程概述
本教程共分12章,以“廣度優先”的方式介紹了計算概念以及Python程序設計語言。本教程的電子版還包括案例研究,展示了教程各章中所涵蓋的概念和工具。
Python和計算機科學導覽
第1章介紹基本的計算概念和術語。首先討論計算機科學是什么以及開發人員做什么,并定義建模、算法設計和程序設計的概念。然后描述了計算機科學家和應用程序開發人員的工具包,從邏輯到系統,重點在于程序設計語言、Python開發環境和計算思維。
第2章介紹核心的內置Python數據類型:整型、布爾型、浮點型、字符串、列表和元組。本章使用Python交互式命令行的方式闡述不同數據類型的特點。介紹沒有側重全面性,而是側重每種數據類型的用途,以及數據類型之間的差異和相似之處。這種方法可以激發對對象和類的更抽象的討論,而這對于最終掌握數據類型的正確用法是必需的。本教程電子版中的案例研究(CS.2)充分利用了這些討論,從而引入了海龜圖形類,讓學生能夠交互式地繪制簡單有趣的圖形。
第3章介紹命令式和面向過程的程序設計,包括基本的執行控制結構。本章將程序作為存儲在文件中的Python語句序列。為了控制語句的執行方式,引入了基本條件和迭代控制結構:單分支和雙分支if語句,以及迭代一個顯式序列或數字范圍的最簡單的for循環模式。本章介紹了函數,作為一種封裝小應用程序的方式;本章還在第2章所涵蓋的對象和類的知識上,描述了Python如何賦值和傳遞參數。本教程電子版中的案例研究(CS.3)通過基于海龜圖形的可視化上下文,激發讀者通過程序實現自動化,并通過函數實現抽象。
前三章對Python程序設計和計算機科學提供了一個淺顯而廣泛的介紹。通過介紹Python的核心數據類型和基本執行控制結構,學生能夠盡早上手編寫簡單而完整的程序。同時,在早期介紹函數可以幫助學生理解程序的功能,即程序所需要的輸入是什么,以及程序產生的輸出是什么。換言之,函數的抽象和封裝是用來幫助學生更好地理解程序的。
專注于算法思考
第4章更深入地討論了文本和文件處理。本章繼續討論第2章中涉及的字符串知識:字符串值的表示、字符串運算符和方法,以及格式化輸出。文件輸入/輸出(I/O)也會介紹,特別是讀取文本文件的不同模式。最后,使用文件I/O的上下文來激發對Python中異常和異常類型的討論。本教程電子版中的案例研究(CS.4)討論了圖像文件(通常存儲為二進制文件而不是文本文件)是如何讀取和寫入的,以及如何使用Python處理圖像。
第5章深入介紹執行控制結構和循環模式。基本條件和迭代結構在第3章中介紹,然后在第4章中使用(例如,在讀取文件的上下文中)。第5章一開始先討論多分支條件語句,其余大部分篇幅則用于描述不同的循環模式:for循環和while循環的各種不同使用方法。在討論嵌套循環模式時,還引入了多維列表。本章作為核心章節,不僅涵蓋了Python循環結構,還描述了問題分解的不同方式。因此,本章從本質上討論了問題求解和算法。本教程電子版中的案例研究(CS.5)分析了圖像處理的底層原理,描述了如何實現經典的圖像處理算法。
第6章詳細介紹了Python內置容器數據類型及其用法。引出字典、集合和元組數據類型加以介紹。本章還完成了對字符串的介紹,并討論了字符編碼和Unicode。最后,在討論選擇和排列容器中的項時引入了隨機性的概念。本教程電子版中的案例研究(CS.6)利用本章中介紹的概念,展示了如何開發一個21點撲克牌游戲應用程序。
第4~6章代表了本教程所采取的“廣度優先”方法的第二個層次。在入門程序設計課程中,學生所面臨的主要挑戰之一是掌握條件和迭代結構,更一般地說,是掌握解決計算問題和設計算法的技能。關鍵的第5章(關于如何應用執行控制結構的模式)出現在學生學習了基本條件語句和迭代模式的幾個星期后,此時他們已經漸漸適應了Python語言。對Python語言和迭代有一定程度的熟悉之后,學生可以專注于算法問題,而不是那些諸如如何正確地讀取輸入或者格式化輸出的次要問題。
管理程序的復雜性
第7章將重點轉移到軟件開發過程本身和管理更大、更復雜程序的問題上。本章介紹了名稱空間。名稱空間是管理程序復雜性的基礎。本章建立在第3章函數和參數傳遞的基礎上,引出了代碼重用、模塊化和封裝的軟件工程目標。函數、模塊和類是可以用來實現這些目標的工具,本質上是因為它們定義了單獨的名稱空間。本章描述了如何在正常控制流和異常控制流(當異常由異常處理程序處理時)中管理名稱空間。本教程電子版中的案例研究(CS.7)基于本章的內容展示了如何使用調試器查找程序中的錯誤,或者更一般地,如何使用調試器分析程序的執行情況。
第8章涵蓋了Python中新類的開發和面向對象程序設計(OOP)的范式。本章以第7章揭示的“類通過名稱空間實現”為基礎,解釋如何開發新的類。本章通過運算符重載(Python設計理念的中心)介紹了面向對象程序設計的概念,以及繼承(強大的面向對象程序設計屬性,將在第9章和第11章加以應用)。通過抽象和封裝,類實現了模塊化和代碼重用的軟件工程目標。然后通過抽象和封裝的討論來引出用戶自定義的異常類。本教程電子版中的案例研究(CS.8)進一步闡述了用戶自定義容器類中迭代行為的實現。
第9章介紹了圖形用戶界面(GUI),展示了面向對象方法在開發圖形用戶界面中的強大之處。本章使用Python的Tk組件工具包,它是Python標準庫的一部分。本章中討論如何利用交互式組件實現事件驅動編程模式。除了介紹圖形用戶界面開發外,本章還展示了如何使用面向對象程序設計的強大功能來實現模塊化和可重用的程序。本教程電子版中的案例研究(CS.9)通過實現基本計算器圖形用戶界面的過程證實了這一強大功能。
第7~9章的主要目標是向學生介紹程序復雜性和代碼組織問題。這幾章描述如何使用名稱空間來實現功能的抽象和數據的抽象,并最終實現封裝的、模塊化的、可重用的代碼。第8章全面討論了用戶自定義類和面向對象程序設計。然而,面向對象程序設計的優越性在實際應用中才能最好地體現,而這正是第9章的內容。其他有關面向對象程序設計的應用和實例將在后續章節陸續討論,特別是11.2節、12.3節、12.4節以及第10章的案例研究CS.10。第7~9章為學生將來在數據結構和軟件工程方法方面的學習提供了基礎。
知識深入和高級應用
第10~12章是本教程的最后三章,涵蓋了各種高級主題,從基本的計算機科學概念(例如遞歸、正則表達式、數據壓縮和深度優先搜索等)到實用的現代工具(例如HTML解析器、JSON、SQL和多核編程等)。文中通過開發諸如Web爬蟲程序、搜索引擎和數據挖掘應用程序來引出這些高級主題并將它們連接起來。然而,這些主題是松散的,并且每一個單獨的主題都是獨立呈現的,目的是允許教師根據他們認為合適的材料來設計不同的應用上下文和主題。
第10章介紹了計算機科學的基本主題:遞歸、查找和算法的運行時間分析。本章一開始即討論遞歸思想。然后將這種技巧應用于從繪制分形圖到病毒掃描的各種各樣的問題上。本章最后一個例子用于闡述深度優先搜索。遞歸的優點和缺點導致算法運行時間分析的討論。然后將算法運行時間的分析應用于各種查找算法性能的分析。本章把重點放在計算的理論方面,以便為今后的數據結構和算法課程奠定基礎。本教程電子版中的案例研究(CS.10)討論了漢諾塔問題,展示了如何開發一個可視化的應用程序來說明遞歸解決方案。
第11章介紹了萬維網—一個中央計算平臺,同時也是一個創新計算機應用程序開發的巨大數據源。在討論訪問Web上的資源和解析Web頁面的工具之前,對Web語言HTML進行了簡要討論。為了從Web頁面和其他文本內容中抓取所需的內容,首先介紹了正則表達式。在入門課程中接觸HTML解析和正則表達式的好處是,學生在學習正規語言課程之前,將熟悉其在應用中的用法。本教程電子版中的案例研究(CS.11)利用本章中所涉及的不同主題來展示一個基本的Web爬蟲程序的開發過程。
第12章介紹數據庫和大型數據集的處理。在講述如何存儲從網頁中抓取的數據時,簡要地介紹了數據庫查詢語言SQL以及一個Python數據庫應用編程接口。鑒于當今計算機應用數據庫的普及,建議學生盡早接觸數據庫及其使用(如果沒有其他的理由,應該在第一次實習前熟悉數據庫)。數據庫和SQL的討論只是介紹性的,應該被看作以后數據庫課程的基礎。本章還討論了如何利用計算機上可用的多個內核更快速地處理大數據集。本章還介紹了谷歌公司的問題解決框架MapReduce,并在此應用中介紹了列表解析和函數式編程范式。本章為進一步研究數據庫、程序設計語言和數據挖掘奠定了基礎。本教程電子版中的案例研究(CS.12)采用這一背景來討論數據交換,或者如何格式化并保存數據,以便任何需要這些數據的程序可以方便高效地訪問它們。
第2版新內容
本教程的第1版和第2版之間的最大變化是結構性調整。各章所涵蓋的基本知識和用于描述基本概念的案例研究在第2版中實現了明確的分離。案例研究已經從各章節中分離出來,在第2版中包含在教程的電子版中。這種結構性變化有兩個好處。第一個好處是,教科書章節可以更加專注于基本知識。第二個好處是,可以為案例研究提供更多的空間。新版本中出現了四個新的案例研究,教程中每一章(除了“非技術性”的介紹性章節)都關聯了一個案例研究。
除了這種結構性的變化,教程還增加、刪除了一些內容,糾正了一些錯誤,改進了一些表述方式。以下我們將一一羅列出這些變化。
在第2章中,我們增加了元組數據類型的討論(包含在第1版的第6章中)。這一舉措是合理的,因為在Python中,元組數據類型是一種關鍵的內置數據類型,并被許多標準庫模塊和Python應用程序所使用。例如,與第4章和第5章相關的案例研究中討論的圖像處理模塊就使用了元組對象。因為元組數據類型與列表數據類型非常相似,所以增加這個內容不會讓第2章的討論時間延長多少。
在第3章中,改進了闡述函數的方式。特別是提供了更多的例子和練習題以幫助說明如何傳遞不同數量和類型的函數參數。第4章的案例研究被替換為新的關于處理圖像文件的應用程序。新的案例研究給了學生一個令人興奮的機會,他們可以在視覺媒體的應用中查看教程內容。同時,處理和格式化日期、時間字符串的內容被移動到4.2節。在第2版中,重要的第5章有一個實現圖像處理算法的相關案例研究。這部分內容再次利用視覺媒體的吸引人的應用過程來闡述基本概念(例如嵌套循環)。
第6章不再包括元組數據類型的討論(被移至第2章中)。在第2版的第7章中包括了一個調試和調試器使用的相關案例研究。它有效地利用了本章所涵蓋的概念,為學生提供了一種新工具,幫助他們進行程序的調試。第8章和第9章只是略有變化。第10章對線性遞歸及其與迭代的關系進行了更為深入的研究。第11章幾乎沒有變化。最后,在第2版的第12章中提供了一個數據交換的相關案例研究,它將幫助學生獲得使用數據集的相關實踐經驗。
最后,第2版教程中增加了大約60道練習題和章節后面的思考題。
致教師:如何使用本教程
本教程的內容是為兩個學期的課程設計的,主要針對計算機科學和計算機科學程序設計專業的學生。本教程的內容足夠一個典型的15周的課程使用(可能正好適合于準備充分并且積極性很高的學生)。
本教程的前六章全面覆蓋了Python語言中命令式/面向過程的程序設計部分。它們應該按順序討論,但也可以在學習第4章之前學習第5章。此外,還可以跳過第6章的內容,然后在需要的時候回過頭來再學習。
為了有效地展示面向對象程序設計,建議按照順序依次學習第7~9章的內容。在學習第8章之前建議先學習第7章,這點非常重要,因為第7章揭開了Python類實現的神秘面紗,從而使得學生可以更加有效地學習面向對象程序設計主題(例如運算符重載和繼承)。同樣,在學習第8章之后再學習第9章也是非常有益的(但不是必須如此),因為第8章提供了一個應用,其中展示了面向對象程序設計的巨大優越性。
第9~12章都是可選內容,它們僅僅依賴于第1~6章的內容(當然也有少量擴充的知識點),其包含的內容一般可以跳過或者由任課教師自由編排授課順序。擴充的知識點位于9.4節(它演示了如何使用面向對象的程序設計方法開發圖形用戶界面),以及11.2節、12.3節和12.4節(它們都使用了用戶自定義的類)。所有這些知識均依賴于第8章中的內容。
在授課中使用本教程但計劃將有關面向對象程序設計的知識留給后續課程的教師,可以先講授第1~7章的內容,然后從第9~12章中選擇非面向對象程序設計部分的主題內容進行授課。對于那些希望講授面向對象程序設計知識的教師,應該使用第1~9章的內容,然后從第10~12章中選擇相應主題進行授課。
致謝
本教程第1版的內容材料是在DePaul大學教授CSC241/242課程序列(計算機科學導論I和II)的三年多時間里開發設計的。在這三年中,6個不同年級的計算機科學專業的新生學完了本課程系列。我在不同的學生群體中嘗試不同的教學方法,重新安排和重組教程中的內容材料,并嘗試教授給學生入門級程序設計課程中通常不教的主題內容。不斷的重組和實驗使得課程內容材料不太流暢,但更具挑戰性,特別是對于早期的學習群體。令人驚奇的是,雖然學生在本課程中所得到的分數不高,但他們依舊熱情不減,這反過來又幫助我維持了熱情。我衷心感謝他們。
我衷心感謝DePaul大學計算機學院的教師和管理人員,他們創造了一個真正獨特的學術環境,鼓勵教育實驗與創新。他們中的一些人也直接參與了本教程的創作和修訂。副院長Lucia Dettori合理安排了我的課程以便我有時間寫作。Curt White是一位經驗豐富的教科書作者,他積極鼓勵我開始寫作,并極力向John Wiley & Sons出版社推薦我。Massimo DiPierro是web2py Web框架的創始者,同時也是我永遠無法比肩的Python權威,他為CSC241/242系列課程的內容制定了第一份大綱,而這是本教材最初的種子。Iyad Kanj首開課程CSC241,并無私地允許我使用他開發的材料。Amber Settle是除我之外第一次使用本教程授課的教師,謝天謝地,她取得了巨大的成功,這個成功歸功于她本身就是一個優秀的教師。在我所認識的人中,Craig Miller最深入地思考并闡述了計算機科學的基本概念。通過和他之間的許多有趣的討論,我獲得了一些見解,本教程因此也受益匪淺。最后,Marcus Schaefer對本教程一半以上的內容進行了徹底的技術審查,大大改進和完善了本教程的
內容。
如果沒有Wiley出版社教科書代理Nicole Dingley的建議,我的課程講義將停留在講義層面而不會編輯成書。Nicole把我與Wiley出版社的編輯Beth Golub聯系在一起。感謝Beth做出了一個勇敢的決定,選擇信任一個擁有奇怪的名字并且沒有教材寫作經驗的外國人來編寫教科書。Wiley出版社的高級設計師Madelyn Lesure,以及我的朋友兼鄰居Mike Riordan,幫助我實現了簡單整潔的正文設計。最后,Wiley出版社的高級編輯助理Samantha Mandel不知疲倦地讓我的各章草稿進入審閱和出版環節。在整個教材出版過程中,Samantha一直是一個職業化和優雅的典范,她為這本教材提出了無數精彩的建議和意見,使得本教材更加出色。
這本書的最終版本只是表面上看起來與最初的草稿類似。相對于初始版本,教材最終版取得了長足的改善,這歸功于數十位評審者(其中很多是匿名)。陌生人的善意使本教材變得更完美,而這也使得我對教材審閱過程有了新的認識。審閱者們不僅能發現問題,而且有提供解決方案的熱情。我萬分感謝他們認真而系統的反饋。一些審閱者(包括David Mutchler(羅斯霍曼理工學院),提供了他的姓名和電子郵件給我以保持進一步通信聯系)超越其職責范圍,幫助挖掘深埋在我的早期草稿中的潛在問題。Jonathan Lundell還對本教材最后一章提供了技術審閱。由于時間上的限制,我沒能把收到的所有有價值的建議都納入教材中,對教材中任何疏漏的責任完全由我自己承擔。
我要特別感謝使用本教程第1版授課并給予我寶貴反饋意見的教師們:Ankur Agrawal(曼哈頓學院),Albert Chan(費耶特維爾州立大學),Gabriel Ferrer(漢德里克斯學院),David G. Kay(加利福尼亞大學歐文分校),Gerard Ryan(新澤西科技學院),Sridhar Seshadri(得克薩斯大學阿靈頓分校),Richard Weiss(常青州立大學),Michal Young(俄勒岡大學)等。我已經盡力在第2版中采納他們的建議。
最后,我要感謝我的愛人Lisa和女兒Marlena、Eleanor,感謝她們給予我的耐心。編寫一本教材需要花費大量的時間,而這些時間只能來自家庭時間或睡眠時間,因為其他職業責任均有其設定的時間。編寫這本教材花費的時間使得我常常無法參加家庭活動,或者由于睡眠不足而導致脾氣不好。幸運的是,我有先見之明,在開始這個項目的時候領養了一只狗。雖然在家庭活動中的缺席帶來了很多遺憾和失望,但這只名叫Muffin的狗無疑為我的家庭帶來了更多的快樂……所以,還要感謝Muffin。
關于作者
Ljubomir Perkovic是芝加哥DePaul大學計算學院的副教授。他于1990年在紐約城市大學亨特學院獲得了數學和計算機科學的學士學位,于1998年在卡內基–梅隆大學計算機科學學院獲得了算法、組合數學和優化的博士學位。
Perkovic于21世紀初在DePaul大學開始教授程序設計入門系列課程。他的目的是與初級程序員分享開發人員開發一個很酷的新應用程序時的興奮和喜悅。他把課程概念和現代應用程序開發中所使用的技術有機地融合在一起。他為這門課程所開發的材料構成了這本教程的基礎。
他的研究方向包括計算幾何、分布式計算、圖論和算法以及計算思維。他對計算幾何的研究讓他獲得了富布萊特研究學者獎和美國國家科學基金會項目(該項目研究如何在通識教育課程中擴大計算思維的應用)資助。
盧博米爾·佩爾科維奇(Ljubomir Perkovic) 美國德保羅大學計算與數字媒體學院教授,研究興趣包括計算機科學教育和計算思維、計算幾何學、圖論和算法、分布式計算。他于卡內基-梅隆大學計算機科學學院獲得博士學位。2008~2011年,他參與主持了NSF資助的項目,研究在文科類課程中如何推廣計算思維教學。他曾獲得Fulbright研究獎,以表彰他在計算幾何方面的研究貢獻。
出版者的話
譯者序
前言
第1章 計算機科學導論 1
1.1 計算機科學 1
1.1.1 計算機專業人員的工作 1
1.1.2 模型、算法和程序 2
1.1.3 必備的工具 3
1.1.4 什么是計算機科學 3
1.2 計算機系統 3
1.2.1 計算機硬件 3
1.2.2 操作系統 4
1.2.3 網絡和網絡協議 5
1.2.4 程序開發語言 5
1.2.5 軟件庫 6
1.3 Python程序設計語言 6
1.3.1 Python簡史 6
1.3.2 構建Python開發環境 7
1.4 計算思維 7
1.4.1 一個示例問題 8
1.4.2 抽象和建模 8
1.4.3 算法 9
1.4.4 數據類型 9
1.4.5 賦值語句和執行控制結構 10
1.4.6 本章小結 11
第2章 Python數據類型 12
2.1 表達式、變量和賦值語句 12
2.1.1 代數表達式和函數 12
2.1.2 布爾表達式和運算符 14
2.1.3 變量和賦值語句 16
2.1.4 變量名稱 18
2.2 字符串 18
2.2.1 字符串運算符 19
2.2.2 索引運算符 21
2.3 列表和元組 22
2.3.1 列表運算符 22
2.3.2 列表是可變類型,字符串是不可變類型 24
2.3.3 元組 24
2.3.4 元組和列表的方法 26
2.4 對象和類 28
2.4.1 對象類型 28
2.4.2 數值類型的有效值 29
2.4.3 數值類型的運算符 30
2.4.4 創建對象 32
2.4.5 隱式類型轉換 32
2.4.6 顯式類型轉換 33
2.4.7 類方法和面向對象的程序設計 34
2.5 Python標準庫 35
2.5.1 math模塊 35
2.5.2 fractions模塊 36
2.6 電子教程案例研究:海龜圖形 37
2.7 本章小結 37
2.8 練習題答案 37
2.9 習題 39
第3章 命令式編程 43
3.1 Python程序 43
3.1.1 我們的第一個Python程序 43
3.1.2 Python模塊 45
3.1.3 內置函數print() 45
3.1.4 使用input()函數實現交互式輸入 46
3.1.5 eval()函數 47
3.2 執行控制結構 47
3.2.1 單分支結構 48
3.2.2 雙分支結構 51
3.2.3 循環結構 52
3.2.4 嵌套的控制流結構 55
3.2.5 range()函數 55
3.3 用戶自定義函數 57
3.3.1 我們自定義的第一個函數 57
3.3.2 函數輸入參數 58
3.3.3 print()與return的比較 59
3.3.4 函數定義實際上是“賦值”語句 60
3.3.5 注釋 61
3.3.6 文檔字符串 61
3.4 Python變量和賦值語句 63
3.4.1 可變類型和不可變類型 63
3.4.2 賦值語句和可變性 65
3.4.3 交換 66
3.5 參數傳遞 67
3.5.1 不可變類型參數傳遞 67
3.5.2 可變類型參數傳遞 69
3.6 電子教程案例研究:自動化海龜圖形 70
3.7 本章小結 70
3.8 練習題答案 70
3.9 習題 73
3.10 思考題 74
第4章 文本數據、文件和異常 77
4.1 深入研究字符串 77
4.1.1 字符串表示 77
4.1.2 深入研究索引運算符 79
4.1.3 字符串方法 80
4.2 格式化輸出 83
4.2.1 函數print() 83
4.2.2 字符串方法format() 84
4.2.3 按列對齊排列數據 86
4.2.4 獲取與格式化日期和時間 89
4.3 文件 91
4.3.1 文件系統 91
4.3.2 打開和關閉文件 92
4.3.3 讀取文本文件的模式 96
4.3.4 寫入文本文件 98
4.4 錯誤和異常 99
4.4.1 語法錯誤 100
4.4.2 內置異常 100
4.5 電子教程案例研究:圖像文件 102
4.6 本章小結 102
4.7 練習題答案 103
4.8 習題 104
4.9 思考題 106
第5章 執行控制結構 108
5.1 選擇控制和if語句 108
5.1.1 三路以及多路分支 108
5.1.2 條件的排列順序 110
5.2 for循環和迭代模式 111
5.2.1 循環模式:迭代循環 111
5.2.2 循環模式:計數器循環 112
5.2.3 循環模式:累加器循環 114
5.2.4 其他類型的累加 115
5.2.5 循環模式:嵌套循環 117
5.3 深入研究列表:二維列表 119
5.3.1 二維列表 119
5.3.2 二維列表和嵌套循環模式 120
5.4 while循環 122
5.5 更多循環模式 124
5.5.1 循環模式:序列循環 124
5.5.2 循環模式:無限循環 125
5.5.3 循環模式:循環和折半 126
5.6 其他迭代控制語句 127
5.6.1 break語句 127
5.6.2 continue語句 128
5.6.3 pass語句 129
5.7 電子教程案例研究:圖像處理 129
5.8 本章小結 130
5.9 練習題答案 130
5.10 習題 133
5.11 思考題 134
第6章 容器和隨機性 140
6.1 字典 140
6.1.1 用戶自定義索引作為字典的動機 140
6.1.2 字典類屬性 141
6.1.3 字典運算符 143
6.1.4 字典方法 144
6.1.5 字典作為多路分支if語句的替代方法 146
6.1.6 字典作為計數器集合 147
6.1.7 元組對象可以作為字典的鍵 149
6.2 集合 150
6.2.1 使用set構造函數移除重復項 151
6.2.2 set運算符 152
6.2.3 set方法 153
6.3 字符編碼和字符串 154
6.3.1 字符編碼 154
6.3.2 ASCII 154
6.3.3 Unicode 156
6.3.4 Unicode字符的UTF-8編碼 158
6.4 random模塊 158
6.4.1 選擇一個隨機整數 159
6.4.2 選擇一個隨機“實數” 160
6.4.3 隨機混排、挑選和抽樣 161
6.5 電子教程案例研究:機