這4個(gè)Python實(shí)戰(zhàn)項(xiàng)目,讓你瞬間讀懂Python癌蚁!

前言

Python 是一種極具可讀性和通用性的編程語(yǔ)言幻梯。Python 這個(gè)名字的靈感來(lái)自于英國(guó)喜劇團(tuán)體 Monty Python,它的開(kāi)發(fā)團(tuán)隊(duì)有一個(gè)重要的基礎(chǔ)目標(biāo)努释,就是使語(yǔ)言使用起來(lái)很有趣碘梢。Python 易于設(shè)置,并且是用相對(duì)直接的風(fēng)格來(lái)編寫(xiě)伐蒂,對(duì)錯(cuò)誤會(huì)提供即時(shí)反饋煞躬,對(duì)初學(xué)者而言是個(gè)很好的選擇。

Python 是一種多范式語(yǔ)言逸邦,也就是說(shuō)恩沛,它支持多種編程風(fēng)格,包括腳本和面向?qū)ο舐萍酰@使得它適用于通用目的雷客。隨著越來(lái)越多地在工業(yè)中,被諸如聯(lián)合太空聯(lián)盟(NASA 的主要飛機(jī)支持承包商)和工業(yè)光魔(VFX 和盧卡斯影業(yè)的動(dòng)畫(huà)工作室)等組織使用烛卧,Python 為那些尋求額外編程語(yǔ)言的人提供了巨大的潛力 佛纫。

當(dāng)一個(gè)重要的被稱(chēng)為 comp.lang.python 的 Python 新聞組在 1994 年形成時(shí),Python 的用戶(hù)基礎(chǔ)不斷增長(zhǎng)总放,這為 Python 成為開(kāi)源開(kāi)發(fā)中最受歡迎的編程語(yǔ)言之一鋪平了道路呈宇。

Python當(dāng)下真的很火。Python實(shí)戰(zhàn)項(xiàng)目局雄,也一直尤為關(guān)注甥啄,接下來(lái),和大家介紹下十個(gè)Python練手的實(shí)戰(zhàn)項(xiàng)目

文章也給大家整理了Python很全面的資料和教程可以加裙 227-435 450下載炬搭,適合正在學(xué)習(xí)Python的朋友蜈漓。

python項(xiàng)目練習(xí)一:即時(shí)標(biāo)記

這是《python基礎(chǔ)教程》后面的實(shí)踐,照著寫(xiě)寫(xiě)宫盔,一方面是來(lái)熟悉python的代碼方式融虽,另一方面是練習(xí)使用python中的基本的以及非基本的語(yǔ)法,做到熟能生巧灼芭。

這個(gè)項(xiàng)目一開(kāi)始比較簡(jiǎn)單有额,不過(guò)重構(gòu)之后就有些復(fù)雜了,但是更靈活了。

按照書(shū)上所說(shuō)巍佑,重構(gòu)之后的程序茴迁,分為四個(gè)模塊:處理程序模塊,過(guò)濾器模塊萤衰,規(guī)則(其實(shí)應(yīng)該是處理規(guī)則)堕义,語(yǔ)法分析器。

先來(lái)說(shuō)處理程序模塊脆栋,這個(gè)模塊的作用有兩個(gè)倦卖,一個(gè)是提供那些固定的html標(biāo)記的輸出(每一個(gè)標(biāo)記都有start和end),另一個(gè)是對(duì)這個(gè)標(biāo)記輸出的開(kāi)始和結(jié)束提供了一個(gè)友好的訪問(wèn)接口筹吐。來(lái)看下程序handlers.py:

這個(gè)程序堪稱(chēng)是整個(gè)“項(xiàng)目”的基石所在:提供了標(biāo)簽的輸出糖耸,以及字符串的替換。理解起來(lái)也比較簡(jiǎn)單丘薛。

再來(lái)看第二個(gè)模塊“過(guò)濾器”嘉竟,這個(gè)模塊更為簡(jiǎn)單,其實(shí)就是一個(gè)正則表達(dá)式的字符串洋侨。相關(guān)代碼如下:

這就是三個(gè)過(guò)濾器了舍扰,分別是:強(qiáng)調(diào)牌過(guò)濾器(用×號(hào)標(biāo)出的),url牌過(guò)濾器希坚,email牌過(guò)濾器边苹。熟悉正則表達(dá)式的同學(xué)理解起來(lái)是沒(méi)有壓力的。

再來(lái)看第三個(gè)模塊“規(guī)則”裁僧,這個(gè)模塊个束,拋開(kāi)那祖父類(lèi)不說(shuō),其他類(lèi)應(yīng)該有的兩個(gè)方法是condition和action聊疲,前者是用來(lái)判斷讀進(jìn)來(lái)的字符串是不是符合自家規(guī)則茬底,后者是用來(lái)執(zhí)行操作的,所謂的執(zhí)行操作就是指調(diào)用“處理程序模塊”获洲,輸出前標(biāo)簽阱表、內(nèi)容、后標(biāo)簽贡珊。 來(lái)看下這個(gè)模塊的代碼最爬,其實(shí)這個(gè)里面幾個(gè)類(lèi)的關(guān)系,畫(huà)到類(lèi)圖里面看會(huì)比較清晰门岔。 rules.py:

補(bǔ)充utils.py:

最后隆重的來(lái)看下“語(yǔ)法分析器模塊”爱致,這個(gè)模塊的作用其實(shí)就是協(xié)調(diào)讀入的文本和其他模塊的關(guān)系。在往重點(diǎn)說(shuō)就是寒随,提供了兩個(gè)存放“規(guī)則”和“過(guò)濾器”的列表蒜鸡,這么做的好處就是使得整個(gè)程序的靈活性得到了極大的提高胯努,使得規(guī)則和過(guò)濾器變成的熱插拔的方式,當(dāng)然這個(gè)也歸功于前面在寫(xiě)規(guī)則和過(guò)濾器時(shí)每一種類(lèi)型的規(guī)則(過(guò)濾器)都單獨(dú)的寫(xiě)成了一個(gè)類(lèi)逢防,而不是用if..else來(lái)區(qū)分。 看代碼:

這個(gè)模塊里面的處理思路是蒲讯,遍歷客戶(hù)端(也就是程序執(zhí)行的入口)給插進(jìn)去的所有的規(guī)則和過(guò)濾器忘朝,來(lái)處理讀進(jìn)來(lái)的文本。

有一個(gè)細(xì)節(jié)的地方也要說(shuō)一下判帮,其實(shí)是和前面寫(xiě)的呼應(yīng)一下局嘁,就是在遍歷規(guī)則的時(shí)候通過(guò)調(diào)用condition這個(gè)東西來(lái)判斷是否符合當(dāng)前規(guī)則。

我覺(jué)得這個(gè)程序很像是命令行模式晦墙,有空可以復(fù)習(xí)一下該模式悦昵,以保持記憶網(wǎng)節(jié)點(diǎn)的牢固性。

最后說(shuō)一下我以為的這個(gè)程序的用途:

1晌畅、用來(lái)做代碼高亮分析但指,如果改寫(xiě)成js版的話,可以做一個(gè)在線代碼編輯器抗楔。

2棋凳、可以用來(lái)學(xué)習(xí),供我寫(xiě)博文用连躏。

還有其他的思路剩岳,可以留下您的真知灼見(jiàn)入热。

補(bǔ)充一個(gè)類(lèi)圖拍棕,很簡(jiǎn)陋,但是應(yīng)該能說(shuō)明之間的關(guān)系勺良。另外我還是建議如果看代碼捋不清關(guān)系最好自己畫(huà)圖绰播,自己畫(huà)圖才能熟悉整個(gè)結(jié)構(gòu)。

python項(xiàng)目練習(xí)二:畫(huà)幅好畫(huà)

這是《python基礎(chǔ)教程》中的第二個(gè)項(xiàng)目郑气,關(guān)于python操作PDF

涉及到的知識(shí)點(diǎn)

1幅垮、urllib的使用

2、reportlab庫(kù)的使用

這個(gè)例子著實(shí)很簡(jiǎn)單尾组,不過(guò)我發(fā)現(xiàn)在python里面可以直接在數(shù)組[]里面寫(xiě)for循環(huán)忙芒,真是越用越方便。

下面是代碼:

python項(xiàng)目練習(xí)三:萬(wàn)能的XML

這個(gè)項(xiàng)目的名稱(chēng)與其叫做萬(wàn)能的XML不如叫做自動(dòng)構(gòu)建網(wǎng)站讳侨,根據(jù)一份XML文件呵萨,生成對(duì)應(yīng)目錄結(jié)構(gòu)的網(wǎng)站,不過(guò)只有html還是太過(guò)于簡(jiǎn)單了跨跨,如果要是可以連帶生成css那就比較強(qiáng)大了潮峦。這個(gè)有待后續(xù)研發(fā)囱皿,先來(lái)研究下怎么html網(wǎng)站結(jié)構(gòu)。 既然是通過(guò)XML結(jié)構(gòu)生成網(wǎng)站忱嘹,那所有的事情都應(yīng)該由這個(gè)XML文件來(lái)嘱腥。先來(lái)看下這個(gè)XML文件,website.xml:

有了這個(gè)文件拘悦,下面應(yīng)該來(lái)看怎么通過(guò)這個(gè)文件生成網(wǎng)站齿兔。

首先我們要解析這個(gè)xml文件,python解析xml和在java中一樣础米,有兩種方式分苇,SAX和DOM,兩種處理方式不同點(diǎn)在于速度和范圍屁桑,前者講究的是效率医寿,每次只處理文檔的一小部分,快速而能有效的利用內(nèi)存蘑斧,后者是相反的處理方式靖秩,先把所有的文檔載入到內(nèi)存,然后再進(jìn)行處理乌叶,速度比較慢盆偿,也比較消耗內(nèi)存,唯一的好處就是可以操作整個(gè)文檔准浴。

在python中使用sax方式處理xml要先引入xml.sax中的parse函數(shù)事扭,還有xml.sax.handler中的ContentHandler,后面的這個(gè)類(lèi)是要和parse函數(shù)來(lái)配合使用的乐横。使用方式如下: parse('xxx.xml',xxxHandler),這里面的xxxHandler要繼承上面的ContentHandler求橄,不過(guò)只要繼承就行,不需要有所作為葡公。 然后這個(gè)parse函數(shù)在處理xml文件的時(shí)候罐农,會(huì)調(diào)用xxxHandler中的startElement函數(shù)和endElement函數(shù)來(lái)一個(gè)xml中的標(biāo)簽的開(kāi)始和結(jié)束,中間的過(guò)程使用一個(gè)名為characters的函數(shù)來(lái)處理標(biāo)簽內(nèi)部的所有字符串催什。

有了上面的這些認(rèn)識(shí)涵亏,我們已經(jīng)知道如何處理xml文件了,然后再來(lái)看那個(gè)罪惡的源頭website.xml文件蒲凶,分析其結(jié)構(gòu)气筋,只有兩個(gè)節(jié)點(diǎn):page和directory,很明顯page表示一個(gè)頁(yè)面旋圆,directory表示一個(gè)目錄宠默。

所以處理這個(gè)xml文件的思路就變的清晰了。讀取xml文件的每一個(gè)節(jié)點(diǎn)灵巧,然后判斷是page還是directory如果是page則創(chuàng)建html頁(yè)面搀矫,然后把節(jié)點(diǎn)中的內(nèi)容寫(xiě)到文件里抹沪。如果遇到directory就創(chuàng)建一個(gè)文件夾,然后再處理其內(nèi)部的page節(jié)點(diǎn)(如果存在的話)瓤球。

下面來(lái)看這部分代碼融欧,書(shū)中的實(shí)現(xiàn)比較復(fù)雜,比較靈活冰垄。先來(lái)看蹬癌,然后在分析。

看起來(lái)這個(gè)程序上面分析的復(fù)雜了一些虹茶,不過(guò)偉人毛毛說(shuō)過(guò),任何復(fù)雜的程序都是紙老虎隅要。那我們?cè)賮?lái)分析一下這個(gè)程序蝴罪。

首先看到這個(gè)程序是有兩個(gè)類(lèi),其實(shí)完全可以當(dāng)作一個(gè)類(lèi)步清,因?yàn)橛辛死^承要门。

然后再來(lái)看它多了些什么,除了我們分析出來(lái)的startElement和endElement以及characters廓啊,多出來(lái)了startPage欢搜,endPage;startDirectory,endDirectory;defaultStart谴轮,defaultEnd;ensureDirectory;writeHeader炒瘟,writeFooter;和dispatch,這些個(gè)函數(shù)第步。除了dispatch疮装,前面的函數(shù)都很好理解,每一對(duì)函數(shù)都是單純的處理對(duì)應(yīng)的html標(biāo)簽以及xml節(jié)點(diǎn)粘都。而dispatch比較復(fù)雜廓推,復(fù)雜之處在于他是用來(lái)動(dòng)態(tài)拼合函數(shù)并且進(jìn)行執(zhí)行的。

dispatch的處理思路是翩隧,首先根據(jù)傳遞的參數(shù)(就是操作名稱(chēng)以及節(jié)點(diǎn)名稱(chēng))判斷是否存在對(duì)應(yīng)的函數(shù)如startPage樊展,如果不存在則執(zhí)行default+操作名稱(chēng):如defaultStart。

一個(gè)函數(shù)一個(gè)函數(shù)搞清楚之后堆生,就知道整個(gè)處理流程是什么樣了专缠。首先創(chuàng)建一個(gè)public_html的文件,存放整個(gè)網(wǎng)站顽频,然后讀xml的節(jié)點(diǎn)藤肢,通過(guò)startElement和endElement調(diào)用dispatch進(jìn)行處理。然后就是dispatch怎么調(diào)用具體的處理函數(shù)了糯景。 到此為止嘁圈,這個(gè)項(xiàng)目算是分析完了省骂。

主要掌握的內(nèi)容一個(gè)是python中使用SAX處理XML,另一個(gè)就是python中的函數(shù)的使用最住,比如getattr钞澳,傳參數(shù)時(shí)的星號(hào)……

python項(xiàng)目練習(xí)四:新聞聚合

書(shū)中的第四個(gè)練習(xí),新聞聚合≌歉浚現(xiàn)在很少見(jiàn)的一類(lèi)應(yīng)用轧粟,至少我從來(lái)沒(méi)有用過(guò),又叫做Usenet脓魏。這個(gè)程序的主要功能是用來(lái)從指定的來(lái)源(這里是Usenet新聞組)收集信息兰吟,然后講這些信息保存到指定的目的文件中(這里使用了兩種形式:純文本和html文件)。這個(gè)程序的用處有些類(lèi)似于現(xiàn)在的博客訂閱工具或者叫RSS訂閱器茂翔。

先上代碼混蔼,然后再來(lái)逐一分析:

這個(gè)程序,首先從整體上進(jìn)行分析珊燎,重點(diǎn)部分在于NewsAgent惭嚣,它的作用是存儲(chǔ)新聞來(lái)源,存儲(chǔ)目標(biāo)地址悔政,然后在分別調(diào)用來(lái)源服務(wù)器(NNTPSource以及SimpleWebSource)以及寫(xiě)新聞的類(lèi)(PlainDestination和HTMLDestination)晚吞。所以從這里也看的出,NNTPSource是專(zhuān)門(mén)用來(lái)獲取新聞服務(wù)器上的信息的谋国,SimpleWebSource是獲取一個(gè)url上的數(shù)據(jù)的槽地。而PlainDestination和HTMLDestination的作用很明顯,前者是用來(lái)輸出獲取到的內(nèi)容到終端的烹卒,后者是寫(xiě)數(shù)據(jù)到html文件中的闷盔。

有了這些分析,然后在來(lái)看主程序中的內(nèi)容旅急,主程序就是來(lái)給NewsAgent添加信息源和輸出目的地址的逢勾。

這確實(shí)是個(gè)簡(jiǎn)單的程序,不過(guò)這個(gè)程序可是用到了分層了藐吮。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末溺拱,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子谣辞,更是在濱河造成了極大的恐慌迫摔,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,290評(píng)論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件泥从,死亡現(xiàn)場(chǎng)離奇詭異句占,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)躯嫉,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,107評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門(mén)纱烘,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)杨拐,“玉大人,你說(shuō)我怎么就攤上這事擂啥『逄眨” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 156,872評(píng)論 0 347
  • 文/不壞的土叔 我叫張陵哺壶,是天一觀的道長(zhǎng)屋吨。 經(jīng)常有香客問(wèn)我,道長(zhǎng)山宾,這世上最難降的妖魔是什么至扰? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,415評(píng)論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮资锰,結(jié)果婚禮上渊胸,老公的妹妹穿的比我還像新娘。我一直安慰自己台妆,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,453評(píng)論 6 385
  • 文/花漫 我一把揭開(kāi)白布胖翰。 她就那樣靜靜地躺著接剩,像睡著了一般。 火紅的嫁衣襯著肌膚如雪萨咳。 梳的紋絲不亂的頭發(fā)上懊缺,一...
    開(kāi)封第一講書(shū)人閱讀 49,784評(píng)論 1 290
  • 那天,我揣著相機(jī)與錄音培他,去河邊找鬼鹃两。 笑死,一個(gè)胖子當(dāng)著我的面吹牛舀凛,可吹牛的內(nèi)容都是我干的俊扳。 我是一名探鬼主播,決...
    沈念sama閱讀 38,927評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼猛遍,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼馋记!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起懊烤,我...
    開(kāi)封第一講書(shū)人閱讀 37,691評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤梯醒,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后腌紧,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體茸习,經(jīng)...
    沈念sama閱讀 44,137評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,472評(píng)論 2 326
  • 正文 我和宋清朗相戀三年壁肋,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了号胚。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片籽慢。...
    茶點(diǎn)故事閱讀 38,622評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖涕刚,靈堂內(nèi)的尸體忽然破棺而出嗡综,到底是詐尸還是另有隱情,我是刑警寧澤杜漠,帶...
    沈念sama閱讀 34,289評(píng)論 4 329
  • 正文 年R本政府宣布极景,位于F島的核電站,受9級(jí)特大地震影響驾茴,放射性物質(zhì)發(fā)生泄漏盼樟。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,887評(píng)論 3 312
  • 文/蒙蒙 一锈至、第九天 我趴在偏房一處隱蔽的房頂上張望晨缴。 院中可真熱鬧,春花似錦峡捡、人聲如沸击碗。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,741評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)稍途。三九已至,卻和暖如春砚婆,著一層夾襖步出監(jiān)牢的瞬間械拍,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,977評(píng)論 1 265
  • 我被黑心中介騙來(lái)泰國(guó)打工装盯, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留坷虑,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,316評(píng)論 2 360
  • 正文 我出身青樓埂奈,卻偏偏與公主長(zhǎng)得像迄损,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子挥转,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,490評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容