本書是高等學校Python基礎課程的教材。全書由7個單元組成。第1單元介紹Python的基本知識,內容包括Python的特點、數據對象、變量、輸入輸出等,使讀者對Python有一個初步了解;第2單元為Python程序結構,內容包括選擇結構、循環結構、函數、模塊、異常處理等;第3單元為容器,內容包括序列容器、無序容器、迭代器、生成器與推導表達式;第4單元為面向類的程序設計,內容包括類與對象、類與對象的通用屬性與操作、類的繼承;第5單元為Python數據處理,內容包括文件操作、數據庫操作、文件與目錄管理;第6單元為Python網絡編程,內容包括Python Socket編程、Python WWW應用開發;第7單元為Python GUI開發,內容包括GUI三要素、GUI程序結構、GUI制作示例。
本書力求內容精練、概念準確、代碼便于閱讀、習題豐富全面、適合教也容易學。為了便于初學者很快能使用以豐富的模塊支撐的Python環境,書后給出了Python運算符、Python內置函數、Python標準模塊庫目錄和Python 3.0標準異常類結構。
本書適合作為高等學校零基礎開設Python課程的教材,也適合作為程序設計愛好者和有關專業人員學習的參考書。
? 彰顯計算思維 語言藝術 工程規范的程序設計教育理念。
? 概念力求精準,突出思想性、啟發性、本質性。
? 結構力求嚴謹、緊湊,便于知識總結、梳理。
? 例題力求經典,例程力求簡短,便于閱讀、理解。
? 素材力求豐富,創造一個良好的知識建構環境和后期學習參考。
? 習題力求豐富、多樣,減輕教師開發題目的負擔。
? 零起點、輕松入門、螺旋式深入,適合不同層次的教學。
? 以Python 3.6.1為藍本,例程多在IDLE界面上調試,以便初學者快速掌握Python語法。
前 言
(一)
在多年從事C語言、C 和Java教學工作中,少不了有學生要求解釋如fun(i ,i )這樣的問題。有時,到外校進行學術交流時,也不乏同行教師問到這個問題。我感覺,能問到這個問題的學生,無疑是好學生。因為,這個問題雖小,但要解釋清楚它,需要涉及非定義行為、賦值表達式的副作用、序列點、程序設計風格等方面的概念,這些概念在相關教材中幾乎不見提到,許多教師也不清楚。更讓我吃驚的是,當我給一位從事了30多年C與C 教學的大學副教授講賦值表達式的副作用時,他竟然回了我一句:我不這樣認為。這足以說明問題的嚴重性了。
實際上,與其說是賦值操作的副作用,不如說是變量的副作用。這似乎是一個不可逾越的鴻溝。因為值的變化是變量的基本性質。然而,這個問題在Python中被解決了,因為它的數據多數屬于不可變類型。對于不可變類型的變量賦值,就成為引用指向另外一個對象了。這確實是Python的一大突破。Python有許多讓人耳目一新的特點,正是這些特點,使它得到了快速推廣,并贏得廣泛的支持。
2017年7月19日,IEEE(美國電氣電子工程師學會)出版的旗艦雜志IEEE Spectrum發布了第4屆頂級編程語言交互排行榜。這個排行榜由讀者需求、用戶增速、開源、設計自由度、雇主需求5個子排行榜組成。其中,前4個子排行榜中都是Python力壓群雄,只有雇主需求一榜位于C和Java之后,排名第三。圖1為IEEE Spectrum 2017 編程語言 Top 10 排名情況。
圖1 IEEE Spectrum 2017編程語言Top 10排名情況
據 IEEE Spectrum介紹,這個排行依據數據記者 Nick Diakopoulos 提供的數據,結合 10 個線上數據源的 12 個標準,對 48 種語言進行了排行。因為不可能顧及每一個程序員的想法,IEEE Spectrum使用多樣化、可交互的指標權重來評測每一種語言的現行使用情況。顯然,這個排行的客觀性、權威性是極高的。
另一個影響極大的程序設計語言排行榜是TIOBE。TIOBE排行榜是根據互聯網上有經驗的程序員、課程和第三方廠商的數量,并使用搜索引擎(如Google、Bing、百度)以及Wikipedia、Amazon、YouTube統計出排名數據,但只是反映某個編程語言的熱門程度,并不能說明一門編程語言好不好,也不反映就同一算法使用不同語言編寫時代碼數量多少。表1是其2017年10月發布的Top 10榜單。可以看出,Python雖位居第5,但它有上升趨勢,而前4名均有下降趨勢。
表1 TIOBE 2017年10月發布的程序設計語言Top 10榜單
2017年10月
2016年10月
變化
編程語言
評級/%
變化/%
1
1
Java
12.431
-6.37
2
2
C
8.374
-1.46
3
3
C
5.007
-0.79
4
4
C#
3.858
-0.51
5
5
Python
3.803
0.03
6
6
JavaScript
3.010
0.26
7
7
PHP
2.790
0.05
8
8
Visual Basic .NET
2.735
0.08
9
11
Assembly language
2.374
0.14
10
13
Ruby
2.324
0.32
(二)
Python應用廣泛,所包含的內容自然也十分廣泛。但是作為關于Python的基礎教程,不可能把所有內容都包含進來,甚至不可能包含較多的內容,內容選擇非常重要。作者經過反復斟酌,決定采取以Python核心語法為重心,添加關鍵性的、基礎性的應用型內容。最后,將應用型內容圈定在數據處理、網絡編程和GUI設計3個方面,并把全書按照7個單元進行組織。前4個單元為Python的核心語法知識,后3個單元為3個應用 方面。
第1單元介紹Python的基本知識,內容包括Python的特點、數據對象、變量、輸入輸出等,使讀者對Python有初步了解。
第2單元為Python程序結構,內容包括選擇結構、循環結構、函數、模塊、異常 處理。
第3單元為容器,內容包括序列容器、無序容器、迭代器、生成器與推導表達式。
第4單元為面向類的程序設計,內容包括類與對象、類與對象的通用屬性與操作、類的繼承。
第5單元為Python數據處理,內容包括文件操作、數據庫操作、文件與目錄管理。
第6單元為Python網絡編程,內容包括Python Socket編程、Python WWW開發。
第7單元為Python GUI開發,內容包括GUI三要素、GUI程序結構、GUI制作 示例。
著名心理學家皮亞杰創建的結構主義,把教師的主要職責定義為為學習者創建學習環境。作為Python教材,本書把附錄和習題作為正文之外的兩個重要的學習環境。本書的附錄包括Python運算符、Python內置函數、Python標準模塊庫目錄和Python 3.0標準異常類結構。
除了語言的內核和內置函數,模塊是Python的最大支撐。在Python中,每一項應用都要由相應的模塊支持。每一個應用程序的開發都需要按照熟悉領域知識導入相關模塊設計相應算法編寫相應代碼的過程。由于Python開源代碼的特點和社區廣大熱心者的支持,目前Python已經有上千的模塊可以利用。讀者知道哪些模塊可用,不僅可以開闊思路,而且可以瀏覽這些模塊目錄得到通向該應用領域的線索。不過,要把這些模塊全羅列出來不僅沒有必要,也沒有可能。這是將Python 3.0標準模塊庫目錄作為附錄的原因。雖然僅僅只有29項,但足可以對Python的應用范圍畫出一個輪廓。
習題也是重要的學習環境。為此本書收集并設計了多種類型的習題,并且在每節后面都給出相應的練習題。本書習題量雖多,卻還是無法滿足不同的練習需要。希望學習者和使用本書的老師們,不要囿于本書給出的習題,要開發出更多課后練習,開辟更好的Python學習環境。還需要說明的是,不是每一個題目都能直接在正文中找到答案。要找到正確的答案,需要深刻理解基本概念,或需要自己設計一些代碼測試分析。這樣才能培養出舉一反三的能力、創新的能力。
本書所有例題都在Python 3.6.1的交互環境中調試。本書也推薦在Python 3.0的交互環境平臺上教學或自學,在交互式環境中學習,有利于立即發現錯誤和理解錯誤原因。為便于閱讀,文中將系統輸出的內容用藍色印出。其中,藍色粗體為出錯信息(在IDLE中是紅色)。
(三)
教材是教學的劇本,是學習的向導。要編寫一本好的教材,不僅需要對本課程涉及內容有深刻的了解和感悟,還要熟悉相關領域的知識,更要不斷探討和深化貫穿其中的教學理念和教育思想,寫教材是件很難的事情。特別是在不斷的寫作中,常感到自己知識和能力的不足。由于是已經有了一些想法才開始寫作的,又不忍將這些想法隱藏起來,還由于已經得到一些親朋的支持和鼓勵,也不忍辜負他們的一片熱情,只能硬著頭皮寫下去,也幸有他們的幫助,才最后得以完成本書。在本書的寫作過程中,趙忠孝教授、姚威博士、張展為博士,以及魏士婧、劉硯秋、張秋菊、史林娟、張有明、戴璐、張展赫、吳灼偉(插圖)等參加了有關部分的編寫工作,在此謹表謝意。
本書就要出版了。它的出版,是我在這項教學改革工作中跨上的一個新臺階。本人衷心希望得到有關專家和讀者的批評與建議,也希望能多結交一些志同道合者,把這本書改得更好。
張基溫
丁酉菊月于穗小海之畔??
??
??
??
??
·IV·
·I·
目錄
第1單元 Python起步 1
1.1 程序設計語言與Python 1
1.1.1 計算機程序設計語言 1
1.1.2 高級程序設計語言分類 3
1.1.3 Python及其特點 6
1.1.4 Python模塊與腳本文件 8
練習1.1 11
1.2 Python數值對象類型 12
1.2.1 Python數據類型 12
1.2.2 Python內置數值類型 13
1.2.3 Decimal和Fraction 15
練習1.2 16
1.3 Python數據對象、變量與賦值 17
1.3.1 Python可變對象與不可變對象 17
1.3.2 Python變量與賦值操作 18
1.3.3 Python垃圾回收與對象生命期 21
1.3.4 Python標識符與保留字 22
練習1.3 23
1.4 數值計算萬能計算器 24
1.4.1 內置算術操作符與算術表達式 24
1.4.2 內置數學函數 27
1.4.3 math模塊 29
練習1.4 31
1.5 輸入與輸出 32
1.5.1 回顯與print()函數的基本用法 32
1.5.2 轉義字符與print()函數的格式控制 33
1.5.3 input()函數 37
練習1.5 37
第2單元 Python程序結構 38
2.1 命題與判斷 39
2.1.1 布爾類型 39
2.1.2 比較表達式 39
2.1.3 邏輯表達式 40
2.1.4 身份判定操作 43
練習2.1 43
2.2 選擇結構 45
2.2.1 if-else型選擇結構 45
2.2.2 if-else嵌套與if-elif選擇結構 47
練習2.2 49
2.3 循環結構 50
2.3.1 while語句 51
2.3.2 for語句 52
2.3.3 循環嵌套 54
2.3.4 循環中斷與短路控制 56
2.3.5 窮舉 59
2.3.6 迭代 61
2.3.7 確定性模擬 66
2.3.8 隨機模擬與random模塊 68
練習2.3 71
2.4 函數 73
2.4.1 函數調用、定義與返回 73
2.4.2 基于函數的變量作用域 77
2.4.3 函數參數技術 79
2.4.4 函數標注 83
2.4.5 遞歸 84
2.4.6 lambda表達式 88
練習2.4 89
2.5 程序異常處理 92
2.5.1 異常處理的基本思路與異常類型 93
2.5.2 try-except語句 94
2.5.3 控制異常捕獲范圍 96
2.5.4 else子句與finally子句 96
2.5.5 異常的人工顯式觸發:raise與assert 97
練習2.5 98
第3單元 容器 100
3.1 序列容器 100
3.1.1 序列對象的構建 100
3.1.2 序列通用操作 102
3.1.3 列表的個性化操作 108
3.1.4 字符串的個性化操作 111
3.1.5 字符串編碼與解碼 114
3.1.6 字符串格式化與format()方法 116
3.1.7 正則表達式 119
練習3.1 125
3.2 無序容器 129
3.2.1 字典 129
3.2.2 集合 132
練習3.2 135
3.3 迭代器、生成器與推導表達式 138
3.3.1 迭代器 138
3.3.2 生成器 139
3.3.3 推導表達式 144
練習3.3 147
第4單元 面向類的程序設計 150
4.1 類及其組成 150
4.1.1 類模型及其語法 150
4.1.2 類對象、實例對象與__init__ ()方法 152
4.1.3 最小特權原則與對象成員訪問限制 155
4.1.4 實例方法、靜態方法與類方法 158
練習4.1 159
4.2 Python內置的類屬性、方法與函數 161
4.2.1 內置的類屬性 161
4.2.2 獲取類與對象特征的內置函數 162
4.2.3 操作符重載 166
4.2.4 可定制的內置方法 168
練習4.2 176
4.3 類的繼承 178
4.3.1 類的繼承及其關系測試 178
4.3.2 新式類與object 180
4.3.3 子類訪問父類成員的規則 182
4.3.4 子類實例的初始化與super 182
練習4.3 187
第5單元 Python數據處理 190
5.1 Python文件操作 190
5.1.1 文件對象及其操作過程 190
5.1.2 文件打開函數open() 192
5.1.3 文件屬性與方法 195
5.1.4 文件可靠關閉與上下文處理器 196
5.1.5 二進制文件的序列化讀寫 197
5.1.6 文件指針位置獲取與移動 200
練習5.1 200
5.2 Python數據庫操作 203
5.2.1 數據庫與SQL 203
5.2.2 用pyodbc訪問數據庫 207
5.2.3 SQLite3數據庫 213
練習5.2 215
5.3 文件與目錄管理 216
5.3.1 文件和目錄管理(os模塊和os.path模塊) 217
5.3.2 文件壓縮(zipfile模塊) 219
5.3.3 文件復制(shutil模塊) 221
練習5.3 221
第6單元 Python網絡編程 222
6.1 Python Socket編程 222
6.1.1 TCP/IP與Socket 222
6.1.2 socket模塊與socket對象 226
6.1.3 TCP的Python Socket編程 228
6.1.4 UDP的Python Socket編程 231
練習6.1 232
6.2 Python WWW應用開發 235
6.2.1 WWW及其關鍵技術 235
6.2.2 urllib模塊庫 241
6.2.3 urllib.parse模塊與URL解析 242
6.2.4 urllib.request模塊與網頁抓取 244
6.2.5 網頁提交表單 247
6.2.6 urllib.error模塊與異常處理 248
6.2.7 webbrowser模塊 249
練習6.2 250
第7單元 Python GUI開發 252
7.1 GUI三要素:組件、布局與事件處理 252
7.1.1 組件與tkinter 252
7.1.2 布局與布局管理器 256
7.1.3 事件綁定與事件處理 259
練習7.1 263
7.2 GUI程序結構 265
7.2.1 基于tkinter的GUI開發環節 265
7.2.2 面向對象的GUI程序框架 268
練習7.2 270
7.3 GUI制作示例 270
7.3.1 Label與Button 270
7.3.2 Entry與Message 276
7.3.3 Text與滾動條 280
7.3.4 選擇框 287
7.3.5 菜單 293
練習7.3 296
附錄A Python運算符 297
附錄B Python內置函數 301
附錄C Python標準模塊庫目錄 307
附錄D Python 3.0標準異常類結構(PEP 348) 316
參考文獻 318
·V·