版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
第1章Python基礎(chǔ)知識(shí)第1章Python基礎(chǔ)知識(shí)第2章序列應(yīng)用——猜單詞游戲x第3章面向?qū)ο蟪绦蛟O(shè)計(jì)——發(fā)牌游戲第4章Tkinter圖形界面設(shè)計(jì)——猜數(shù)字游戲第5章Tkinter圖形界面設(shè)計(jì)——圖形版發(fā)牌程序第6章數(shù)據(jù)庫(kù)應(yīng)用——智力問(wèn)答測(cè)試x第7章網(wǎng)絡(luò)編程和多線(xiàn)程——網(wǎng)絡(luò)5子棋第8章智力問(wèn)答——人物拼圖游戲第9章游戲?qū)崙?zhàn)篇——人機(jī)對(duì)戰(zhàn)井字棋游戲第10章連連看游戲第11章推箱子游戲第12章兩人麻將游戲第13章貪吃蛇游戲第14章人機(jī)對(duì)戰(zhàn)黑白棋游戲第15章掃雷游戲第16章中國(guó)象棋第17章21點(diǎn)撲克牌游戲第18章華容道游戲第19章基于Pygame游戲設(shè)計(jì)第20章2048游戲1.1Python語(yǔ)言簡(jiǎn)介Python是一種面向?qū)ο?、解釋型?jì)算機(jī)程序設(shè)計(jì)語(yǔ)言,由荷蘭人GuidovanRossum
于1989年底發(fā)明,第一個(gè)公開(kāi)發(fā)行版發(fā)行于1991年,Python源代碼同樣遵循GPL(GNUGeneralPublicLicense)協(xié)議。Python語(yǔ)法簡(jiǎn)潔而清晰,具有豐富和強(qiáng)大的類(lèi)庫(kù)。它常被昵稱(chēng)為膠水語(yǔ)言,能夠把用其他語(yǔ)言制作的各種模塊(尤其是C/C++)很輕松地聯(lián)結(jié)在一起。正因?yàn)镻ython語(yǔ)言的簡(jiǎn)潔、優(yōu)雅、開(kāi)發(fā)效率高,它常被用于網(wǎng)站開(kāi)發(fā),網(wǎng)絡(luò)編程,圖形處理,黑客編程等等。Python由荷蘭的GuidovanRossum設(shè)計(jì)。Python第一個(gè)版本于1991年初公開(kāi)發(fā)行。。Python2.0于2000年10月發(fā)布,增加了許多新的語(yǔ)言特性。Python3.0于2008年12月發(fā)布,此版本不完全兼容Python2.0,導(dǎo)致Python2.0與Python3.0不兼容。Python3.5在2015年9月發(fā)布Python3.6正式版在2016年12月發(fā)布,主要的新特性包括:async和await關(guān)鍵字可用于生成器和推導(dǎo);改善CPython實(shí)現(xiàn),在不破壞兼容性的情況下降低內(nèi)存占用和提高速度;可插拔支持JIT、跟蹤器和調(diào)試器;引入新的字符串和數(shù)字格式,為變量加入類(lèi)型注釋?zhuān)?jiǎn)化定制子類(lèi)創(chuàng)建的方法,等等。Python語(yǔ)言的發(fā)展歷史TIOBE2016年8月編程語(yǔ)言排行榜是一種面向?qū)ο?、解釋型?jì)算機(jī)程序設(shè)計(jì)語(yǔ)言純粹的自由軟件Python語(yǔ)法簡(jiǎn)潔清晰,用空格(space)作為語(yǔ)句縮進(jìn)Python具有豐富和強(qiáng)大的庫(kù)。它常被昵稱(chēng)為膠水語(yǔ)言,能夠把用其他語(yǔ)言制作的各種模塊(尤其是C/C++)很輕松地聯(lián)結(jié)在一起。Python快速生成程序的原型封裝Python可以調(diào)用的擴(kuò)展類(lèi)庫(kù)跨平臺(tái),程序無(wú)需修改在Windows、Linux、Unix、Mac等操作系統(tǒng)上使用Web開(kāi)發(fā),基于python的優(yōu)秀web框架如Django網(wǎng)絡(luò)編程,網(wǎng)頁(yè)解析,如爬蟲(chóng)程序開(kāi)發(fā)科學(xué)計(jì)算,各種實(shí)驗(yàn)數(shù)據(jù)的處理以及相關(guān)實(shí)驗(yàn)?zāi)M等,機(jī)器學(xué)習(xí)等數(shù)據(jù)庫(kù)應(yīng)用多媒體開(kāi)發(fā)電子游戲開(kāi)發(fā)需要什么應(yīng)用就能找到什么庫(kù)應(yīng)用領(lǐng)域2.1Python數(shù)據(jù)類(lèi)型2.1.1數(shù)值類(lèi)型Python數(shù)值類(lèi)型用于存儲(chǔ)數(shù)值。整型(int):通常被稱(chēng)為是整型或整數(shù),是正或負(fù)整數(shù),不帶小數(shù)點(diǎn)。長(zhǎng)整型(long):無(wú)限大小的整數(shù),整數(shù)最后是一個(gè)大寫(xiě)或小寫(xiě)的L。在Python3里,只有一種整數(shù)類(lèi)型
int,沒(méi)有Python2中的Long。浮點(diǎn)型(float):浮點(diǎn)型由整數(shù)部分與小數(shù)部分組成,浮點(diǎn)型也可以使用科學(xué)計(jì)數(shù)法表示(2.78e2就是2.78x102=278)復(fù)數(shù)(complex):復(fù)數(shù)由實(shí)數(shù)部分和虛數(shù)部分構(gòu)成,可以用a+bj,或者complex(a,b)表示,復(fù)數(shù)的虛部以字母j或J結(jié)尾。如:2+3j。7Python使用單引號(hào)和雙引號(hào)來(lái)表示字符串是一樣的。1.創(chuàng)建和訪(fǎng)問(wèn)字符串創(chuàng)建字符串很簡(jiǎn)單,只要為變量分配一個(gè)值即可。例如:var1='HelloWorld!'var2="PythonProgramming"2.Python轉(zhuǎn)義字符需要在字符中使用特殊字符時(shí),Python用反斜杠(\)轉(zhuǎn)義字符2.1.2字符串83.Python字符串運(yùn)算符Python字符串運(yùn)算符如表2-2所示。a='Hello'b='Python'2.1.2字符串94.字符串格式化Python支持格式化字符串的輸出。盡管這樣可能會(huì)用到非常復(fù)雜的表達(dá)式,但最基本的用法是將一個(gè)值插入到有字符串格式符的模板中。在Python中,字符串格式化使用與C語(yǔ)言中printf函數(shù)一樣的語(yǔ)法。print("我的名字是%s年齡是%d"%('xmj',41))Python用一個(gè)元祖將多個(gè)值傳遞給模板,每個(gè)值對(duì)應(yīng)一個(gè)字符串格式符。上例將'xmj'插入到%s處,41插入到%d處。所以輸出結(jié)果:我的名字是xmj年齡是412.1.2字符串104.字符串格式化2.1.2字符串112.1.3布爾類(lèi)型Python支持布爾類(lèi)型的數(shù)據(jù),布爾類(lèi)型只有True和False兩種值。and與運(yùn)算:只有兩個(gè)布爾值都為T(mén)rue時(shí),計(jì)算結(jié)果才為T(mén)rue。or或運(yùn)算:只要有一個(gè)布爾值為T(mén)rue,計(jì)算結(jié)果就是True。not非運(yùn)算:把True變?yōu)镕alse,或者把False變?yōu)門(mén)rue:在Python中,布爾類(lèi)型還可以與其他數(shù)據(jù)類(lèi)型做and、or和not運(yùn)算,這時(shí)下面的幾種情況會(huì)被認(rèn)為是FALSE:為0的數(shù)字,包括0,0.0;空字符串'',"";表示空值的None;空集合,包括空元祖(),空序列[],空字典{};其他的值都為T(mén)RUE。例如:a='python'print(aandTrue)#結(jié)果是Trueb=''print(borFalse)#結(jié)果是False12在Python中,邏輯值True和False作為數(shù)值,則分別是整型值1和0參與運(yùn)算。例如:>>>x=False>>>a=x+(5>4)#結(jié)果a是1>>>b=x+5#結(jié)果b是5132.1Python數(shù)據(jù)類(lèi)型2.1.4空值空值是Python里一個(gè)特殊的值,用None表示。它不支持任何運(yùn)算也沒(méi)有任何內(nèi)置函數(shù)方法。None和任何其他的數(shù)據(jù)類(lèi)型比較永遠(yuǎn)返回False。在Python中未指定返回值的函數(shù)會(huì)自動(dòng)返回None。2.1.5Python數(shù)字類(lèi)型轉(zhuǎn)換x=20
#八進(jìn)制為24y=345.6print(oct(x)) #打印結(jié)果是0o24print(int(y)) #打印結(jié)果是345print(float(x)) #打印結(jié)果是20.0print(chr(65)) #A的ASCII為65,打印結(jié)果是Aprint(ord('B')) #B的ASCII為66,打印結(jié)果是66142.2常量和變量2.2.1變量變量在程序中就是用一個(gè)變量名表示,變量名必須是大小寫(xiě)英文、數(shù)字和_的組合,且不能用數(shù)字開(kāi)頭,比如:在Python中,等號(hào)=是賦值語(yǔ)句,可以把任意數(shù)據(jù)類(lèi)型賦值給變量,同一個(gè)變量可以反復(fù)賦值,而且可以是不同類(lèi)型的變量,例如:a=123 #a是整數(shù)a='ABC' #a變?yōu)樽址@種變量本身類(lèi)型不固定的語(yǔ)言稱(chēng)之為動(dòng)態(tài)語(yǔ)言,與之對(duì)應(yīng)的是靜態(tài)語(yǔ)言。152.2.2常量所謂常量就是不能變的變量,比如常用的數(shù)學(xué)常數(shù)π就是一個(gè)常量。在Python中,通常用全部大寫(xiě)的變量名表示常量:PI=3事實(shí)上PI仍然是一個(gè)變量,Python根本沒(méi)有任何機(jī)制保證PI不會(huì)被改變,所以,用全部大寫(xiě)的變量名表示常量只是一個(gè)習(xí)慣上的用法,實(shí)際上是可以改變變量PI的值。162.3運(yùn)算符與表達(dá)式Python語(yǔ)言支持運(yùn)算符有以下幾種類(lèi)型。?算術(shù)運(yùn)算符?比較(即關(guān)系)運(yùn)算符?賦值運(yùn)算符?邏輯運(yùn)算符?位運(yùn)算符?成員操作符?標(biāo)識(shí)操作符172.3運(yùn)算符與表達(dá)式1.算術(shù)運(yùn)算符算術(shù)運(yùn)算符實(shí)現(xiàn)數(shù)學(xué)運(yùn)算,Python語(yǔ)言算術(shù)運(yùn)算符如表2-5所示。假設(shè)其中變量a=10和變量b=20。182.關(guān)系運(yùn)算符關(guān)系運(yùn)算符用于兩個(gè)值進(jìn)行比較,運(yùn)算結(jié)果為T(mén)rue(真)或False(假)。Python中的關(guān)系運(yùn)算符如表2-6所示。假設(shè)其中變量a=10和變量b=20。193.邏輯運(yùn)算符Python中提供了三種邏輯運(yùn)算符,它們是:and(邏輯與,二元運(yùn)算符)or(邏輯或,二元運(yùn)算符)not(邏輯非,一元運(yùn)算符)204.賦值運(yùn)算符賦值運(yùn)算符“=”的一般格式為:變量=表達(dá)式它表示將其右側(cè)的表達(dá)式求出結(jié)果,賦給其左側(cè)的變量。例如:
i=3*(4+5) #i的值變?yōu)?7215.位運(yùn)算符
位(bit)是計(jì)算機(jī)中表示信息的最小單位,位運(yùn)算符作用于位和位操作。Python中位運(yùn)算符如下:按位與(&)、按位或(|)、按位異或(^)、按位求反(~)、左移(<<)、右移(>>)。位運(yùn)算符是對(duì)其操作數(shù)按其二進(jìn)制形式逐位進(jìn)行運(yùn)算。a= 00111100b= 00001101a&b= 00001100a|b= 00111101a^b= 00110001~a= 11000011226.Python成員運(yùn)算Python成員運(yùn)算符判斷序列中是否有某個(gè)成員。成員運(yùn)算符如表2-9所示。237.Python標(biāo)識(shí)運(yùn)算符標(biāo)識(shí)符比較兩個(gè)對(duì)象的內(nèi)存位置。
248.Python運(yùn)算符優(yōu)先級(jí)在一個(gè)表達(dá)式中出現(xiàn)多種運(yùn)算時(shí),將按照預(yù)先確定的順序計(jì)算并解析各個(gè)部分,這個(gè)順序稱(chēng)為運(yùn)算符優(yōu)先級(jí)。252.3.2表達(dá)式表達(dá)式是一個(gè)或多個(gè)運(yùn)算的組合。Python語(yǔ)言的表達(dá)式與其他語(yǔ)言的表達(dá)式?jīng)]有顯著的區(qū)別。每個(gè)符合Python語(yǔ)言規(guī)則的表達(dá)式的計(jì)算都是一個(gè)確定的值。對(duì)于常量、變量的運(yùn)算和對(duì)于函數(shù)的調(diào)用都可以構(gòu)成表達(dá)式。在后續(xù)章節(jié)中介紹的序列、函數(shù)、對(duì)象都可以成為表達(dá)式一部分。262.3序列數(shù)據(jù)結(jié)構(gòu)序列是Python中最基本的數(shù)據(jù)結(jié)構(gòu)。序列中的每個(gè)元素都分配一個(gè)數(shù)字即它的位置或索引,第一個(gè)索引是0,第二個(gè)索引是1,依此類(lèi)推。序列都可以進(jìn)行的操作包括索引,截取(切片),加,乘,成員檢查。此外,Python已經(jīng)內(nèi)置確定序列的長(zhǎng)度以及確定最大和最小的元素的方法。Python內(nèi)置序列類(lèi)型最常見(jiàn)的是列表、元組、字典和集合。列表、元組和字符串是有順序的數(shù)據(jù)元素的集合體;字典和集合屬于無(wú)順序的數(shù)據(jù)集合體,不能通過(guò)位置編號(hào)來(lái)訪(fǎng)問(wèn)數(shù)據(jù)元素。272.3.1列表列表(list)是最常用的Python數(shù)據(jù)類(lèi)型,列表的數(shù)據(jù)項(xiàng)不需要具有相同的類(lèi)型。列表類(lèi)似其他語(yǔ)言的數(shù)組,但功能比數(shù)組強(qiáng)大的多。創(chuàng)建一個(gè)列表,只要把逗號(hào)分隔的不同的數(shù)據(jù)項(xiàng)使用方括號(hào)括起來(lái)即可。實(shí)例如下:list1=['中國(guó)','美國(guó)',1997,2000];list2=[1,2,3,4,5];列表索引從0開(kāi)始。列表可以進(jìn)行截?。ㄇ衅?、組合等。282.3.1列表1.訪(fǎng)問(wèn)列表中的值list1=['中國(guó)','美國(guó)',1997,2000];list2=[1,2,3,4,5,6,7];print("list1[0]:",list1[0])print("list2[1:5]:",list2[1:5])292.3.1列表2.更新列表可以對(duì)列表的數(shù)據(jù)項(xiàng)進(jìn)行修改或更新,實(shí)例如下:list=['中國(guó)','chemistry',1997,2000];print("Valueavailableatindex2:")print(list[2])list[2]=2001;print("Newvalueavailableatindex2:")print(list[2])3.刪除列表元素方法一:使用del語(yǔ)句來(lái)刪除列表的的元素方法二:使用remove()方法來(lái)刪除列表的元素方法三:使用pop()方法方法來(lái)刪除列表的指定位置的元素,無(wú)參數(shù)時(shí)刪除最后一個(gè)元素302.3.1列表4.添加列表元素可以使用append()方法在列表末尾添加元素,如下實(shí)例:list1=['中國(guó)','美國(guó)',1997,2000]list1.append(2003)print(list1)以上實(shí)例輸出結(jié)果:['中國(guó)','美國(guó)',1997,2000,2003]312.3.1列表5.定義多維列表可以將多維列表視為列表的嵌套,即多維列表的元素值也是一個(gè)列表,只是維度比父列表小一。例如:定義1個(gè)二維列表。list2=[["CPU","內(nèi)存"],["硬盤(pán)","聲卡"]]二維列表比一維列表多一個(gè)索引,可以如下獲取元素:列表名[索引1][索引2]例如:定義3行6列的二維列表,打印出元素值。32rows=3cols=6matrix=[[0forcolinrange(cols)]forrowinrange(rows)]#列表生成式foriinrange(rows):forjinrange(cols):matrix[i][j]=i*3+jprint(matrix[i][j],end=",")print('\n')>>>print[x*xforxinrange(1,11)][1,4,9,16,25,36,49,64,81,100]33Python列表內(nèi)置函數(shù)和方法342.3.2元祖Python的元組(tuple)與列表類(lèi)似,不同之處在于元組的元素不能修改。元組使用小括號(hào)(),列表使用方括號(hào)[]。元組中的元素類(lèi)型也可以不相同。1.創(chuàng)建元組tup1=('中國(guó)','美國(guó)',1997,2000)tup2=(1,2,3,4,5)tup3="a","b","c","d"2.訪(fǎng)問(wèn)元組tup1=('中國(guó)','美國(guó)',1997,2000)tup2=(1,2,3,4,5,6,7)print("tup1[0]:",tup1[0])#輸出元組的第一個(gè)元素print("tup2[1:5]:",tup2[1:5])#切片,輸出從第二個(gè)元素開(kāi)始到第五個(gè)元素print(tup2[2:])353.元組連接元組中的元素值是不允許修改的,但可以對(duì)元組進(jìn)行連接組合,實(shí)例如下:tup1=(12,34,56)tup2=(78,90)#tup1[0]=100 #修改元組元素操作是非法的。tup3=tup1+tup2 #連接元組,創(chuàng)建一個(gè)新的元組print(tup3)以上實(shí)例輸出結(jié)果:(12,34,56,78,90)4.刪除元組元組中的元素值是不允許刪除的,但可以使用del語(yǔ)句來(lái)刪除整個(gè)元組。36元組與列表轉(zhuǎn)換可以使用下面方法將元祖轉(zhuǎn)換為列表:列表對(duì)象=list(元組對(duì)象)tup=(1,2,3,4,5)list1=list(tup) #元組轉(zhuǎn)為列表print(list1) #返回[1,2,3,4,5]可以使用下面方法將列表轉(zhuǎn)換為元祖:元組對(duì)象=tuple(列表對(duì)象)nums=[1,3,5,7,8,13,20]print(tuple(nums)) #列表轉(zhuǎn)為元組,返回(1,3,5,7,8,13,20)372.3.3字典Python字典(dict)是一種可變?nèi)萜髂P?,且可存?chǔ)任意類(lèi)型對(duì)象,如字符串、數(shù)字、元組等其他容器模型。字典也被稱(chēng)作關(guān)聯(lián)數(shù)組或哈希表。1.創(chuàng)建字典一個(gè)簡(jiǎn)單的字典實(shí)例:dict={'xmj':40,'zhang':91,'wang':80}也可如此創(chuàng)建字典:dict1={'abc':456};dict2={'abc':123,98.6:37};382.訪(fǎng)問(wèn)字典里的值訪(fǎng)問(wèn)字典里的值時(shí)把相應(yīng)的鍵放入方括號(hào)里,如下實(shí)例:dict={'Name':'王海','Age':17,'Class':'計(jì)算機(jī)一班'}print("dict['Name']:",dict['Name'])print("dict['Age']:",dict['Age'])3.修改字典dict={'Name':'王海','Age':17,'Class':'計(jì)算機(jī)一班'}dict['Age']=18 #更新鍵/值對(duì)(updateexistingentry)dict['School']="中原工學(xué)院" #增加新的鍵/值對(duì)(addnewentry)print("dict['Age']:",dict['Age'])print("dict['School']:",dict['School'];392.3.4集合集合(set)是一個(gè)無(wú)序不重復(fù)元素的序列。集合基本功能是進(jìn)行成員關(guān)系測(cè)試和刪除重復(fù)元素。1.創(chuàng)建集合可以使用大括號(hào)({})或者set()函數(shù)創(chuàng)建集合,注意:創(chuàng)建一個(gè)空集合必須用set()而不是{},因?yàn)閧}是用來(lái)創(chuàng)建一個(gè)空字典。student={'Tom','Jim','Mary','Tom','Jack','Rose'}print(student)#輸出集合,重復(fù)的元素被自動(dòng)去掉40集合運(yùn)算可以使用“-”、“|”、“&”運(yùn)算符進(jìn)行集合的差集、并集、交集運(yùn)算。#set可以進(jìn)行集合運(yùn)算a=set('abcd')#a={'a','b','c','d'}b=set('cdef')print(a)print("a和b的差集:",a-b)#a和b的差集print("a和b的并集:",a|b)#a和b的并集print("a和b的交集:",a&b)#a和b的交集print("a和b中不同時(shí)存在的元素:",a^b)#a和b中不同時(shí)存在的元素413.1選擇結(jié)構(gòu)三種基本程序結(jié)構(gòu)中的選擇結(jié)構(gòu),可用if語(yǔ)句、if…else語(yǔ)句和if…elif…else語(yǔ)句實(shí)現(xiàn)。if語(yǔ)句的語(yǔ)法形式如下所示:if表達(dá)式:
語(yǔ)句1#比較輸入的整數(shù)是否大于6a=input("請(qǐng)輸入一個(gè)整數(shù):")#取得一個(gè)字符串a(chǎn)=int(a)#將字符串轉(zhuǎn)換為整數(shù)ifa>6:print(a,"大于6")if…else語(yǔ)句的語(yǔ)法形式如下所示:if表達(dá)式:
語(yǔ)句1else:
語(yǔ)句23.1.2if…else語(yǔ)句a=input("請(qǐng)輸入一個(gè)整數(shù):")#取得一個(gè)字符串a(chǎn)=int(a)#將字符串轉(zhuǎn)換為整數(shù)ifa>6:print(a,"大于6")else
:print(a,"小于等于6")if表達(dá)式1:
語(yǔ)句1elif表達(dá)式2:
語(yǔ)句2
……elif表達(dá)式n:
語(yǔ)句nelse:
語(yǔ)句n+13.1.3if…elif…else語(yǔ)句3.2.1while語(yǔ)句while判斷條件:
執(zhí)行語(yǔ)句3.2循環(huán)結(jié)構(gòu)count=0whilecount<9:print('Thecountis:',count)count=count+1print("Goodbye!")3.2.2for語(yǔ)句for語(yǔ)句可以遍歷任何序列的項(xiàng)目,如一個(gè)列表、元祖或者一個(gè)字符串。1.for循環(huán)的語(yǔ)法for循環(huán)的語(yǔ)法格式如下:for循環(huán)索引值in序列
循環(huán)體for循環(huán)把字符串中字符遍歷出來(lái)。forletterin'Python':#第一個(gè)實(shí)例print('當(dāng)前字母:',letter)for循環(huán)把列表中元素遍歷出來(lái)。fruits=['banana','apple','mango']forfruitinfruits:#第二個(gè)實(shí)例print('元素:',fruit)print("Goodbye!")3.2.2for語(yǔ)句2.通過(guò)索引循環(huán)對(duì)于一個(gè)列表,另外一種執(zhí)行循環(huán)的遍歷方式是通過(guò)索引(元素下標(biāo))。實(shí)例如下:fruits=['banana','apple','mango']foriinrange(len(fruits)):print('當(dāng)前水果:',fruits[i])print("Goodbye!")3.2.3continue和break語(yǔ)句break語(yǔ)句在while循環(huán)和for循環(huán)中都可以使用,一般放在if選擇結(jié)構(gòu)中,一旦break語(yǔ)句被執(zhí)行,將使得整個(gè)循環(huán)提前結(jié)束。continue語(yǔ)句的作用是終止當(dāng)前循環(huán),并忽略continue之后的語(yǔ)句,然后回到循環(huán)的頂端,提前進(jìn)入下一次循環(huán)。3.2.4循環(huán)嵌套Python語(yǔ)言允許在一個(gè)循環(huán)體里面嵌入另一個(gè)循環(huán)。如在while循環(huán)中可以嵌入for循環(huán);也可以在for循環(huán)中嵌入while循環(huán)。嵌套層次一般不超過(guò)3層,以保證可讀性。【例3-6】打印九九乘法表?!纠?-7】使用嵌套循環(huán)輸出2~100之間的素?cái)?shù)。4.1函數(shù)的定義和使用在Python程序開(kāi)發(fā)過(guò)程中,將完成某一特定功能并經(jīng)常使用的代碼編寫(xiě)成函數(shù),放在函數(shù)庫(kù)(模塊)中供大家選用,在需要使用時(shí)直接調(diào)用,這就是程序中的函數(shù)。def函數(shù)名(函數(shù)參數(shù)):
函數(shù)體return表達(dá)式或者值def
printHello(): #打印'hello'字符串print('hello')
def
printNum(): #輸出0--9數(shù)字foriinrange(0,10):print(i)return
defadd(a,b): #實(shí)現(xiàn)兩個(gè)數(shù)的和returna+bdefadd(a,b):returna+bprint(add(1,2))【例4-1】編寫(xiě)函數(shù)實(shí)現(xiàn)最大公約數(shù)算法,通過(guò)函數(shù)調(diào)用代碼實(shí)現(xiàn)求最大公約數(shù)。4.1.2函數(shù)的使用lambda表達(dá)式可以用來(lái)聲明匿名函數(shù),即沒(méi)有函數(shù)名字的臨時(shí)使用的小函數(shù),只可以包含一個(gè)表達(dá)式,且該表達(dá)式的計(jì)算結(jié)果為函數(shù)的返回值,不允許包含其他復(fù)雜的語(yǔ)句,但在表達(dá)式中可以調(diào)用其他函數(shù)。例如:f=lambdax,y,z:x+y+zprint(f(1,2,3))等價(jià)于定義:deff(x,y,z):returnx+y+zprint(f(1,2,3))函數(shù)使用return返回值,也可以將Lambda表達(dá)式作為函數(shù)的返回值。最后需要補(bǔ)充一點(diǎn):Python中函數(shù)是可以返回多個(gè)值的,如果返回多個(gè)值,會(huì)將多個(gè)值放在一個(gè)元組或者其他類(lèi)型的集合中來(lái)返回。4.1.3lambda表達(dá)式deff(x,y,z):returnx+y+zprint(f(1,2,3))函數(shù)使用return返回值,也可以將Lambda表達(dá)式作為函數(shù)的返回值。最后需要補(bǔ)充一點(diǎn):Python中函數(shù)是可以返回多個(gè)值的,如果返回多個(gè)值,會(huì)將多個(gè)值放在一個(gè)元組或者其他類(lèi)型的集合中來(lái)返回。4.1.4函數(shù)的返回值defdemo(s):result=[0,0]forchins:if'a'<=ch<='z':result[1]+=1
elif'A'<=ch<='Z':result[0]+=1returnresult #返回列表print(demo('aaaabbbbC'))4.2.1函數(shù)形參和實(shí)參的區(qū)別形參全稱(chēng)是形式參數(shù),在用def關(guān)鍵字定義函數(shù)時(shí)函數(shù)名后面括號(hào)里的變量稱(chēng)作為形式參數(shù)。實(shí)參全稱(chēng)為實(shí)際參數(shù),在調(diào)用函數(shù)時(shí)提供的值或者變量稱(chēng)作為實(shí)際參數(shù)。例如:#這里的a和b就是形參defadd(a,b):returna+b#下面是調(diào)用函數(shù)add(1,2) #這里的1和2是實(shí)參4.2函數(shù)參數(shù)在Python中參數(shù)傳遞采用的是值傳遞,這個(gè)和C語(yǔ)言有點(diǎn)類(lèi)似。對(duì)于絕大多數(shù)情況下,在函數(shù)內(nèi)部直接修改形參的值不會(huì)影響實(shí)參。4.2.2參數(shù)的傳遞def
addOne(a):a+=1print(a) #輸出4a=3addOne(a)print(a) #輸出3在有些情況下,可以通過(guò)特殊的方式在函數(shù)內(nèi)部修改實(shí)參的值。4.2.2參數(shù)的傳遞defmodify1(m,K):m=2K=[4,5,6]returndefmodify2(m,K):m=2K[0]=0#同時(shí)修改了實(shí)參的內(nèi)容return#主程序n=100L=[1,2,3]modify1(n,L)print(n,L)modify2(n,L)4.2.3函數(shù)參數(shù)的類(lèi)型在Python中函數(shù)參數(shù)定義和傳遞的方式相比而言就靈活多。1.默認(rèn)值參數(shù)在于它能夠給函數(shù)參數(shù)提供默認(rèn)值。def
display(a='hello',b=‘red'):print(a+b)#主程序display()display(b='world')display(a=‘china')display('world')4.2.3函數(shù)參數(shù)的類(lèi)型2.關(guān)鍵字參數(shù)避免了用戶(hù)需要牢記位置參數(shù)順序的麻煩。defdisplay(a,b):print(a)print(b)下面2句達(dá)到的效果是相同的。display(a='world',b='hello')display(b='hello',a='world')4.2.3函數(shù)參數(shù)的類(lèi)型3.任意個(gè)數(shù)參數(shù)一般情況下我們?cè)诙x函數(shù)時(shí),函數(shù)參數(shù)的個(gè)數(shù)是確定的,然而某些情況下我們是不能確定參數(shù)的個(gè)數(shù)的,比如要存儲(chǔ)某個(gè)人的名字和它的小名,某些人小名可能有2個(gè)或者更多個(gè),此時(shí)無(wú)法確定參數(shù)的個(gè)數(shù),只需在參數(shù)前面加上'*'或者'**'。def
storename(name,*nickName):print('realnameis%s'%name)fornicknameinnickName:print('小名',nickname)#主程序storename('張海')storename('張海','小海')storename('張海','小海','小豆豆')'*'和'**'表示能夠接受0到任意多個(gè)參數(shù),'*'表示將沒(méi)有匹配的值都放在同一個(gè)元組中,'**'表示將沒(méi)有匹配的值都放在一個(gè)字典中。4.2.4變量的作用域1.局部變量在函數(shù)內(nèi)定義的變量只在該函數(shù)內(nèi)起作用,稱(chēng)為局部變量。deffun():x=3count=2whilecount>0:print(x)count=count-1fun()print(x) #錯(cuò)誤4.2.4變量的作用域2.全局變量還有一種變量叫做全局變量,它是在函數(shù)外部定義的,作用域是整個(gè)程序。全局變量可以直接在函數(shù)里面使用,但是如果要在函數(shù)內(nèi)部改變?nèi)肿兞恐担仨毷褂胓lobal關(guān)鍵字進(jìn)行聲明。x=2 #全局變量deffun1():print(x,end="")deffun2():globalx #在函數(shù)內(nèi)部改變?nèi)肿兞恐当仨毷褂胓lobal關(guān)鍵字
x=x+1print(x,end="")fun1()fun2()print(x,end="")4.3閉包和函數(shù)的遞歸調(diào)用4.3.1閉包(closure)在Python中,閉包指函數(shù)的嵌套??梢栽诤瘮?shù)內(nèi)部定義一個(gè)嵌套函數(shù)。def
func_lib():
defadd(x,y):returnx+yreturnadd#返回函數(shù)對(duì)象
fadd=func_lib()print(fadd(1,2))4.3.2函數(shù)的遞歸調(diào)用1.遞歸調(diào)用函數(shù)在執(zhí)行的過(guò)程中直接或間接調(diào)用自己本身,稱(chēng)為遞歸調(diào)用。Python語(yǔ)言允許遞歸調(diào)用。deff(x):ifx==1: #遞歸調(diào)用結(jié)束的條件
return1else:return(f(x-1)+x*x) #調(diào)用f()函數(shù)本身print(f(5))4.3.2函數(shù)的遞歸調(diào)用2.遞歸調(diào)用的執(zhí)行過(guò)程遞歸調(diào)用的執(zhí)行過(guò)程分為遞推過(guò)程和回歸過(guò)程兩部分。4.4內(nèi)置函數(shù)內(nèi)置函數(shù)(built-infunctions)又稱(chēng)系統(tǒng)函數(shù),或內(nèi)建函數(shù),是指Python本身所提供的函數(shù),任何時(shí)候都可以使用。Python常用的內(nèi)置函數(shù)有數(shù)學(xué)運(yùn)算函數(shù)、類(lèi)型轉(zhuǎn)換函數(shù)和反射函數(shù)等。想要查所有內(nèi)置函數(shù)名可以在python命令行方式中如下輸入:>>>dir(__builtins__)
4.4內(nèi)置函數(shù)4.4內(nèi)置函數(shù)4.4內(nèi)置函數(shù)4.4內(nèi)置函數(shù)4.5模塊模塊(module)能夠有邏輯地組織你的Python代碼段。把相關(guān)的代碼分配到一個(gè)模塊里能讓代碼更好用,更易懂。簡(jiǎn)單地說(shuō),模塊就是一個(gè)保存了Python代碼的文件。模塊里能定義函數(shù),類(lèi)和變量。importmath#導(dǎo)入math模塊print("50的平方根:",math.sqrt(50))y=math.hex(50)print("50的16進(jìn)制:",y)4.5.1import導(dǎo)入模塊1.導(dǎo)入模塊方式在Python中用關(guān)鍵字import來(lái)導(dǎo)入某個(gè)模塊。方式如下:import模塊名 #導(dǎo)入模塊有時(shí)候我們只需要用到模塊中的某個(gè)函數(shù),只需要引入該函數(shù)即可,此時(shí)可以通過(guò)語(yǔ)句:from模塊名import函數(shù)名1,函數(shù)名2....通過(guò)這種方式引入的時(shí)候,調(diào)用函數(shù)時(shí)只能給出函數(shù)名,不能給出模塊名4.5.2定義自己的模塊在Python中,每個(gè)Python文件都可以作為一個(gè)模塊,模塊的名字就是文件的名字。比如有這樣一個(gè)文件fibo.py,在fibo.py中定義了3個(gè)函數(shù)add(),fib(),fib2():那么在其他文件(如test.py)中就可以如下使用:#test.pyimportfibo加上模塊名稱(chēng)來(lái)調(diào)用函數(shù):fibo.fib(1000)#結(jié)果是1123581321345589144233377610987fibo.fib2(100)#結(jié)果是[1,1,2,3,5,8,13,21,34,55,89]test.add(2,3)#結(jié)果是55.1文件簡(jiǎn)單地說(shuō),文件是由字節(jié)組成的信息,在邏輯上具有完整意義,通常在磁盤(pán)上永久保存。Windows系統(tǒng)的數(shù)據(jù)文件按照編碼方式分為兩大類(lèi),文本文件和二進(jìn)制文件。文本文件可以處理各種語(yǔ)言所需的字符,只包含基本文本字符,不包括諸如字體、字號(hào)、顏色等信息。它可以在文本編輯器和瀏覽器中顯示。即在任何情況下,文本文件都是可讀的。使用其它編碼方式的文件即二進(jìn)制文件,如Word文檔、PDF、圖像和可執(zhí)行程序等。在Python中對(duì)文件的操作通常按照以下三個(gè)步驟進(jìn)行:(1)使用open()函數(shù)打開(kāi)(或建立)文件,返回一個(gè)file對(duì)象。(2)使用file對(duì)象的讀/寫(xiě)方法對(duì)文件進(jìn)行讀/寫(xiě)的操作。其中,將數(shù)據(jù)從外存?zhèn)鬏數(shù)絻?nèi)存的過(guò)程稱(chēng)為讀操作,將數(shù)據(jù)從內(nèi)存?zhèn)鬏數(shù)酵獯娴倪^(guò)程稱(chēng)為寫(xiě)操作。(3)使用file對(duì)象的close()方法關(guān)閉文件。5.2文件的訪(fǎng)問(wèn)open()函數(shù)用來(lái)打開(kāi)文件。open()函數(shù)需要一個(gè)字符串路徑,表明希望打開(kāi)文件,并返回一個(gè)文件對(duì)象。語(yǔ)法如下:fileobj=open(filename[,mode[,buffering]])5.2.1打開(kāi)(建立)文件>>>helloFile=open("d:\\python\\hello.txt")我們可以調(diào)用文件file對(duì)象的多種方法讀取文件內(nèi)容。1.read()方法不設(shè)置參數(shù)的read()方法將整個(gè)文件的內(nèi)容讀取為一個(gè)字符串。5.2.2讀取文本文件helloFile=open("d:\\python\\hello.txt")fileContent=helloFile.read()helloFile.close()print(fileContent) 也可以設(shè)置最大讀入字符數(shù)來(lái)限制read()函數(shù)一次讀取大小。2.readline()方法readline()方法從文件中獲取一個(gè)字符串,每個(gè)字符串就是文件中的每一行。5.2.2讀取文本文件helloFile=open("d:\\python\\hello.txt")fileContent=""whileTrue:line=helloFile.readline()ifline=="":#或者ifnotlinebreak
fileContent+=linehelloFile.close()print(fileContent)
寫(xiě)文件與讀文件相似,都需要先創(chuàng)建文件對(duì)象連接。所不同的是,打開(kāi)文件時(shí)是以“寫(xiě)”模式或“添加”模式打開(kāi)。如果文件不存在,則創(chuàng)建該文件。與讀文件時(shí)不能添加或修改數(shù)據(jù)類(lèi)似,寫(xiě)文件時(shí)也不允許讀取數(shù)據(jù)?!皐”寫(xiě)模式打開(kāi)已有文件時(shí),會(huì)覆蓋文件原有內(nèi)容,從頭開(kāi)始,就像我們用一個(gè)新值覆寫(xiě)一個(gè)變量的值。1.write()方法write方法將字符串參數(shù)寫(xiě)入文件。5.2.3寫(xiě)文本文件helloFile=open("d:\\python\\hello.txt","a")helloFile.write("thirdline.")helloFile.close() 5.2.3寫(xiě)文本文件writelines()方法writelines()方法將字符串列表參數(shù)寫(xiě)入文件。
注意換行需要自己添加。b=["Firstline\n","Secondline\n","thirdline\n"]helloFile=open("d:\\python\\hello.txt","w")helloFile.writelines(b)helloFile.close()
5.2.4文件內(nèi)移動(dòng)無(wú)論讀或?qū)懳募?,Python都會(huì)跟蹤文件中的讀寫(xiě)位置。在默認(rèn)情況下,文件的讀/寫(xiě)都從文件的開(kāi)始位置進(jìn)行。Python提供了控制文件讀寫(xiě)起始位置的方法,使得我們可以改變文件讀/寫(xiě)操作發(fā)生的位置。tell()函數(shù)可以計(jì)算文件當(dāng)前位置和開(kāi)始位置之間的字節(jié)偏移量。5.2.4文件內(nèi)移動(dòng)>>>exampleFile=open("d:\\python\\example.txt","w")>>>exampleFile.write("0123456789")>>>exampleFile.close()>>>exampleFile=open("d:\\python\\example.txt")>>>exampleFile.read(2)'01'>>>exampleFile.read(2)'23'>>>exampleFile.tell()4>>>exampleFile.close()seek()函數(shù)將文件當(dāng)前指針由引用點(diǎn)移動(dòng)指定的字節(jié)數(shù)到指定的位置。
seek(offset[,whence])應(yīng)該牢記使用close方法關(guān)閉文件。5.2.5文件的關(guān)閉helloFile=open("d:\\python\\hello.txt","w")try:
helloFile.write("Hello,SunnyDay!")finally:
helloFile.close()也可以使用with語(yǔ)句自動(dòng)關(guān)閉文件:withopen("d:\\python\\hello.txt")ashelloFile: s=helloFile.read()print(s)5.3文件操作1.獲取路徑和文件名os.path.dirname(path):返回path參數(shù)中的路徑名稱(chēng)字符串。os.path.basename(path):返回path參數(shù)中的文件名。os.path.split(path):返回參數(shù)的路徑名稱(chēng)和文件名組成的字符串元組。2.檢查路徑有效性os.path.exists(path):判斷參數(shù)path的文件或文件夾是否存在。存在返回true,否則返回false。os.path.isfile(path):判斷參數(shù)path存在且是一個(gè)文件,則返回true,否則返回false。os.path.isdir(path):判斷參數(shù)path存在且是一個(gè)文件夾,則返回true,否則返回false。3.查看文件大小os.path模塊中的os.path.getsize()函數(shù)可以查看文件大小。5.3文件操作4.重命名文件os.rename()函數(shù)可以幫助我們重命名文件。os.rename("d:\\python\\hello.txt","d:\\python\\helloworld.txt")5.復(fù)制文件和文件夾shutil模塊中提供一些函數(shù),幫助我們復(fù)制、移動(dòng)、改名和刪除文件夾??梢詫?shí)現(xiàn)文件的備份。6.文件和文件夾的移動(dòng)和改名shutil.move(source,destination):shutil.move()函數(shù)與shutil.copy()函數(shù)用法相似,參數(shù)destination既可以是一個(gè)包含新文件名的路徑,也可以?xún)H包含文件夾。7.刪除文件和文件夾os模塊和shutil模塊都有函數(shù)可以刪除文件或文件夾。os.remove(path)/os.unlink(path):刪除參數(shù)path指定的文件。os.remove("e:\\python-backup\\data-backup.txt")os.path.exists("e:\\python-backup\\data-backup.txt")#False文件應(yīng)用案例——游戲地圖存儲(chǔ)第2章序列應(yīng)用——猜單詞游戲序列應(yīng)用——猜單詞游戲猜單詞游戲就是計(jì)算機(jī)隨機(jī)產(chǎn)生一個(gè)單詞,打亂字母順序,供玩家去猜。此游戲采用控制字符界面,運(yùn)行界面如圖2-1所示。程序設(shè)計(jì)的思路游戲中需要隨機(jī)產(chǎn)生單詞以及隨機(jī)數(shù)字,所以引入random模塊隨機(jī)數(shù)函數(shù),其中random.choice()可以從序列中隨機(jī)選取元素。#創(chuàng)建單詞序列元祖WORDS=("python","jumble","easy","difficult","answer","continue","phone","position","position","game")#從序列中隨機(jī)挑出一個(gè)單詞word=random.choice(WORDS)程序設(shè)計(jì)的思路word就是從單詞序列中隨機(jī)挑出一個(gè)單詞。游戲中隨機(jī)挑出一個(gè)單詞word后,如何把單詞word的字母順序打亂,方法是隨機(jī)從單詞字符串中選擇一個(gè)位置position,把position位置那個(gè)字母加入亂序后單詞jumble,同時(shí)將原單詞word中position位置那個(gè)字母刪去(通過(guò)連接position位置前字符串和其后字符串實(shí)現(xiàn))。通過(guò)多次循環(huán)就可以產(chǎn)生新的亂序后單詞jumble。關(guān)鍵技術(shù)——random模塊random.choicerandom.choice從序列中獲取一個(gè)隨機(jī)元素。random.shufflerandom.shuffle(x[,random]),用于將一個(gè)列表中的元素打亂。第3章
面向?qū)ο笤O(shè)計(jì)應(yīng)用——發(fā)牌游戲主講3.1發(fā)牌游戲功能介紹【案例】采用撲克牌類(lèi)設(shè)計(jì)撲克牌發(fā)牌程序。4名牌手打牌,電腦隨機(jī)將52張牌(不含大小鬼)發(fā)給4名打牌,在屏幕上顯示每位牌手的牌。程序的運(yùn)行效果如圖3-1所示。面向?qū)ο蟪绦蛟O(shè)計(jì)基礎(chǔ)現(xiàn)實(shí)生活中的每一個(gè)相對(duì)獨(dú)立的事物都可以看做一個(gè)對(duì)象,例如,一個(gè)人,一輛車(chē),一臺(tái)電腦等。對(duì)象是具有某些特性和功能的具體事物的抽象。每個(gè)對(duì)象都具有描述其特征的屬性及附屬于它的行為。面向?qū)ο蟪绦蛟O(shè)計(jì)是一種計(jì)算機(jī)編程架構(gòu),它具有以下3個(gè)基本特性。(1)封裝性(Encapsulation)(2)繼承性(Inheritance)(3)多態(tài)性(Polymorphism)Python完全采用了面向?qū)ο蟪绦蛟O(shè)計(jì)的思想,是真正面向?qū)ο蟮母呒?jí)動(dòng)態(tài)編程語(yǔ)言,完全支持面向?qū)ο蟮幕竟δ?,如封裝、繼承、多態(tài)以及對(duì)基類(lèi)方法的覆蓋或重寫(xiě)。但與其他面向?qū)ο蟪绦蛟O(shè)計(jì)語(yǔ)言不同的是,Python中對(duì)象的概念很廣泛,Python中的一切內(nèi)容都可以稱(chēng)為對(duì)象,而不一定必須是某個(gè)類(lèi)的實(shí)例。例如,字符串、列表、字典、元組等內(nèi)置數(shù)據(jù)類(lèi)型都具有和類(lèi)完全相似的語(yǔ)法和用法。創(chuàng)建類(lèi)時(shí)用變量形式表示的對(duì)象屬性稱(chēng)為數(shù)據(jù)成員或成員屬性,用函數(shù)形式表示的對(duì)象行為稱(chēng)為成員函數(shù)或成員方法,成員屬性和成員方法統(tǒng)稱(chēng)為類(lèi)的成員。類(lèi)和對(duì)象面向?qū)ο蟪绦蛟O(shè)計(jì)的一個(gè)關(guān)鍵性觀(guān)念是將數(shù)據(jù)以及對(duì)數(shù)據(jù)的操作封裝在一起,組成一個(gè)相互依存、不可分割的整體,即對(duì)象。對(duì)于相同類(lèi)型的對(duì)象進(jìn)行分類(lèi)、抽象后,得出共同的特征而形成了類(lèi),面向?qū)ο蟪绦蛟O(shè)計(jì)的關(guān)鍵就是如何合理地定義和組織這些類(lèi)以及類(lèi)之間的關(guān)系。3.2.1類(lèi)定義語(yǔ)法Python使用class關(guān)鍵字來(lái)定義類(lèi),class關(guān)鍵字之后是一個(gè)空格,然后是類(lèi)的名字,再然后是一個(gè)冒號(hào),最后換行并定義類(lèi)的內(nèi)部實(shí)現(xiàn)。類(lèi)名的首字母一般要大寫(xiě),當(dāng)然您也可以按照自己的習(xí)慣定義類(lèi)名,但是一般推薦參考慣例來(lái)命名,并在整個(gè)系統(tǒng)的設(shè)計(jì)和實(shí)現(xiàn)中保持風(fēng)格一致,這一點(diǎn)對(duì)于團(tuán)隊(duì)合作尤其重要。例如:classPerson:
num=0 #成員變量(屬性)
def
SayHello(self): #成員函數(shù)print("Hello!");classCar:
def
infor(self): print("Thisisacar")3.2.1類(lèi)定義語(yǔ)法定義了類(lèi)之后,可以用來(lái)實(shí)例化對(duì)象,并通過(guò)“對(duì)象名.成員”的方式來(lái)訪(fǎng)問(wèn)其中的數(shù)據(jù)成員或成員方法,例如下面的代碼:>>>car=Car()>>>r()Thisisacar在Python中,可以使用內(nèi)置方法isinstance()來(lái)測(cè)試一個(gè)對(duì)象是否為某個(gè)類(lèi)的實(shí)例,下面的代碼演示了isinstance()的用法。>>>isinstance(car,Car)True>>>isinstance(car,str)Falseself參數(shù)類(lèi)的所有實(shí)例方法都必須至少有一個(gè)名為“self”的參數(shù),并且必須是方法的第一個(gè)形參(如果有多個(gè)形參的話(huà)),“self”參數(shù)代表將來(lái)要?jiǎng)?chuàng)建的對(duì)象本身。在類(lèi)的實(shí)例方法中訪(fǎng)問(wèn)實(shí)例屬性時(shí)需要以“self”為前綴,但在外部通過(guò)對(duì)象名調(diào)用對(duì)象方法時(shí)并不需要傳遞這個(gè)參數(shù),如果在外部通過(guò)類(lèi)名調(diào)用對(duì)象方法則需要顯式為self參數(shù)傳值?!纠?-2】定義一個(gè)復(fù)數(shù)類(lèi)Complex,構(gòu)造函數(shù)完成對(duì)象變量初始化工作。classComplex:def__init__(self,realpart,imagpart):self.r=realpartself.i=imagpartx=Complex(3.0,-4.5)print(x.r,x.i)3.2.2構(gòu)造函數(shù)__init__Python中類(lèi)的析構(gòu)函數(shù)是__del__,用來(lái)釋放對(duì)象占用的資源,在Python收回對(duì)象空間之前自動(dòng)執(zhí)行。如果用戶(hù)未涉及析構(gòu)函數(shù),Python將提供一個(gè)默認(rèn)的析構(gòu)函數(shù)進(jìn)行必要的清理工作。3.2.3析構(gòu)函數(shù)classComplex:
def__init__(self,realpart,imagpart):
self.r=realpart
self.i=imagpart
def__del__(self):print("Complex不存在了")x=Complex(3.0,-4.5)print(x.r,x.i)print(x)delx #刪除x對(duì)象變量實(shí)例屬性屬于實(shí)例(對(duì)象)只能通過(guò)對(duì)象名訪(fǎng)問(wèn);類(lèi)屬性屬于類(lèi)可通過(guò)類(lèi)名訪(fǎng)問(wèn),也可以通過(guò)對(duì)象名訪(fǎng)問(wèn),為類(lèi)的所有實(shí)例共享。3.2.4實(shí)例屬性和類(lèi)屬性【例6-3】定義含有實(shí)例屬性(姓名name,年齡age)和類(lèi)屬性(人數(shù)num)的Person人員類(lèi)classPerson:
num=1 #類(lèi)屬性
def__init__(self,str,n): #構(gòu)造函數(shù) =str #實(shí)例屬性
self.age=n
def
SayHello(self): #成員函數(shù) print("Hello!")
def
PrintName(self): #成員函數(shù) print("姓名:",,"年齡:",self.age)
def
PrintNum(self): #成員函數(shù) print(Person.num) #由于是類(lèi)屬性,所以不寫(xiě)self.num#主程序P1=Person("",42)P2=Person("王琳",36)P1.PrintName()P2.PrintName()Python并沒(méi)有對(duì)私有成員提供嚴(yán)格的訪(fǎng)問(wèn)保護(hù)機(jī)制。在定義類(lèi)的屬性時(shí),如果屬性名以?xún)蓚€(gè)下劃線(xiàn)“__”開(kāi)頭則表示是私有屬性,否則是公有屬性。私有屬性在類(lèi)的外部不能直接訪(fǎng)問(wèn),需通過(guò)調(diào)用對(duì)象的公有成員方法來(lái)訪(fǎng)問(wèn),或者通過(guò)Python支持的特殊方式來(lái)訪(fǎng)問(wèn)。Python提供了訪(fǎng)問(wèn)私有屬性的特殊方式,可用于程序的測(cè)試和調(diào)試,對(duì)于成員方法也有同樣性質(zhì)。3.2.5私有成員與公有成員classCar:price=100000 #定義類(lèi)屬性
def__init__(self,c,w):
self.color=c #定義公有屬性colorself.__weight=w #定義私有屬性__weight#主程序car1=Car("Red",10.5)car2=Car("Blue",11.8)print(car1.color)print(car1._Car__weight)print(car1.__weight) #AttributeError
在類(lèi)中定義的方法可以粗略分為3大類(lèi):公有方法、私有方法、靜態(tài)方法。公有方法、私有方法都屬于對(duì)象,私有方法的名字以?xún)蓚€(gè)下劃線(xiàn)“__”開(kāi)始,每個(gè)對(duì)象都有自己的公有方法和私有方法,在這兩類(lèi)方法中可以訪(fǎng)問(wèn)屬于類(lèi)和對(duì)象的成員;公有方法通過(guò)對(duì)象名直接調(diào)用,私有方法不能通過(guò)對(duì)象名直接調(diào)用,只能在屬于對(duì)象的方法中通過(guò)“self”調(diào)用或在外部通過(guò)Python支持的特殊方式來(lái)調(diào)用。靜態(tài)方法可以通過(guò)類(lèi)名和對(duì)象名調(diào)用,但不能直接訪(fǎng)問(wèn)屬于對(duì)象的成員,只能訪(fǎng)問(wèn)屬于類(lèi)的成員
。
加粗3.2.6方法classPerson:num=0 類(lèi)屬性
def__init__(self,str,n,w): #構(gòu)造函數(shù)
=str #對(duì)象實(shí)例屬性(成員)
self.age=nself.__weight=w #定義私有屬性__weightPerson.num+=1def__outputWeight(self): #定義私有方法outputWeightprint("體重:",self.__weight) #訪(fǎng)問(wèn)私有屬性__weightdefPrintName(self): #定義公有方法(成員函數(shù))
print("姓名:",,"年齡:",self.age,end="")self.__outputWeight() #調(diào)用私有方法outputWeightdefPrintNum(self): #定義公有方法(成員函數(shù))
print(Person.num) #由于是類(lèi)屬性,所以不寫(xiě)self.num@staticmethoddefgetNum(): #定義靜態(tài)方法getNumreturnPerson.num#主程序P1=Person("",42,120)P2=Person("張海",39,80)#P1.outputWeight() #錯(cuò)誤'Person'objecthasnoattribute'outputWeight'P1.PrintName()P2.PrintName()Person.PrintName(P2)print("人數(shù):",Person.getNum())print("人數(shù):",P1.getNum())3.2.7類(lèi)的繼承
繼承用于指定一個(gè)類(lèi)將從其父類(lèi)獲取其大部分或全部功能。它是面向?qū)ο缶幊痰囊粋€(gè)特征。這是一個(gè)非常強(qiáng)大的功能,方便用戶(hù)對(duì)現(xiàn)有類(lèi)進(jìn)行幾個(gè)或多個(gè)修改來(lái)創(chuàng)建一個(gè)新的類(lèi)。新類(lèi)稱(chēng)為子類(lèi)或派生類(lèi),從其繼承屬性的主類(lèi)稱(chēng)為基類(lèi)或父類(lèi)。
子類(lèi)或派生類(lèi)繼承父類(lèi)的功能,向其添加新功能。它有助于代碼的可重用性。3.7類(lèi)的繼承類(lèi)的繼承class派生類(lèi)名(基類(lèi)名):
派生類(lèi)成員注意:基類(lèi)名寫(xiě)在括號(hào)里。classParent:#定義父類(lèi)
parentAttr=100
def__init__(self):print("調(diào)用父類(lèi)構(gòu)造函數(shù)")
def
parentMethod(self):print("調(diào)用父類(lèi)方法")
def
setAttr(self,attr):
Parent.parentAttr=attr
def
getAttr(self):print("父類(lèi)屬性:",Parent.parentAttr)
classChild(Parent):#定義子類(lèi)
def__init__(self):print("調(diào)用子類(lèi)構(gòu)造函數(shù)")
def
childMethod(self):print("調(diào)用子類(lèi)方法childmethod")在Python中繼承的一些特點(diǎn):(1)在繼承中基類(lèi)的構(gòu)造函數(shù)(__init__()方法)不會(huì)被自動(dòng)調(diào)用,它需要在其派生類(lèi)的構(gòu)造中親自專(zhuān)門(mén)調(diào)用。(2)如果需要在派生類(lèi)中調(diào)用基類(lèi)的方法時(shí),通過(guò)“基類(lèi)名.方法名(self)”的方式來(lái)實(shí)現(xiàn),需要加上基類(lèi)的類(lèi)名前綴。區(qū)別于在類(lèi)中調(diào)用普通函數(shù)時(shí)并不需要帶上self參數(shù)。也可以使用內(nèi)置函數(shù)super()實(shí)現(xiàn)這一目的。(3)Python總是首先查找對(duì)應(yīng)類(lèi)型的方法,如果它不能在派生類(lèi)中找到對(duì)應(yīng)的方法,它才開(kāi)始到基類(lèi)中逐個(gè)查找。(先在本類(lèi)中查找調(diào)用的方法,找不到才去基類(lèi)中找)。從盒子Box派生出彩色盒子ColorBox。classBox():def__init__(self,w,h):self.width=wself.height=hdefprintinfo(self):print(self.width,self.height)#子類(lèi)classColorBox(Box):def__init__(self,w,h,c):#self.width=w#self.height=tself.color=cBox.__init__(self,w,h)#必須寫(xiě)
defprintinfo(self):
Box.printinfo(self)print(self.color)#主程序c1=ColorBox(1,2,"red")c1.printinfo()3.2.7類(lèi)的繼承我們來(lái)看一個(gè)簡(jiǎn)單的python繼承示例,Animal是父類(lèi)或基類(lèi)Dog是Animal的子類(lèi)。在這里,在Animal類(lèi)中定義了eat()方法,Dog類(lèi)中定義了bark()方法。在這個(gè)例子中,我們創(chuàng)建Dog類(lèi)的實(shí)例,并且僅通過(guò)子類(lèi)的實(shí)例調(diào)用eat()和bark()方法。由于父屬性和行為自動(dòng)繼承到子對(duì)象,所以通過(guò)子實(shí)例也可以調(diào)用父類(lèi)和子類(lèi)的方法。classAnimal:
defeat(self):print'Eating...'classDog(Animal):
defbark(self):print'Barking...'d=Dog()d.eat()d.bark()執(zhí)行上面代碼,得到以下結(jié)果-Eating...Barking...3.2.7類(lèi)的繼承Python的類(lèi)可以繼承多個(gè)基類(lèi)。繼承的基類(lèi)列表跟在類(lèi)名之后。類(lèi)的多繼承語(yǔ)法:classSubClassName(ParentClass1[,ParentClass2,...]):
派生類(lèi)成員classA:#定義類(lèi)A.....
classB:#定義類(lèi)B.....
classC(A,B):#派生類(lèi)C繼承類(lèi)A和B.....方法重寫(xiě)重寫(xiě)必須出現(xiàn)在繼承中。它是指當(dāng)派生類(lèi)繼承了基類(lèi)的方法之后,如果基類(lèi)方法的功能不能滿(mǎn)足需求,需要對(duì)基類(lèi)中的某些方法進(jìn)行修改,可以在派生類(lèi)重寫(xiě)基類(lèi)的方法,這就是重寫(xiě)。方法重寫(xiě)classAnimal: #定義父類(lèi)
defrun(self):print('調(diào)用父類(lèi)方法')classCat(Animal): #定義子類(lèi)
defrun(self):print('調(diào)用子類(lèi)方法')classDog(Animal): #定義子類(lèi)
defrun(self):print('調(diào)用子類(lèi)方法')c=Dog() #子類(lèi)實(shí)例c.run() #子類(lèi)調(diào)用重寫(xiě)方法3.2.8多態(tài)多態(tài)的好處就是,當(dāng)我們需要傳入Dog、Cat、Tortoise……時(shí),我們只需要接收Animal類(lèi)型就可以了,因?yàn)镈og、Cat、Tortoise……都是Animal類(lèi)型,然后,按照Animal類(lèi)型進(jìn)行操作即可。由于Animal類(lèi)型有run()方法,因此,傳入的任意類(lèi)型,只要是Animal類(lèi)或者子類(lèi),就會(huì)自動(dòng)調(diào)用實(shí)際類(lèi)型的run()方法,這就是多態(tài)的意思。Animal類(lèi)Dog類(lèi)Cat類(lèi)Tortoise類(lèi)面向?qū)ο髴?yīng)用——撲克牌類(lèi)設(shè)計(jì)【案例】采用撲克牌類(lèi)設(shè)計(jì)撲克牌發(fā)牌程序。4名牌手打牌,電腦隨機(jī)將52張牌(不含大小鬼)發(fā)給4名打牌,在屏幕上顯示每位牌手的牌。程序的運(yùn)行效果如圖所示。第4章Tkinter圖形界面設(shè)計(jì)主講開(kāi)發(fā)猜數(shù)字游戲【案例】使用tkinter開(kāi)發(fā)猜數(shù)字游戲,運(yùn)行效果如圖所示。游戲中電腦隨機(jī)生成1024以?xún)?nèi)數(shù)字,玩家去猜,如果猜得數(shù)字過(guò)大過(guò)小都會(huì)提示,程序要統(tǒng)計(jì)玩家猜的次數(shù)。4.1Python圖形開(kāi)發(fā)庫(kù)Python提供了多個(gè)圖形開(kāi)發(fā)界面的庫(kù),幾個(gè)常用PythonGUI庫(kù)如下:(1)Tkinter
(2)wxPython:wxPython是一款開(kāi)源軟件,是Python語(yǔ)言的一套優(yōu)秀的GUI圖形庫(kù),允許Python程序員很方便的創(chuàng)建完整的、功能鍵全的GUI用戶(hù)界面。(3)Jython:Jython程序可以和Java無(wú)縫集成。除了一些標(biāo)準(zhǔn)模塊,Jython使用Java的模塊。Jython幾乎擁有標(biāo)準(zhǔn)的Python中不依賴(lài)于C語(yǔ)言的全部模塊。4.1.1創(chuàng)建Windows窗口【例4-1】Tkinter創(chuàng)建一個(gè)Windows窗口的GUI程序。importtkinter #導(dǎo)入Tkinter模塊win=tkinter.Tk() #創(chuàng)建Windows窗口對(duì)象win.title('我的第一個(gè)GUI程序') #設(shè)置窗口標(biāo)題win.mainloop() #進(jìn)入消息循環(huán),也就是顯示窗口4.1.2幾何布局管理器Tkinter幾何布局管理器用于組織和管理父組件(往往是窗口)中子組件的布局方式。tkinter提供了3種不同風(fēng)格的幾何布局管理類(lèi):pack、grid和place。1.pack幾何布局管理器4.1.2幾何布局管理器2.grid幾何布局管理器grid幾何布局管理采用表格結(jié)構(gòu)組織組件。4.1.2幾何布局管理器3.place幾何布局管理器place幾何布局管理允許指定組件的大小與位置。place的優(yōu)點(diǎn)是可以精確控制組件的位置,不足之處是改變窗口大小時(shí),子組件不能隨之靈活改變大小。4.2常用Tkinter組件的使用4.2.1Tkinter組件4.2.2標(biāo)準(zhǔn)屬性組件標(biāo)準(zhǔn)屬性也就是所有組件(控件)的共同屬性,如大小,字體和顏色等等。常用的標(biāo)準(zhǔn)屬性如表4-5所示。4.2.3Label標(biāo)簽組件Label組件用于在窗口中顯示文本或位圖。常用屬性如表4-6所示。4.2.4Button按鈕組件Button組件(控件)是一個(gè)標(biāo)準(zhǔn)的Tkinter部件,用于實(shí)現(xiàn)各種按鈕。按鈕可以包含文本或圖像,您可以通過(guò)command屬性將調(diào)用Python函數(shù)或方法關(guān)聯(lián)到按鈕上。Tkinter的按鈕被按下時(shí),會(huì)自動(dòng)調(diào)用該函數(shù)或方法。該按鈕可以只顯示一個(gè)單一字體的文本,但文本可能跨越多行。此外,一個(gè)字符可以有下劃線(xiàn),例如標(biāo)記的鍵盤(pán)快捷鍵。TkinterButton按鈕屬性和方法如表4-7和4-8所示。4.2.6列表框組件Listbox列表框組件Listbox用于顯示多個(gè)項(xiàng)目,并且允許
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- JJF 2182-2024農(nóng)灌機(jī)井取水量計(jì)量監(jiān)測(cè)方法
- JJF 2165-2024實(shí)驗(yàn)室振動(dòng)式液體密度儀校準(zhǔn)規(guī)范
- 2024年度網(wǎng)絡(luò)游戲虛擬物品交易合同
- 2024年度建筑工程施工承包合同標(biāo)的明細(xì)
- 2024城市地下綜合管廊建設(shè)項(xiàng)目融資合同
- 2024年度放心簽建材銷(xiāo)售合同模板
- 2024年工程質(zhì)量檢測(cè)與環(huán)保評(píng)估合同
- 2024年度廣告發(fā)布合同標(biāo)的廣告內(nèi)容與投放時(shí)間
- 2024小產(chǎn)權(quán)房買(mǎi)賣(mài)合同糾紛
- 地理教學(xué)課件教學(xué)課件
- 2024年入團(tuán)知識(shí)考試題庫(kù)及答案
- 腫瘤化療導(dǎo)致的中性粒細(xì)胞減少診治中國(guó)專(zhuān)家共識(shí)(2023版)解讀
- 《新能源汽車(chē)概論》課件-6新能源汽車(chē)空調(diào)系統(tǒng)結(jié)構(gòu)及工作原理
- 2024年共青團(tuán)入團(tuán)考試題庫(kù)(附答案)
- 田徑運(yùn)動(dòng)會(huì)各種記錄表格
- 產(chǎn)科新生兒疫苗接種課件
- 企業(yè)信息管理概述課件
- 室外健身器材投標(biāo)方案(技術(shù)方案)
- 足浴店店長(zhǎng)聘用合同范本
- tubeless胸科手術(shù)麻醉
- 電商免責(zé)聲明范本
評(píng)論
0/150
提交評(píng)論