有趣的十個Python實戰專案,讓你瞬間愛上Python!
前言
Python 是一種極具可讀性和通用性的程式語言。Python 這個名字的靈感來自於英國喜劇團體 Monty Python,它的開發團隊有一個重要的基礎目標,就是使語言使用起來很有趣。Python 易於設定,並且是用相對直接的風格來編寫,對錯誤會提供即時反饋,對初學者而言是個很好的選擇。學習Python中有不明白推薦加入交流群
號:984632579
群裡有志同道合的小夥伴,互幫互助,
群裡有不錯的視訊學習教程和PDF!
Python 是一種多正規化語言,也就是說,它支援多種程式設計風格,包括指令碼和麵向物件,這使得它適用於通用目的。隨著越來越多地在工業中,被諸如聯合太空聯盟(NASA 的主要飛機支援承包商)和工業光魔(VFX 和盧卡斯影業的動畫工作室)等組織使用,Python 為那些尋求額外程式語言的人提供了巨大的潛力 。
當一個重要的被稱為 comp.lang.python 的 Python 新聞組在 1994 年形成時,Python 的使用者基礎不斷增長,這為 Python 成為開源開發中最受歡迎的程式語言之一鋪平了道路。
Python當下真的很火。Python實戰專案,也一直尤為關注,接下來,和大家介紹下十個Python練手的實戰專案
1
python專案練習一:即時標記
這是《python基礎教程》後面的實踐,照著寫寫,一方面是來熟悉python的程式碼方式,另一方面是練習使用python中的基本的以及非基本的語法,做到熟能生巧。
這個專案一開始比較簡單,不過重構之後就有些複雜了,但是更靈活了。
按照書上所說,重構之後的程式,分為四個模組:處理程式模組,過濾器模組,規則(其實應該是處理規則),語法分析器。
先來說處理程式模組,這個模組的作用有兩個,一個是提供那些固定的html標記的輸出(每一個標記都有start和end),另一個是對這個標記輸出的開始和結束提供了一個友好的訪問介面。來看下程式handlers.py:
這個程式堪稱是整個“專案”的基石所在:提供了標籤的輸出,以及字串的替換。理解起來也比較簡單。
再來看第二個模組“過濾器”,這個模組更為簡單,其實就是一個正規表示式的字串。相關程式碼如下:
這就是三個過濾器了,分別是:強調牌過濾器(用×號標出的),url牌過濾器,email牌過濾器。熟悉正規表示式的同學理解起來是沒有壓力的。
再來看第三個模組“規則”,這個模組,拋開那祖父類不說,其他類應該有的兩個方法是condition和action,前者是用來判斷讀進來的字串是不是符合自家規則,後者是用來執行操作的,所謂的執行操作就是指呼叫“處理程式模組”,輸出前標籤、內容、後標籤。 來看下這個模組的程式碼,其實這個裡面幾個類的關係,畫到類圖裡面看會比較清晰。 rules.py:
補充utils.py:
最後隆重的來看下“語法分析器模組”,這個模組的作用其實就是協調讀入的文字和其他模組的關係。在往重點說就是,提供了兩個存放“規則”和“過濾器”的列表,這麼做的好處就是使得整個程式的靈活性得到了極大的提高,使得規則和過濾器變成的熱插拔的方式,當然這個也歸功於前面在寫規則和過濾器時每一種型別的規則(過濾器)都單獨的寫成了一個類,而不是用if..else來區分。 看程式碼:
這個模組裡面的處理思路是,遍歷客戶端(也就是程式執行的入口)給插進去的所有的規則和過濾器,來處理讀進來的文字。
有一個細節的地方也要說一下,其實是和前面寫的呼應一下,就是在遍歷規則的時候通過呼叫condition這個東西來判斷是否符合當前規則。
我覺得這個程式很像是命令列模式,有空可以複習一下該模式,以保持記憶網節點的牢固性。
最後說一下我以為的這個程式的用途:
1、用來做程式碼高亮分析,如果改寫成js版的話,可以做一個線上程式碼編輯器。
2、可以用來學習,供我寫博文用。
還有其他的思路,可以留下您的真知灼見。
補充一個類圖,很簡陋,但是應該能說明之間的關係。另外我還是建議如果看程式碼捋不清關係最好自己畫圖,自己畫圖才能熟悉整個結構。
2
python專案練習二:畫幅好畫
這是《python基礎教程》中的第二個專案,關於python操作PDF
涉及到的知識點
1、urllib的使用
2、reportlab庫的使用
這個例子著實很簡單,不過我發現在python裡面可以直接在陣列[]裡面寫for迴圈,真是越用越方便。
下面是程式碼:
3
python專案練習三:萬能的XML
這個專案的名稱與其叫做萬能的XML不如叫做自動構建網站,根據一份XML檔案,生成對應目錄結構的網站,不過只有html還是太過於簡單了,如果要是可以連帶生成css那就比較強大了。這個有待後續研發,先來研究下怎麼html網站結構。 既然是通過XML結構生成網站,那所有的事情都應該由這個XML檔案來。先來看下這個XML檔案,website.xml:
有了這個檔案,下面應該來看怎麼通過這個檔案生成網站。
首先我們要解析這個xml檔案,python解析xml和在java中一樣,有兩種方式,SAX和DOM,兩種處理方式不同點在於速度和範圍,前者講究的是效率,每次只處理文件的一小部分,快速而能有效的利用記憶體,後者是相反的處理方式,先把所有的文件載入到記憶體,然後再進行處理,速度比較慢,也比較消耗記憶體,唯一的好處就是可以操作整個文件。
在python中使用sax方式處理xml要先引入xml.sax中的parse函式,還有xml.sax.handler中的ContentHandler,後面的這個類是要和parse函式來配合使用的。使用方式如下: parse('xxx.xml',xxxHandler),這裡面的xxxHandler要繼承上面的ContentHandler,不過只要繼承就行,不需要有所作為。 然後這個parse函式在處理xml檔案的時候,會呼叫xxxHandler中的startElement函式和endElement函式來一個xml中的標籤的開始和結束,中間的過程使用一個名為characters的函式來處理標籤內部的所有字串。
有了上面的這些認識,我們已經知道如何處理xml檔案了,然後再來看那個罪惡的源頭website.xml檔案,分析其結構,只有兩個節點:page和directory,很明顯page表示一個頁面,directory表示一個目錄。
所以處理這個xml檔案的思路就變的清晰了。讀取xml檔案的每一個節點,然後判斷是page還是directory如果是page則建立html頁面,然後把節點中的內容寫到檔案裡。如果遇到directory就建立一個資料夾,然後再處理其內部的page節點(如果存在的話)。
下面來看這部分程式碼,書中的實現比較複雜,比較靈活。先來看,然後在分析。
看起來這個程式上面分析的複雜了一些,不過偉人毛毛說過,任何複雜的程式都是紙老虎。那我們再來分析一下這個程式。
首先看到這個程式是有兩個類,其實完全可以當作一個類,因為有了繼承。
然後再來看它多了些什麼,除了我們分析出來的startElement和endElement以及characters,多出來了startPage,endPage;startDirectory,endDirectory;defaultStart,defaultEnd;ensureDirectory;writeHeader,writeFooter;和dispatch,這些個函式。除了dispatch,前面的函式都很好理解,每一對函式都是單純的處理對應的html標籤以及xml節點。而dispatch比較複雜,複雜之處在於他是用來動態拼合函式並且進行執行的。
dispatch的處理思路是,首先根據傳遞的引數(就是操作名稱以及節點名稱)判斷是否存在對應的函式如startPage,如果不存在則執行default+操作名稱:如defaultStart。
一個函式一個函式搞清楚之後,就知道整個處理流程是什麼樣了。首先建立一個public_html的檔案,存放整個網站,然後讀xml的節點,通過startElement和endElement呼叫dispatch進行處理。然後就是dispatch怎麼呼叫具體的處理函式了。 到此為止,這個專案算是分析完了。
主要掌握的內容一個是python中使用SAX處理XML,另一個就是python中的函式的使用,比如getattr,傳引數時的星號……
4
python專案練習四:新聞聚合
書中的第四個練習,新聞聚合。現在很少見的一類應用,至少我從來沒有用過,又叫做Usenet。這個程式的主要功能是用來從指定的來源(這裡是Usenet新聞組)收集資訊,然後講這些資訊儲存到指定的目的檔案中(這裡使用了兩種形式:純文字和html檔案)。這個程式的用處有些類似於現在的部落格訂閱工具或者叫RSS訂閱器。
先上程式碼,然後再來逐一分析:
這個程式,首先從整體上進行分析,重點部分在於NewsAgent,它的作用是儲存新聞來源,儲存目標地址,然後在分別呼叫來源伺服器(NNTPSource以及SimpleWebSource)以及寫新聞的類(PlainDestination和HTMLDestination)。所以從這裡也看的出,NNTPSource是專門用來獲取新聞伺服器上的資訊的,SimpleWebSource是獲取一個url上的資料的。而PlainDestination和HTMLDestination的作用很明顯,前者是用來輸出獲取到的內容到終端的,後者是寫資料到html檔案中的。
有了這些分析,然後在來看主程式中的內容,主程式就是來給NewsAgent新增資訊源和輸出目的地址的。
這確實是個簡單的程式,不過這個程式可是用到了分層了。
5
python專案練習五:虛擬茶話會
幾乎在學習、使用任何一種程式語言的時候,關於socket的練習從來都不會少,尤其是會寫一些區域網的通訊的東西。所以書上的這個專案剛好可以練習一下socket程式設計。
這個練習的整體思路首先有一個聊天的伺服器,這個伺服器的功能主要是提供客戶端socket的連線、儲存每個客戶端的連線session,處理每個連線傳送的訊息、解析客戶端傳送的資料。就這些,至於客戶端方面不需要寫程式碼,用系統的telnet工具即可。
我覺得有了上面的分析,剩下的這個程式就沒有什麼說的了,當然,除了那兩個把socket封裝的類之外。
自己使用python中的socket類嘗試這個編寫了一個簡單的通訊程式,不過不知為什麼,通訊中總是出現意外。這段簡單的程式碼如下:
server.py
clinet.py
這個程式出錯的原因沒有去細揪,因為python中提供了兩個封裝好的類來完成socket通訊過程:asynchat中的async_chat和asyncore中的dispatcher以及asyncore本身。前面的類是用來處理客戶端同伺服器的每一次會話,後面的類主要是用來提供socket連線服務。並且將每一個socket連線都託管給前者(async_chat)來處理。
來看程式碼:
整個程式分為我一開始說的三個部分:
提供客戶端的socket連線:ChatServer類。
儲存每個客戶端的連線session,處理每個連線傳送的訊息:ChatSession類,這個類的作用很簡單,接受資料,判斷是否有終結符,如果有呼叫found_terminator這個方法。
解析客戶端傳送的資料:就是剩下的room相關的類,這些類分別用來處理客戶端傳送的字串和命令,都是繼承自CommandHandler。
最終截圖:
6
python專案練習六:使用CGI進行遠端編輯
記得一開始接觸web開發的時候,看視訊,視訊裡面的老師一般都會語重心長的說:想當年我們一開始學習程式設計那會兒,都是用cgi程式設計,複雜的很,現在你們學習web程式設計,直接有現成的框架來用,十分簡單。記得當然聽完這句話之後就會覺得這個老師好有經驗,技術很高。
不過後來慢慢的接觸web程式設計時間長了,覺得cgi程式設計並不是像傳說中的那麼難,只不過是比較麻煩,在後臺使用html硬編碼來完成(也就是在後臺使用類似print的語句輸出html)。通過瀏覽器直接訪問cgi檔案,由web伺服器執行cgi指令碼,輸出內容到瀏覽器。
關於cgi的更多內容可以參考這裡:http://www.jdon.com/idea/cgi.htm
再來看這個python中的cgi,確實很簡單。但是有一點我不確定,就是如果我是初學web程式設計的話,會不會覺得這個簡單,這個角度的思考確實不好操作。
下面直接上程式碼吧,和書上的不太一樣,因為書上的程式碼在我的電腦上不能正常執行。 首先是index.html:
edit.cgi,用來接受index頁面的名字,然後根據名字查詢檔案,並且輸出。
最後一個檔案save.cgi:
程式碼理解上比較簡單,唯一麻煩的地方是web伺服器的配置。 我這裡使用的是tomcat來做web伺服器。需要修改tomcat配置,首先是配置cgi,我引用一段從網上搜來的文字:
要為Tomcat配置CGI服務主要有下面幾個步驟:
1、把servlets-cgi.renametojar (在%CATALINA_HOME%/server/lib/目錄下)改名為servlets-cgi.jar。
2、在Tomcat的%CATALINA_BASE%/conf/web.xml 檔案中,把關於CGI的那段的註釋去掉。內容樣式如下:
其中引數executable需要自已新增進去,它的值就是我們用來解釋CGI指令碼的程式。一般情況下這裡會配置為Perl。"C:/Perl/bin/"為Perl的安裝目錄。
3、在Tomcat的%CATALINA_BASE%/conf/web.xml檔案中,把關於對CGI進行對映的那段的註釋去掉。內容樣式如下:
其中url-pattern就是將來我們訪問CGI指令碼的url地址模式。
完成上面三個步驟後,我們的Tomcat伺服器就具有了執行CGI指令碼的能力了。
摘自:http://www.blogjava.net/Tauruser/archive/2007/09/06/143097.html
使用hello.cgi測試一下:
然後測試能執行的話,就要把程式碼放到tomcat的webapp下的某一個app下的WEB-INF中的cgi下。,比如我這裡的cgi檔案是在tomcat/webapps/test/WEB-INF/cgi/下。另外在cgi目錄下要建立一個data資料夾,裡面放一個test.txt檔案。
最後執行效果如圖:
7
python專案練習七:自定義公告板
這依然是一個cgi的專案,有了前面的一個專案作為基礎,這個裡面沒有什麼難點。不過,和書上不同的是,我這裡使用的資料庫是mysql,所以有興趣的童鞋,可以參考一下。
首先建立一張mysql的資料表:
然後你要確定你的系統中已經安裝了連線mysql的python模組,怎麼確定呢。命令列下,進入python,然後輸入import MySQLdb,注意大小寫,如果沒有報錯,說明安裝了,如果報錯,從網上找python連mysql的方法,很多。
準備就緒,開始分析整個程式吧。
一個很簡單的電子公告版,主要功能有,展示所有公告,檢視單個公告,編輯公告,儲存公告。所以根據功能建立四個檔案:main.py,view.py,edit.py,save.py,每個檔案,負責一個模組。
下面就上程式碼吧,太簡單了。 main.py:
view.py
edit.py
save.py
8
python專案練習八:使用XML-RPC進行遠端檔案共享
這是個不錯的練習,使用python開發P2P程式,或許通過這個我們可以自己搞出來一個P2P下載工具,類似於迅雷。說到迅雷,關於其原理不知道大家是否瞭解,如果你不瞭解,我想看完這篇文章,你一定會了解的。啥,你已經瞭解了?那就過來指點一番。
以前在java中也接觸過類似的概念。一個是RMI( Remote Method Invocation)的概念,另外一個就是XML-RPC的概念。
那麼什麼是XML-RPC呢?它和P2P有什麼關係?下面談談我的個人理解。
XML-RPC是一個遠端過程呼叫(remote procedure call,RPC)的分散式計算協議,通過XML將呼叫函式封裝,並使用HTTP協議作為傳送機制[摘自維基百科]。所以這個XML-RPC可以幫助我們完成遠端呼叫的工作,即呼叫相鄰電腦中的方法,當然前提是在相鄰電腦中已經有我們編寫的供遠端呼叫的程式在執行(不管是在前臺還是後臺,就像迅雷一樣,總是悄悄執行)。
這裡還要提出來一個概念:Node,即節點。每一個電腦被為一個節點,這個只是針對每個電腦只執行一個我們通過XML-RPC編寫的程式,如果電腦中同時執行了多個程式,其實每一個程式都是一個節點。有了節點這樣的一個概念之後,我想大家可以想象的出來了,不同節點之間相連,形成各種複雜的網狀結構。
這時每個節點可以和其他多個節點進行相連,但是我們沒必要讓一個節點通其他所有的節點都相連,連結太多會很亂,就像人際關係一樣。那什麼時候連哪些節點呢?這時就要說到P2P了,所謂P2P即指peer to peer,也就是點到點。說是點到點,你可千萬別認為只是從一點到一點,因為他可能是從多點到一點,或者一點到多點。而沒有固定的從哪個點到哪個點,所有的點都可以相連。
因此在下載東西方面,這樣的協議就比傳統的只是從某一點下載資料要快很多,資源也會多很多。
其運作流程是這樣的,我打一個比方:比如小A在迅雷裡下載B片,迅雷上面可以沒有這個資源,但是他可以幫你從節點中找,看誰又這個資源,剛好小C電腦裡有,並且在迅雷共享目錄下,然後迅雷就會把小C電腦中把資源通過自己的節點傳回到小A的電腦上,當然更可能的情況是直接讓小A和小C相連。
大家在使用迅雷下載東西的時候肯定注意過裡面有一項資源:x/xx這樣的東西,我覺得,前面的那個x的意思表示當為你提供資源的節點數量,後面的那個xx表示,所有擁有該資源的節點數目,這些節點可能並不線上。
理解了基本的概念之後,再來看python中如何來實現。
可以先做一個小小的嘗試: 首先進入命令列,輸入python,然後輸入一下程式碼:
然後在啟動一個命令列,進入pyhon。 輸入:
from xmlrpclib import ServerProxy s = ServerProxy('http://localhost:4242') s.twice(2) #通過ServerProxy呼叫遠端的方法,
然後你就會看到通過遠端方法的計算完成。
是不是很輕鬆,這個還是比較簡陋,不過足以讓你理解python的遠端呼叫,再來看看完整的吧。
先上程式碼,然後再詳解。 首先是Server.py:
首先來看上面的幾個常量設定: SimpleXMLRPCServer.allow_reuse_address表示,其所佔用的埠可以重用,即如果你強制關閉node server之後再次重啟,不會出現埠被佔用的情況。
MAX_HISTORY_LENGTH = 6 這個是設定最大的節點長度,因為不能讓讓節點無休止的搜尋下去。
UNHANDLED = 100 ACCESS_DENIED = 200 這倆就是返回碼。
然後再來看個node節點的具體流程。 這個段程式碼的流程這這樣的,首先,啟動供遠端呼叫的伺服器,呼叫的介面就是Node類。在Node類中有三個方法供遠端呼叫的,一個是hello,一個是fetch還有一個query。hello 這個方法就是新增鄰節點資訊到當前節點中。而fetch則是用來獲取資料的方法,query是節點之間用來互動的。
在fetch方法中,首先判斷密碼是否正確,然後通過呼叫自己的query方法查詢資料。我們來看query方法,這個方法中,先是呼叫私有方法_handle本地查詢,如果沒找到,那麼在通過_broadcast介面在所有已知節點中傳送廣播,這裡要注意histroy,每次廣播都會傳遞history這個引數,這個引數的作用有二:一是、防止往重複的節點中傳送廣播;二是、限制當前所有連結節點的長度。
理解了一個node server的基礎功能之後,再來看對server進行管理的控制類程式碼。
client.py:
來分析一下這段程式碼,前面的引數就不看了,很好理解,一開始有一個隨機生成密碼的函式,做什麼用的呢?主要是用來防止別人非法呼叫該控制所控制的node server的。這密碼 我們也不用記,因為我們有client的合法使用權。呵呵。
這段程式碼的總體作用就是為你提供一個可視的命令列的介面,通過繼承cmd這個類,來解析你輸入的命令,比如程式執行之後,出現命令提示符,你輸入fetch,那麼它會呼叫到do_fetch這個方法中來,並把引數傳遞進來。
do_fetch這個方法的所用就是呼叫node server中的fetch方法,獲取資源。
另外的一個do_exit很好理解,就是接受exit命令退出程式。
在程式初始化的時候,還有一點需要注意,就是它會讀取你urlfile引數傳遞的檔案中的資料,這個裡面放的是節點的url地址。讀取之後程式會把這些地址加到相鄰節點中,供以後訪問。不過這個程式還有些不完善的地方就是在程式執行時,如果你修改了url配置的檔案,他不會讀取你新新增的節點url。不過這個修改很簡單,把獲取url的程式碼放到do_fetch中就行了。
在執行程式之前還有一些工作要做。 首先需要建立兩個資料夾,A和C,C資料夾裡面建立一個檔案,B.txt,在A和C所在資料夾中建立urlsA.txt和urlsC.txt檔案。
裡面在urlsA.txt中寫入:http://localhost:4243,然後開啟兩個命令列,第一個輸入:python client.py urlsA.txt A http://localhost:4242 回車,是不是出來提示符了。輸入fetch B.txt回車,看到提示Couldn't find the file B.txt。
然後在第二個命令列中輸入python client.py urlsC.txt C http://localhost:4243回車。同樣輸入fetch B.txt回車,是不是沒反應。說明該檔案存在。接在在第一個命令列中再次輸入fetch B.txt看,是否還是提示沒找到檔案,如果你對程式碼根據我上面的建議進行了修改的話,就不會出現錯誤了,如果沒有修改,此時你需要把輸入exit退出程式,再次重啟,然後在fetch B.txt,然後到A資料夾下檢視一下,看是不是把B.txt下載到你的資料夾中了。
PS:上面的程式只能傳輸文字檔案,大檔案或者其他格式的檔案無法傳輸,剛才研究了一下,使用xmlrpclib這個庫中的Binary函式即可,具體使用訪問為: 先引入xmlrpclib,import xmlrpclib 在server類的的_handle方法中最後返回的那句程式碼return open(name).read() 修改為 return xmlrpclib.Binary(open(name,'rb').read()) 再把fetch方法中的f.write(result)修改為f.write(result.data) 另外這句話前面的那個寫檔案的方式要改為wb。
9
python專案練習九:檔案共享2-GUI版本
有了前面的P2P基礎,這一個練習就是給程式加一個視覺化的介面,俗稱GUI。
python裡面的介面庫有很多,如wxPython、wgGTK、tkinter,還有QT,按照書中的例項,我也使用wxPython來做介面。話說有了這個介面之後,我發現迅雷的網鄰也不過如此(稍有誇張的成份),不過這個專案的練習之上再繼續擴充套件的話,基本效果可以達到網鄰的那種,如果有時間的話我可以繼續擴充套件這個專案。下面就開始編寫GUI。
這個裡面的主要的問題應該都集中在介面上,遠端共享的程式碼已經不需要修改了,只需要把現在的介面接上前面的程式碼就ok。這個wxPython庫的使用,我覺得和以前使用java的awt編寫介面沒啥區別,沒有什麼難點,只是需要理解裡面的幾個概念,像是按鈕、文字框、繫結事件,僅此而已。
還是來看程式碼吧:
這個相比於前面關於xml-rpc的實現就簡單的多了。
關於擴充套件的思路,目前我的想法是這樣的,現在的程式監聽的埠是通過命令列引數決定的。我覺得可以直接寫到視窗上輸入或者寫死在程式裡,畢竟是要使用固定的埠通訊的,還有共享的資料夾以及urls裡面的節點,都可以是固定的。
另外可以添區域網查詢功能,就像是現在迅雷網鄰的換一換,就是查詢當前區域網內正在使用我們軟體的所有使用者,然後把他們的資源情況列到我們的列表上。
10
python專案練習十:DIY街機遊戲
終於來到了最後一個專案,看看前面的那些練習,也算是熟悉了python的基本操作,也知道python能幹哪些事情,最後一個專案相比於以前的稍微複雜些,但是任何一個程式只要他是可以正常執行的,花點時間總會搞明白的。
這個練習是一個小遊戲程式,如果要是給它起個名字的話,應該叫:快躲,香蕉。主要的遊戲內容就是,遊戲開始會從螢幕上方不斷隨便的掉一些鐵塊,在螢幕下方有一個小香蕉是受你控制的,你需要不斷的左右移動來躲避鐵塊。在你躲避完一定數量的鐵塊之後,就會進入下一關。下一關依然是讓你躲鐵塊,不過鐵塊下降的速度就快了很多。在遊戲中你可以按下任意鍵暫停,再次按則繼續,按下ESC鍵退出。這就是全部的功能了,下面我們來看遊戲的實現。
無論是在實現功能時還是在程式碼分析的時候,分類歸納總是一個好習慣,這裡自然也不例外。
首先對所有程式碼分類:
1、整體上程式碼有一個配置模組,來對遊戲的速度、螢幕的寬度、香蕉移動速度、字型大小、各個物體的圖片等進行配置。
2、然後是有一個元素模組,即遊戲中的兩個元素落下來的鐵塊以及被砸的香蕉,其中還要包含他們具有的行為。
3、然後還有遊戲中的各種狀態模組,狀態模組中的類繼承關係稍微多一些,處於家譜最上方的就是state類,由它來衍生其他的所有狀態,它的直接子類是Level和Pause,其中Pause有衍生出子類Info、levelCleared、GameOver、StartUp。 4、最後就是遊戲的主模組,用來讓其他模組協調工作的。
然後再來看一個整體圖:
有了上面整體的認識,下面就要細揪一下了。我自己看程式碼的方法是這樣的,首先整體分析,然後在從程式的入口點開始分析。我估計大多數人也是這麼做的。
首先是squish.py檔案中的game類:
忽略掉init中的設定程式碼,在run中,該管理類首先呼叫pygame初始化並啟動遊戲介面,然後在一個while True的死迴圈中不斷的進行狀態判斷,事件處理,然後根據事件更新當前狀態,並且繪製介面。
讓我們把焦點放在那個死迴圈中,因為他就是整個程式的流程所在。 其中狀態和事件的關係就是,當發生某一事件之後,狀態就會發生變化,比如點選事件、過關事件、死亡事件。這些事件的來源分別是:使用者操作、系統判斷、系統判斷。要繼續深入分析就需要再拿一部分程式碼出來。
依然是來自squish.py檔案中剩餘的所有程式碼:
其中使用者判斷部分就是Paused類中的update方法和handle方法,而系統判斷就是Level類中的update方法。還有一個要注意的地方就是Level類中update方法中的第一行程式碼:self.sprites.update(),這是讓鐵塊不斷下落的關鍵程式碼。使用者判斷部分的程式碼已經有了,下面需要貼上系統判斷時用到的程式碼.
objects.py中的程式碼:
在類Banana和Weight中的update和touches方法,用於進行系統判斷。
好了,到這主要的東西都分析完了,剩下的只需要稍看一下就能夠懂得了。
最後還有一個配置模組的程式碼config.py:
到此為止,《python基礎教程》中的十個專案都已經分析了一遍,下一步要做的就是做幾個實用軟體出來,然後把python再好好深入研究下。
下面上幾個執行圖:
相關文章
- 這十個Python實戰專案,讓你瞬間讀懂Python!Python
- python能做什麼專案-這十個Python實戰專案,讓你瞬間讀懂Python!Python
- 這4個Python實戰專案,讓你瞬間讀懂Python!Python
- python專案歸納總結-這4個Python實戰專案,讓你瞬間讀懂Python!Python
- python十個實戰專案Python
- 7個Python實戰專案程式碼,讓你分分鐘晉級大神!Python
- 32個Python爬蟲實戰專案,滿足你的專案慌Python爬蟲
- 十幾個python小例子,從此愛上pythonPython
- 十個python熱門專案,你知道幾個Python
- 7個Python實戰專案程式碼,讓你感受下大神是如何起飛的!Python
- python實戰一個完整的專案-年終課程盤點|16 個 Python 綜合實戰專案合集Python
- 拯救Python新手的幾個專案實戰Python
- python實戰專案Python
- 驚爆!這些專案管理神器,讓你的工作效率瞬間翻倍!專案管理
- python專案例項原始碼-32個Python爬蟲實戰專案,滿足你的專案慌(帶原始碼)Python原始碼爬蟲
- 十個Python練手的實戰專案,學會這些Python就基本沒問題了Python
- 5個讓DBA愛上你的SQL技巧SQL
- 推薦7個Python上手實戰專案Python
- 推薦十大Python經典練手專案,讓你的Python技能點全亮Python
- 本週Github上資料科學Python有趣專案Github資料科學Python
- 你用 Python 做過什麼有趣的資料探勘專案?Python
- Python網路爬蟲實戰專案大全 32個Python爬蟲專案demoPython爬蟲
- Python專案實戰例項Python
- python爬蟲-33個Python爬蟲專案實戰(推薦)Python爬蟲
- 7個Python實戰專案程式碼,讓你30分鐘從零基礎晉級為大神!Python
- Python 五個有趣的彩蛋,你都知道嗎?Python
- 19個Python爬蟲專案讓你一次吃到撐Python爬蟲
- 32個Python爬蟲專案讓你一次吃到撐Python爬蟲
- 本週Github上7個有趣專案Github
- PYTHON基礎教程中的十個專案(1)Python
- 5 個有趣的 Python 開源專案「GitHub 熱點速覽」PythonGithub
- GooGle Hack——讓你瞬間成為駭客(轉)Go
- 艾偉也談專案管理,如何讓網民愛上你的網站專案管理網站
- 7個Python實戰專案(附原始碼),拿走就用Python原始碼
- Jenkins部署Python專案實戰JenkinsPython
- Python專案開發實戰1Python
- 10個理由讓你愛上程式設計師程式設計師
- 總有個瞬間,讓你下定決心踹掉這份工作!