既然Python是一門面向?qū)ο蟮木幊陶Z(yǔ)言,,那么今天我們著重講一下如何處理'對(duì)象' 一,、文件 之前接觸到的一系列數(shù)據(jù)值,都是在內(nèi)存中的,,也就是不會(huì)永久保存,。當(dāng)數(shù)據(jù)量非常小的時(shí)候,,當(dāng)然可以每次都臨時(shí)定義生成,但如果數(shù)據(jù)量稍大,,這樣處理就不合適了,。結(jié)合我們平時(shí)使用電腦的習(xí)慣,其實(shí)大部分?jǐn)?shù)據(jù)都是以“文件”式存在于硬盤里的,,比如.avi, .torrent,.exe, .txt等,。 1.open函數(shù) 利用python的內(nèi)置函數(shù)open()可以執(zhí)行打開(kāi)文件的操作,對(duì)于一些python的數(shù)據(jù)科學(xué)庫(kù)像numpy和panda有自己的文件讀取函數(shù),。下面我們通過(guò)一個(gè)簡(jiǎn)單的例子展示一下: open('hope.txt', 'r') open函數(shù)與我們之前介紹的print函數(shù)不同,,接受了兩個(gè)參數(shù),參數(shù)之間以逗號(hào)隔開(kāi),。
當(dāng)你運(yùn)行這段代碼將會(huì)得到 <_io.textiowrapper name='taijian.txt' mode='r' encoding='UTF-8'> 根據(jù)輸出可見(jiàn),,f變量并不是文本內(nèi)容,其類型是TextIOWrapper,,內(nèi)容包含文件名name,,打開(kāi)方式mode和編碼格式encoding三個(gè)參數(shù)。這里我們只指定了前兩個(gè)參數(shù),,所以encoding就是默認(rèn)值UTF-8,如果想要得到文件的內(nèi)容,,還有進(jìn)一步工作要做,。 2.read函數(shù) 為了得到文本內(nèi)容,我們需要調(diào)用.read()函數(shù),,就像這樣,。 novel = f.read() 同時(shí)運(yùn)用len函數(shù)可以統(tǒng)計(jì)文件內(nèi)的字?jǐn)?shù) 二、函數(shù) 函數(shù)就是一系列語(yǔ)句的集合封裝,,這樣每次就不需要重復(fù)寫(xiě)出所有語(yǔ)句,,只需要通過(guò)函數(shù)的名稱調(diào)用就方便多了。其實(shí)我們已經(jīng)多次用到函數(shù)了,,比如 type()函數(shù),,我們給它一個(gè)“輸入”,比如一個(gè)數(shù)字 1,,函數(shù)會(huì)返回這個(gè)數(shù)字對(duì)應(yīng)的類型(type)給你,。這里會(huì)介紹如何定義自己的函數(shù),,來(lái)實(shí)現(xiàn)更加靈活的功能。 我們以口袋妖怪威為例,,數(shù)據(jù)來(lái)源于Kaggle,。
為了便于讀取,,我們將所有的數(shù)據(jù)存為csv文件,。Pokemon.csv csv(comma separated values)是結(jié)構(gòu)化數(shù)據(jù),同一行的值之間以逗號(hào)(,)分隔,,行之間用換行符( )分隔,。(注意n之前的轉(zhuǎn)移符) 練習(xí)題一 為便于處理,我們將數(shù)據(jù)集轉(zhuǎn)換為二維數(shù)組(嵌套列表),,這也是對(duì)之前“循環(huán)”,、“列表”等內(nèi)容的回顧。當(dāng)然,,如果有Pandas等數(shù)據(jù)科學(xué)庫(kù)的幫助,,這些過(guò)程可以更加簡(jiǎn)潔,這里主要是為了加強(qiáng)編程練習(xí),。 文件pokemon.csv已經(jīng)打開(kāi)并存為變量f,。
答案: data = f.read() mons = data.split('') for i in mons: mons_data.append(i.split(',')) 如果有一個(gè)函數(shù),只要指定目標(biāo)csv文件,,就可以直接生成二維數(shù)組,,豈不美哉?但是Python并沒(méi)有內(nèi)置這樣的功能,,那就需要定義自己的函數(shù),。函數(shù)定義的關(guān)鍵字是def,也就是'define'的縮寫(xiě),。定義語(yǔ)句格式與for循環(huán)有些類似,,同樣包括語(yǔ)句頭和語(yǔ)句體,需要特別注意的仍然是語(yǔ)句頭結(jié)尾的冒號(hào)(:)和語(yǔ)句體的縮進(jìn): 我們希望能夠有一個(gè)函數(shù),,讀取指定的csv文件,,返回經(jīng)過(guò)切分的二維數(shù)組,那么這個(gè)函數(shù)應(yīng)該是這樣的:
三,、類和對(duì)象 類(class)描述和規(guī)范了某一類事物的特征和行為。比如有一個(gè)類,,叫“車”,。那么這個(gè)類就描述了一種物體的特征和行為,特征比如有輪子,,行為比方說(shuō)會(huì)移動(dòng),。車這個(gè)類好比一張藍(lán)圖,各種各樣的車都是根據(jù)車的基本特征設(shè)計(jì)制造出來(lái)的,。 “類”的概念是抽象的,,我們雖然修過(guò)了一輛輛車,但不會(huì)真的關(guān)注“車”作為類的本質(zhì)等哲♂學(xué)命題,。具體到某一輛車就是對(duì)象(object),,對(duì)象是類的實(shí)例,如果說(shuō)類是藍(lán)圖,,對(duì)象就是把一張藍(lán)圖繪到底,。 Python是一門面向?qū)ο?/span>的編程語(yǔ)言,可以說(shuō)在Python中所有東西都是對(duì)象(你們有對(duì)象了嗎,?),,比如int, str, bool這些我們已經(jīng)見(jiàn)過(guò)的數(shù)據(jù)類型,甚至模塊,、函數(shù),全都是對(duì)象,。這個(gè)按照藍(lán)圖造車的過(guò)程,,就叫類的實(shí)例化。你擁有的車就是類的實(shí)例,,即對(duì)象,。所以說(shuō),要有對(duì)象,,首先要定義類,。 如何定義一個(gè)類呢,? 和定義函數(shù)一樣,定義類也是一個(gè)“語(yǔ)句頭+語(yǔ)句體”組成的復(fù)合語(yǔ)句,,用到的關(guān)鍵字是class,。定義一個(gè)名為 Creature 的類,其語(yǔ)法結(jié)構(gòu)如圖: 類的名稱跟在class關(guān)鍵詞之后,,和冒號(hào)(:)之前,。類用實(shí)例變量(instance variable)來(lái)存儲(chǔ)數(shù)據(jù),以及方法(method)來(lái)定義行為,。關(guān)于超類的概念不必驚慌,,下一章就會(huì)詳細(xì)講解,沒(méi)有超類的情況下,,類名之后的括號(hào)也可以省略,。 為了使定義的過(guò)程看上去盡可能簡(jiǎn)單,語(yǔ)句體中只有一個(gè) pass,,也就是什么也不做的意思,。 一般的類還會(huì)包含:
什么是方法? 方法描述了對(duì)象的行為,,本質(zhì)上它是定義在類中的函數(shù),。調(diào)用對(duì)象方法的過(guò)程,和我們之前在函數(shù)一章中調(diào)用函數(shù)是相似的,,比如對(duì)于字符串對(duì)象,,想要調(diào)用.split()方法來(lái)進(jìn)行分割(#號(hào)后面的就是輸出結(jié)果): 在之前的章節(jié)習(xí)題中,我們已經(jīng)接觸過(guò)了類的相關(guān)的用法,。假設(shè)現(xiàn)有類Person,,含有了一個(gè)方法,叫做 whoami,,用于返回對(duì)象的名字,。那我們調(diào)用這個(gè)方法的過(guò)程是這樣的: 其實(shí)上面這個(gè)程序 Trevor = Person() 這一行,不管你把 kaiser 改成什么,,輸出的都是我的名字,。顯然,這個(gè) whoami 方法是有問(wèn)題的,。 如果你把類語(yǔ)句體里的 'Trevor' 改成別的內(nèi)容,,那就會(huì)輸出別的內(nèi)容。但我們需要的是輸出這個(gè) Person 對(duì)象的名字,,大家的名字都不相同,,怎么做呢?這就需要類 Person 能夠存儲(chǔ)數(shù)據(jù),,也就是要有實(shí)例變量,。 實(shí)例變量 介紹實(shí)例變量之前,,先介紹一下初始化器(initializer或constructor)。Python 的類都自帶有一些特殊的方法,,它就是其中之一,。 初始化器的“初始化”,指的是對(duì)象的初始化,,其實(shí)也就是類的實(shí)例化,。如果我們要在實(shí)例化Person 的時(shí)候,給它一個(gè)名字,,可以加在實(shí)例化時(shí)的括號(hào)里,。 初始化器的方法名長(zhǎng)這樣:__init__。別怕下劃線,,這只是為了標(biāo)明些方法的特殊性,。 定義初始化器和平時(shí)定義方法是一樣的,我們需要把這個(gè)人的名字傳入到初始化器,。那么初始化器應(yīng)該這樣定義: 哦,,在這停頓!這里出現(xiàn)的 self.name,,就是我們的實(shí)例變量,。實(shí)例變量的用途(第三次提起)是存儲(chǔ)數(shù)據(jù),那么這里我們是存儲(chǔ)了名字,。這樣實(shí)現(xiàn)過(guò)初始化器之后,,就可以實(shí)例化Person ,并賦予它一個(gè)名字了,。 Python的所有方法,,其第一個(gè)參數(shù)都是self,這個(gè)參數(shù)指代的是調(diào)用該方法的對(duì)象,。調(diào)用方法時(shí),,不需要傳入self參數(shù),Python解釋器會(huì)自動(dòng)完成這一步,。對(duì)象的實(shí)例變量可以在生成后修改,,但是并不推薦這樣做,所以實(shí)踐當(dāng)中最好隱藏變量對(duì)外的接口,。在實(shí)際的開(kāi)發(fā)中經(jīng)常會(huì)遇到這種情況:我們不希望對(duì)象的某些實(shí)例變量被訪問(wèn)和修改,。為此需要隱藏這些實(shí)例變量,即定義私有實(shí)例變量,。在Python中,以兩條下劃線(__)開(kāi)頭的變量,,就是私有實(shí)例變量,。方法同樣可以定義為私有,,也是以兩條下劃線(__)開(kāi)頭。 四,、繼承與派生 繼承(inheritance)使得開(kāi)發(fā)者可以先創(chuàng)建一個(gè)較為寬泛的類,,再逐步拓展細(xì)化成為更具體的類,就好比先定義“動(dòng)物”,,再繼承得出“哺乳動(dòng)物”,。 通過(guò)繼承,我們可以訪問(wèn)所有的數(shù)據(jù)域(實(shí)例變量)和方法,,此外還可以加入我們自己的變量和方法,。繼承提供了一種組織代碼的方式,這樣就不用每次都從零重寫(xiě),,極大地提高了編碼效率,,也是一種更好的代碼風(fēng)格。如果類Y繼承了類X,,那么X叫作“超類”(super class)或“基類”(base class),,Y叫作“子類”(subclass)或“派生類”(derived class)。其實(shí)就是父子關(guān)系: 創(chuàng)建子類的語(yǔ)法: 之前我們定義過(guò)的類如Person,,類名之后都是沒(méi)有括號(hào)的,,因?yàn)樗麄儾](méi)有繼承其他超類。 與C#, Java這些語(yǔ)言不同,,Python允許多重繼承,,也就是可以認(rèn)好幾個(gè)爹: 最后,今天來(lái)一波毒雞湯 小編在此謝謝大家的觀看,!Python很容易學(xué),!所以小編有弄一個(gè)交流,互問(wèn)互答,,資源共享的交流學(xué)習(xí)基地,,如果你也是Python的學(xué)習(xí)者或者大牛都?xì)g迎你來(lái)!?:548+377+875,!一起 學(xué)習(xí)共同進(jìn)步,! |
|