本書是以Python為編程語言、面向計算機(jī)科學(xué)教育中的程序設(shè)計基礎(chǔ)課程與編程初學(xué)者的入門教材和自學(xué)讀物。本書以Python為工具,詳細(xì)討論了與編程有關(guān)的各方面問題,介紹了從初級到高級的許多重要編程技術(shù)。本書特別強(qiáng)調(diào)編程中的分析和思考、問題的嚴(yán)格化和逐步分解、語言結(jié)構(gòu)的正確選擇、程序結(jié)構(gòu)的良好組織,以及程序的正確和安全。書中通過大量實(shí)例及其開發(fā)過程,展示了好程序的特征和正確的編程工作方法。此外,書中還介紹Python語言的重要細(xì)節(jié)和工作原理,各章附有大量習(xí)題。本書既可以作為高校程序設(shè)計相關(guān)課程的教材,也適合希望學(xué)習(xí)Python語言和編程技術(shù)的讀者閱讀和參考。
計算機(jī)誕生至今不過六七十年,但它已經(jīng)改變了世界,改變了每個人的生活。人們每天都在與計算機(jī)交流(如智能手機(jī)),各領(lǐng)域?qū)I(yè)人員的大量日常工作都需要使用計算機(jī),從事與計算機(jī)相關(guān)工作的人們已經(jīng)發(fā)展為社會上最大的專業(yè)技術(shù)社團(tuán)。計算機(jī)的研究和應(yīng)用、互聯(lián)網(wǎng)和其他相關(guān)領(lǐng)域,還在不斷呼喚大量熟悉計算機(jī)的專業(yè)開發(fā)人才。計算機(jī)科學(xué)技術(shù)的開發(fā)和應(yīng)用能力已被廣泛認(rèn)為是國家競爭力的重要組成部分。因此,學(xué)習(xí)計算機(jī)科學(xué)技術(shù)知識,不僅是社會發(fā)展的需要,而且已成為個人的重要職業(yè)競爭力。然而,要深入理解計算和計算機(jī),使其成為得心應(yīng)手的工具,就必須學(xué)習(xí)編程。
近年來,Python語言的良好特征已經(jīng)得到學(xué)界和業(yè)界的廣泛認(rèn)可,被世界上許多知名大學(xué)選作計算機(jī)科學(xué)教育的第一門語言,也被很多企業(yè)和實(shí)際項目作為開發(fā)語言。這些發(fā)展情況,使越來越多的人有了學(xué)習(xí)Python的興趣和需要。
本書源自作者講授基于Python的編程課程的經(jīng)驗(yàn),又經(jīng)過認(rèn)真整理,目標(biāo)是提供一條清晰易行的學(xué)習(xí)路徑。本書的結(jié)構(gòu)和內(nèi)容力圖反映編程的本質(zhì),可以作為高校計算機(jī)基礎(chǔ)課程教材,也適合希望學(xué)習(xí)Python語言和編程技術(shù)的讀者閱讀和參考。本書書名反映了作者對編程的基本認(rèn)識:編程是從要解決的問題開始,最終得到解決問題的程序的過程。要學(xué)好編程,就要努力去理解這個過程,還必須反復(fù)實(shí)踐。
編程就是為了指揮計算機(jī)(而不是我們自己),通過一個自動計算過程(而不是人的操作)去解決問題。為了指揮計算機(jī)工作,我們需要理解計算機(jī),理解計算過程,理解指揮計算機(jī)完成計算的途徑和方法。還需要一種計算機(jī)能處理的表達(dá)方式,也就是編程語言(或稱程序設(shè)計語言,本書中用Python),用于說明計算機(jī)應(yīng)該怎樣工作。
程序是人寫出的一段文字,表達(dá)的是要求計算機(jī)完成的一個計算過程。完成編程工作需要多方面的理解。首先需要理解面對的問題:它究竟是什么、要求做什么、可能用什么方法和計算過程去解決?要理解自己寫出的程序,理解它描述的計算過程。最后的理解也非常重要:理解兩者之間的關(guān)系,即自己的程序是否正確解決了相應(yīng)的問題?沒有對問題和程序的深入思考和理解,就不可能開發(fā)出好的、功能正確的程序。
學(xué)習(xí)編程時必須關(guān)注兩方面的問題:如何從一個解決問題的需求出發(fā),逐步開發(fā)出一個計算過程;如何使用編程語言(如Python)正確地寫出解決問題的程序,描述(實(shí)現(xiàn))這個計算過程。本書的做法是提出一個個問題,從簡單到復(fù)雜,討論從它們出發(fā)的程序開發(fā)過程:分析問題的細(xì)節(jié),設(shè)法將其嚴(yán)格化,提出可能的解決方案,再經(jīng)分解和設(shè)計,以及隨后的編碼和調(diào)試,最終開發(fā)出一個程序。完成了一個程序,常常不是工作的結(jié)束,還需要回過頭去考察這個程序,分析其優(yōu)點(diǎn)和缺點(diǎn),研究改進(jìn)或變化的可能性。這樣的程序開發(fā)過程和其中的分析、思考、選擇、決策等,反映了編程工作的本質(zhì)和正確工作方法。當(dāng)然,考慮到讀者的經(jīng)驗(yàn)積累,較前章節(jié)中的討論包含了更多細(xì)節(jié),后面逐漸簡化,可能只關(guān)注工作中的一些要點(diǎn)。但是實(shí)際上,對任何一個問題,無論簡單或復(fù)雜,上述的思考和工作過程都會再一次重復(fù)。只不過隨著讀者的經(jīng)驗(yàn)積累,一些問題的分析和決策變得愈發(fā)自然順暢,以至于其明顯性逐步減弱。這種趨勢也反映了讀者的進(jìn)步。
在閱讀本書的過程中,建議讀者去親身體驗(yàn)程序的開發(fā)過程:看到一個問題之后,最好先不去看書中的分析和解決方法,而是自己思考,設(shè)法解決這個問題,完成之后再與書中的做法比較。如果兩種做法不同,就應(yīng)該分析它們各自的長處和短處。采用這樣的方法學(xué)習(xí)本書(和編程),讀者將不再是被動的接受者,而是主動參與者。
實(shí)際上,對每個問題,都可能有很多(理論上是無窮多)不同解決方法,對不同方法和設(shè)計的比較、選擇和決策,也是編程工作中最重要的內(nèi)容。對一個具體問題,總可能做出很多正確程序。如果問題稍微復(fù)雜,常能做出一組程序,其中任何一個都不比別的程序“更好”。這些情況說明,在編程學(xué)習(xí)中,并沒有必須背誦的標(biāo)準(zhǔn)答案。當(dāng)然,另一方面,作者也希望通過書中實(shí)例,反映良好的編程工作和好程序的特征。書中程序都由作者開發(fā)(其間也參考了許多材料),并經(jīng)過仔細(xì)修改和運(yùn)行試驗(yàn)。程序的格式符合Python社團(tuán)的考慮,結(jié)構(gòu)良好,實(shí)現(xiàn)方法清晰簡潔,可以作為讀者參考的范例。
編程語言是編程的工具,也是人與計算機(jī)交流的工具。它既要反映思維的特點(diǎn),使人易于使用,也要反映計算機(jī)的特點(diǎn),使計算機(jī)能按它寫出的程序高效工作。Python被廣泛認(rèn)為是一種比較適合初學(xué)者的語言,其設(shè)計較好地反映了計算機(jī)和編程的性質(zhì)和特點(diǎn),具有比較平滑的學(xué)習(xí)曲線。最簡單的Python程序可以看作數(shù)學(xué)和算術(shù)的自然延續(xù),可以方便地運(yùn)行,立刻看到結(jié)果(或效果)。初學(xué)者可以從這里開始一步步深入,在解決越來越復(fù)雜的問題的過程中,逐漸領(lǐng)悟編程和計算的性質(zhì)和本質(zhì)。另一方面,Python也支持許多高級編程概念,從高階函數(shù)、生成器函數(shù),到復(fù)雜數(shù)據(jù)對象的描述式、面向?qū)ο蟮木幊痰,反映了現(xiàn)代編程技術(shù)和需求的發(fā)展。本書中詳細(xì)介紹了這些機(jī)制和
目 錄
前言
第1章 程序設(shè)計和Python 1
1.1 計算機(jī)和程序1
1.1.1 “是什么”和“怎樣做”的知識1
1.1.2 計算和程序3
1.1.3 編程語言7
1.2 Python語言簡介10
1.2.1 Python語言的發(fā)展和應(yīng)用10
1.2.2 Python系統(tǒng)和IDLE編程環(huán)境13
1.3 程序開發(fā)15
1.3.1 程序開發(fā)過程15
1.3.2 程序錯誤16
1.3.3 從問題到程序19
練習(xí)22
第2章 計算和編程初步 23
2.1 數(shù)值表達(dá)式和算術(shù)23
2.1.1 整數(shù)計算23
2.1.2 浮點(diǎn)數(shù)和復(fù)數(shù)27
2.2 數(shù)據(jù)對象、計算和類型29
2.2.1 對象和類型29
2.2.2 混合類型計算和類型轉(zhuǎn)換30
2.2.3 數(shù)值類型和計算的簡單總結(jié)31
2.3 內(nèi)置函數(shù)和數(shù)學(xué)函數(shù)包32
2.3.1 函數(shù)及其使用33
2.3.2 處理數(shù)值的內(nèi)置函數(shù)33
2.3.3 數(shù)學(xué)函數(shù)包34
2.4 字符串35
2.4.1 字符串和字符串類型35
2.4.2 字符串操作36
2.5 標(biāo)識符、變量和賦值38
2.5.1 變量、名字和值38
2.5.2 簡單順序計算40
2.6 簡單腳本程序41
2.6.1 腳本的編輯和執(zhí)行41
2.6.2 程序和輸入43
2.7 判斷和條件控制45
2.7.1 條件判斷和邏輯表達(dá)式45
2.7.2 if語句(條件語句)46
2.7.3 編程實(shí)例48
2.8 重復(fù)計算和循環(huán)49
2.8.1 重復(fù)計算50
2.8.2 for語句和重復(fù)計算51
2.8.3 while語句和迭代53
2.8.4 循環(huán)控制56
2.9 計算的抽象和函數(shù)56
2.9.1 計算的控制和抽象56
2.9.2 計算的抽象:函數(shù)57
2.9.3 函數(shù)定義和使用實(shí)例60
2.10 若干Python機(jī)制及其他62
2.10.1 已討論的Python機(jī)制62
2.10.2 若干Python機(jī)制62
2.10.3 Python解釋器64
2.11 補(bǔ)充材料64
2.11.1 語言細(xì)節(jié)65
2.11.2 編程技術(shù)70
練習(xí)71
第3章 基本編程技術(shù) 77
3.1 循環(huán)程序設(shè)計77
3.1.1 循環(huán)的需求和問題78
3.1.2 常見循環(huán)形式80
3.1.3 輸入循環(huán)86
3.2 遞歸89
3.2.1 遞歸定義的函數(shù)89
3.2.2 乘冪的計算90
3.2.3 循環(huán)和遞歸91
3.2.4 斐波那契數(shù)列的計算92
3.2.5 最大公約數(shù)97
3.2.6 不容易用循環(huán)求解的遞歸問題100
3.2.7 更復(fù)雜的遞歸情況103
3.3 程序終止性103
3.3.1 調(diào)和級數(shù)的部分和104
3.3.2 程序終止性不可判定104
3.4 定義函數(shù)105
3.4.1 為什么定義函數(shù)105
3.4.2 學(xué)習(xí)定義函數(shù)108
3.4.3 函數(shù):兩種觀點(diǎn)及其聯(lián)系111
3.4.4 通用和專用的方法117
練習(xí)120
第4章 函數(shù)和程序結(jié)構(gòu) 124
4.1 作用域、環(huán)境和狀態(tài)124
4.1.1 作用域與函數(shù)定義124
4.1.2 環(huán)境和狀態(tài)126
4.1.3 程序執(zhí)行中的環(huán)境變化129
4.1.4 模塊和環(huán)境133
4.2 函數(shù)定義和函數(shù)調(diào)用135
4.2.1 函數(shù)定義的結(jié)構(gòu)135
4.2.2 函數(shù)調(diào)用中的問題140
4.2.3 帶默認(rèn)值形參和關(guān)鍵字實(shí)參143
4.3 編程框架和高階函數(shù)145
4.3.1 編程框架和函數(shù)的函數(shù)參數(shù)145
4.3.2 匿名函數(shù)和lambda表達(dá)式149
4.3.3 隨機(jī)數(shù)和模擬153
4.3.4 高階函數(shù)155
4.4 程序的測試和調(diào)試156
4.4.1 測試157
4.4.2 排除程序里的錯誤162
4.4.3 使用IDLE的調(diào)試功能163
4.4.4 程序測試問題165
4.5 補(bǔ)充材料166
4.5.1 語言細(xì)節(jié)166
4.5.2 編程技術(shù)和規(guī)則169
練習(xí)169
第5章 數(shù)據(jù)的組織和操作 172
5.1 組合數(shù)據(jù)對象172
5.2 表173
5.2.1 簡介174
5.2.2 表的構(gòu)造和操作175
5.2.3 編程實(shí)例178
5.3 元組183
5.3.1 基礎(chǔ)183
5.3.2 有理數(shù)程序包185
5.3.3 打包和拆分187
5.4 序列、不變對象和可變對象189
5.4.1 序列和序列操作189
5.4.2 描述式194
5.4.3 對象、變動和變量關(guān)聯(lián)196
5.4.4 一些程序?qū)嵗?02
5.4.5 表處理204
5.5 字符串及其格式化生成209
5.5.1 字符串操作209
5.5.2 字符串的格式化213
5.5.3 一個簡單的交互式計算器216
5.6 字典217
5.6.1 概念和操作218
5.6.2 字典與函數(shù)參數(shù)221
5.6.3 字典的應(yīng)用實(shí)例222
5.7 集合224
5.7.1 概念和操作224
5.7.2 集合操作226
5.8 程序?qū)嵗?28
5.8.1 多項式計算228
5.8.2 另一個篩法實(shí)例231
5.9 若干語言和技術(shù)問題232
5.9.1 邏輯類型和邏輯判斷232
5.9.2 函數(shù)參數(shù)的總結(jié)235
5.10 補(bǔ)充材料236
5.10.1 語言細(xì)節(jié)236
5.10.2 編程技術(shù)240
練習(xí)241
第6章 高級編程技術(shù) 248
6.1 文件:使用外存數(shù)據(jù)248
6.1.1 文件和輸入/輸出249
6.1.2 Python的文件功能251
6.1.3 文件處理程序?qū)嵗?56
6.2 生成器函數(shù)和閉包261
6.2.1 生成器函數(shù)261
6.2.2 閉包和裝飾器265
6.2.3 編程實(shí)例274
6.3 異常和異常處理276
6.3.1 運(yùn)行中的錯誤277
6.3.2 異常和異常處理279
6.3.3 異常處理的結(jié)構(gòu)和技術(shù)282
6.3.4 try結(jié)構(gòu)和raise語句詳述284
6.3.5 預(yù)定義異常287
6.3.6 用異常作為控制機(jī)制288
6.4 數(shù)據(jù)處理和持久性291
6.4.1 文本生成291
6.4.2 數(shù)據(jù)記錄和信息管理295
6.4.3 數(shù)據(jù)持久性300
6.4.4 with語句302
6.5 Python程序的幾個問題304
6.5.1 Python程序及其運(yùn)行304
6.5.2 程序格式307
6.5.3 怎樣閱讀Python手冊308
6.6 補(bǔ)充材料309
6.6.1 語言細(xì)節(jié)309
6.6.2 編程技術(shù)313
練習(xí)315
第7章 數(shù)據(jù)抽象和面向?qū)ο缶幊?320
7.1 數(shù)據(jù)抽象、類和自定義類型320
7.1.1 類型和數(shù)據(jù)組合321
7.1.2 對象、類和類型323
7.2 Python的類和對象325
7.2.1 對象和操作325
7.2.2 類定義326
7.2.3 幾點(diǎn)說明332
7.2.4 編程實(shí)例335
7.3 繼承339
7.3.1 繼承、基類和派生類340
7.3.2 編程實(shí)例344
7.3.3 多繼承348
7.3.4 異常和類349
7.4 實(shí)例:學(xué)校人事管理350
7.4.1 概念分層和基礎(chǔ)人員類350
7.4.2 具體人員類的設(shè)計和實(shí)現(xiàn)355
7.4.3 討論358
7.5 特殊方法名和特殊功能的類359
7.5.1 容器類和迭代器359
*7.5.2 上下文管理器和with語句363
7.5.3 幾個特殊方法名364
7.6 補(bǔ)充材料365
*7.6.1 Python類、對象和方法365
7.6.2 面向?qū)ο蟮募夹g(shù)和方法371
7.6.3 總結(jié)373
練習(xí)374
第8章 其他編程問題 377
8.1 圖形用戶界面377
8.1.1 人機(jī)界面的問題377
8.1.2 標(biāo)準(zhǔn)庫包tkinter和圖形用戶界面380
*8.1.3 tkinter的ttk包400
8.1.4 GUI的簡單應(yīng)用和問題402
8.1.5 應(yīng)用程序的GUI設(shè)計和實(shí)現(xiàn)404
8.1.6 總結(jié)和討論412
8.2 并發(fā)程序設(shè)計414
8.2.1 并發(fā)程序415
8.2.2 Python并發(fā)庫threading包418
8.2.3 定義自己的線程類422
8.2.4 并發(fā)程序的一些問題424
8.2.5 線程間通信和queue包431
8.2.6 一個GUI并發(fā)程序?qū)嵗?33
8.2.7 總結(jié)和討論436
練習(xí)438
附錄A Python語言速查 440
附錄B 標(biāo)準(zhǔn)函數(shù) 444
附錄C 書中使用的幾個標(biāo)準(zhǔn)庫包 448
附錄D IDLE開發(fā)環(huán)境 449
參考文獻(xiàn)及進(jìn)一步閱讀資料 452