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