python 是使用最廣泛的動態(tài)編程語言之一。它支持一組豐富的包、圖形用戶界面(Graphical User Interface,GUI)庫和Web框架,讓你能夠構(gòu)建出高效的跨平臺應(yīng)用。它是一種理想的快速應(yīng)用開發(fā)語言。如此快速的開發(fā)通常會帶來一些問題,容易導(dǎo)致代碼的整體質(zhì)量、性能和擴展性的降低。本文將會告訴你處理此類情況的方法,并幫助你開發(fā)出更好的Python應(yīng)用。
本文是摘自《Python應(yīng)用開發(fā)實戰(zhàn)》的導(dǎo)言部分,這是一個對Python編程的回顧。正因如此,希望你最好已掌握一些關(guān)于Python語言的知識,同時也了解面向?qū)ο缶幊蹋∣bject Oriented Programming,OOP)的概念。
?
?《Python應(yīng)用開發(fā)實戰(zhàn)》
[美] 尼納德·薩斯葉(Ninad Sathaye) 著
下面是本文內(nèi)容的組織結(jié)構(gòu):
我們將從安裝的先決條和搭建合適的Python開發(fā)環(huán)境開始。
為了給本書余下的部分定下基調(diào),下一節(jié)將會對本書的高奇幻主題做一個簡要介紹。
接下來是我們的第一個程序。這是一個簡單的基于文本的奇幻游戲,它是一個Python腳本。
我們會給游戲增加一些復(fù)雜度,然后使用簡單的函數(shù)開發(fā)出游戲的改善版本。
接下來,我們會逐漸給游戲增加更多的特性,并用面向?qū)ο蟮母拍钪匦略O(shè)計代碼。
最后會簡要提及Python的抽象基類(Abstract Base Class,ABC)。
代碼解釋會稍顯冗余。有經(jīng)驗的讀者可以跳過這些例子直接進(jìn)入下一章,但要確保你已理解本書的主題,并復(fù)習(xí)一下ch01_ex03.py文件中的代碼。
1.1 重要提示
在閱讀本文余下的部分之前,讓我們先來了解一些事項。如果你尚未了解,你應(yīng)該閱讀前言,其中記錄了以下大多數(shù)事項:
每章都有各自的一組Python源文件。盡管我們會討論大部分代碼,但是要保證你的手上有相關(guān)源文件。
源代碼可以從Packt Publishing的網(wǎng)站上進(jìn)行下載。請參照前言中相關(guān)說明。
本書中的示例代碼兼容Python 3.5.1版本。支持代碼包也提供兼容Python 2.7.9的文件。
正如前文提到的,本書需要讀者熟悉Python語言基礎(chǔ),并了解面向?qū)ο缶幊谈拍睢?/p>
本書使用一個有趣的、基于文本的游戲主題作為工具來解釋應(yīng)用開發(fā)過程的各個方面,但是這本書本身并不是關(guān)于游戲程序開發(fā)的!
本書通常不提供練習(xí)題目(如果有的話)的解決方案。
本書中提供一些外部鏈接(Uniform Resource Locator,URL)可供讀者進(jìn)行擴展閱讀。隨著時間推移,某些鏈接可能會失效。如果出現(xiàn)這種問題,請嘗試使用恰當(dāng)?shù)年P(guān)鍵字到網(wǎng)上去搜索。
1.2 安裝的先決條件
要確保已經(jīng)安裝了必要的軟件。表1-1總結(jié)了本章和后續(xù)需要的一些基本工具。下一節(jié)中會有更詳盡的安裝說明。
表1-1 安裝軟件?
?在接下來的章節(jié)中,我們需要安裝一些其他的依賴軟件。Python包管理器(pip)將會完成這項瑣碎的工作。
你已經(jīng)安裝了Python的必要環(huán)境或者你已經(jīng)知道如何安裝了嗎?如果是,那么請你跳過接下來的安裝說明,直接進(jìn)入本書的主題章節(jié),開始真正的實踐內(nèi)容。
安裝Python
安裝Python有兩種方法。你可以使用官方發(fā)行版本的Python或者任何一種可免費獲取的捆綁發(fā)行版本。
1.方法1——官方發(fā)行版本
對于Linux或Mac用戶來說,你的系統(tǒng)中可能已經(jīng)安裝了Python。如果沒有,你可以使用系統(tǒng)中的包管理器進(jìn)行安裝。Windows用戶可以通過Python官方網(wǎng)站下載Install Python來安裝Python 3.5,如圖1-1所示。?
圖1-1
如上面的安裝截屏所示,在安裝過程中,請確保選中“Add Python 3.5 to PATH”的選項。你也可以訪問Python的官方網(wǎng)站來下載特定平臺的發(fā)行版本。
2.方法2——捆綁發(fā)行版本
有很多Python免費發(fā)行版本,這些版本捆綁了很多實用的包,包括pip和IPython。表1-2總結(jié)了一些最流行的Python發(fā)行版本,其中包括官方發(fā)行版本。
表1-2 Python發(fā)行版本?
?3.Python安裝位置
讓我們簡單說說Python的安裝位置,以及如何確保在你的終端窗口中
python
是一個可用的命令。當(dāng)然,事情可能會因情況不同而各異,這取決于你的安裝位置和你選擇的Python發(fā)行版本。
Python的官方文檔頁面有豐富的關(guān)于在不同平臺上安裝Python的信息。一旦你有超出本書所涵蓋內(nèi)容的需求時,可以參考官方網(wǎng)站給你提供進(jìn)一步的幫助。
類UNIX操作系統(tǒng)
在類UNIX操作系統(tǒng)如Linux中,典型的默認(rèn)安裝路徑通常是/usr/bin/python 或者/usr/local/bin/python。
如果你使用系統(tǒng)中自帶的包管理器安裝Python,那么在終端窗口中是可以使用命令Python或者Python 3的。如果命令不可用,你需要更新系統(tǒng)環(huán)境變量PATH,使其包含Python的可執(zhí)行文件路徑。例如,你的系統(tǒng)中有Bash shell,在用戶目錄下的.bashrc文件中增加如下配置:?
?用你的Python實際安裝路徑來替換/usr/bin。
Windows操作系統(tǒng)
在Windows操作系統(tǒng)中,典型的Python默認(rèn)安裝路徑如下: C:UsersnameAppData LocalProgramsPythonPython35-32 python.exe。用你的Windows用戶名替換name。根據(jù)安裝文件和操作系統(tǒng)的不同,Python的安裝路徑也可能是Python 35-64。正如前面提到的,在安裝的時候,你需要選擇“Add Python 3.5 to PATH”,以保證Python或python.exe自動被識別為命令。另外,你也可以重新運行安裝文件并選中該選項。
4.驗證Python安裝
打開終端窗口(或者是Windows操作系統(tǒng)中的命令提示符)并輸入下面的命令來驗證Python的版本。只有安裝了Python并且該命令在終端窗口中是可用命令時,那么該命令才會生效。否則,需要指定Python可執(zhí)行文件的全路徑。例如,在Linux上,如果Python安裝在/usr/bin下,你可以這樣指定/usr/bin/python:?
注意,上面的命令行中的$符號屬于終端窗口,它并不是命令本身的一部分。也就是說,實際的命令只是python -V。在Linux的終端窗口中,對普通用戶來說$或%是一個提示符。對root用戶(管理員)來說,提示符是#。類似的,在Windows系統(tǒng)中,對應(yīng)的符號是>。你要在這個符號的后面輸入實際的命令。
如果我們運行上述命令,下面是一個可能的輸出示例:?
?5.安裝pip
pip是一個軟件包管理器,它使得從官方的第三方軟件庫PyPI中安裝Python包變得十分簡單。pip在Python 2的2.7.9以上版本,以及Python 3的3.4以上版本中已經(jīng)安裝好了。如果你使用其他版本的Python,可以在https://pip.pypa.io/en/stable/installing中找到安裝說明。
在Linux操作系統(tǒng)下,pip和Python可執(zhí)行文件的默認(rèn)位置是相同的。例如,如果Python安裝在/usr/bin/python,那么pip的路徑應(yīng)該是/usr/bin/pip。在Windows操作系統(tǒng)下,pip.exe通常默認(rèn)安裝在如下位置:C:UsersnameAppDataLocalProgramsPythonPython35-32 Scriptspip.exe。正如前文提到,用你的Windows用戶名替換路徑中的name。根據(jù)安裝文件和操作系統(tǒng)的不同,Python的安裝路徑也有可能是Python 35-64。
6.安裝IPython
這是一個可選的安裝。IPython是一個增強版的Python解釋器。如果你使用的發(fā)行版本沒有捆綁它,那么你可以使用以下命令進(jìn)行安裝:?
?安裝完成后,在終端中輸入ipython就可以啟動IPython的交互shell。Anaconda Python 3.5發(fā)行版的IPython shell截圖如下。
通常,使用Jupyter Notebook來書寫和分享交互程序是非常方便的。它是一個Web應(yīng)用程序,可以在交互環(huán)境下編寫帶有富文本、圖片、函數(shù)等內(nèi)容的Python代碼。欲獲取更多詳情,請訪問該項目的主頁。Jupyter Notebook可以通過以下方式進(jìn)行安裝:
7.選擇集成開發(fā)環(huán)境
選擇IDE進(jìn)行開發(fā)是個人的喜好問題。簡單來說,IDE是一個旨在加快應(yīng)用程序開發(fā)的工具。它通過對開發(fā)人員最常用的工具的集成,從而讓他們能夠來快速編寫出高效的代碼。Python安裝時帶有一個叫作IDLE的程序。這是一個基礎(chǔ)的Python IDE,可供你入門時使用。對于高級的開發(fā),你可以從眾多免費的或商業(yè)的工具中選擇一個。任何一款優(yōu)秀的Python IDE至少都具有以下幾個特點:
具有代碼自動完成和語法高亮功能的代碼編輯器。
具有可以瀏覽文件、項目、函數(shù)和類的代碼瀏覽器。
具有可以交互識別問題的調(diào)試器。
集成版本控制系統(tǒng),例如Git。
你可以嘗試從一款免費的IDE開始。下面列出部分流行的IDE。如果你只對簡單的源代碼編輯器感興趣,可以瀏覽https://wiki.python.org/moin/PythonEditors,表1-3提供了一些可供選擇的編輯器。
表1-3 可選的IDE?
?1.4 本書的主題
你讀過諸如《指環(huán)王》或托爾金的《霍比特人》等奇幻小說嗎?或者說看過根據(jù)這些小說改編的電影嗎?那么,好,這是一本高奇幻的、托爾金式的關(guān)于Python應(yīng)用開發(fā)的書籍。
更多關(guān)于J.R.R.托爾金的作品,請訪問相關(guān)網(wǎng)站。高奇幻一詞通常被用來代表交替虛幻世界中的一些列奇幻主題。
這本書帶你來到一個虛構(gòu)的世界,在那里你將開發(fā)一個基于上述主題的文本游戲。是的,即使在這個想象的世界里,你仍然可以繼續(xù)成為一個開發(fā)人員!在閱讀本書的過程中,將會有很多許多虛構(gòu)的人物陪伴著你。當(dāng)你學(xué)習(xí)Python開發(fā)的不同方面時,這些人物會跟你對話,問問題,提出新的功能,甚至與敵人打架。
應(yīng)該指出的是,本書不是關(guān)于游戲應(yīng)用程序開發(fā)的。本書只是使用一個簡單的基于文本的游戲作為一種媒介,來學(xué)習(xí)Python開發(fā)的各個方面。
說一句題外話,如果你有興趣玩一個高奇幻主題的游戲,那么你有相當(dāng)多的選擇。在諸多開源的項目中,《韋諾之戰(zhàn)》是評價最高的、免費的、高奇幻主題的回合制策略游戲。請訪問該游戲官網(wǎng)查看更多詳情。
了解本書人物
讓我們來認(rèn)識一下本書各章節(jié)中那些會一直陪伴你的想象中的人物,參見表1-4。
表1-4 人物說明?
?Foo先生
Foo先生是一個人類騎士,一個被描繪成守護(hù)著南部平原的大騎士。他是本書中的主要人物,并會在本書中一直與我們進(jìn)行交談?
?獸人騎士
獸人是一個類似人類的想象中的動物。在這里,他被描繪成一個敵方的士兵。獸人的坐騎是一種類似于野豬的動物。在本章中,你就將遇到這個生物?
?精靈騎士
精靈是一種超自然的神靈。精靈通常騎在一匹小馬上。他被描繪成一個友好的伙伴。你會在第6章中遇到精靈先生?
?仙子
仙子是擁有與生俱來的魔力而且十分聰明的仙女。她的魔法只在第7章(詳見O(log n))中使用過一次,用來尋找她的魔法盒。你會在第6章中第一次遇到仙子?
?侏儒
侏儒是一種矮小的、類似人類的神話中的存在。他被描繪成為Foo山的“大侏儒”。他問了很多問題。從本書第6章開始的后半部分里,你會看到侏儒的身影有了這個有趣的主題作為一個工具,讓我們通過簡單的命令行應(yīng)用程序開始我們的Python之旅。這將是一個基于文本的游戲。在接下來幾章中會增加一些復(fù)雜度,隨之而來的一些有趣的問題會不斷給你帶來挑戰(zhàn)。這本書將向你展示如何優(yōu)雅地處理這種情況。
1.4 簡單的腳本——獸人之襲V0.0.1
我們已經(jīng)安裝了必要的工具和開發(fā)環(huán)境,現(xiàn)在是時候來編寫我們的第一個Python程序了。這是一個簡單的靠碰運氣取勝的游戲,同時也是一個命令行游戲。隨著本書內(nèi)容的不斷推進(jìn),我們會給游戲增加更多的復(fù)雜度,通過學(xué)習(xí)到的新技術(shù)來開發(fā)更加高效的程序。所以,準(zhǔn)備行動吧!
1.4.1 游戲簡介——獸人之襲v0.0.1
在人類和他們的敵人之間的戰(zhàn)爭中,獸人就是第一個到來的敵人。一支巨大的獸人軍隊正在向人類的聚集地進(jìn)發(fā)。他們幾乎摧毀了行進(jìn)道路上的一切。人類不同種族的首領(lǐng)們聯(lián)起手來擊敗他們最強大的敵人,來共同為他們的偉大時代而戰(zhàn)斗。人們都被召集起來參加了軍隊。Foo先生,一個保衛(wèi)南部平原的勇敢騎士,穿過一片未知的茂密森林,開始長途跋涉,向東部進(jìn)發(fā)。兩天兩夜,他小心翼翼地穿過茂密的樹林。在路上,他發(fā)現(xiàn)了一個小的孤立定居點。因為疲勞的原因,再加上要希望補充糧食儲備,他決定繞道而行。當(dāng)他走進(jìn)村莊時,他看見了五個木屋,如圖1-2所示。周圍沒有發(fā)現(xiàn)任何人。猶豫之后,他決定走進(jìn)其中一間木屋……?
?1.4.2 問題說明
你正在設(shè)計一個簡單的游戲,游戲中玩家需要為Foo先生選擇一個木屋。這些木屋是隨機被同伴或敵人占據(jù)的。同時,有些木屋仍有可能是空閑的。如果選擇的是一個被敵人所占據(jù)的木屋,那么玩家就輸?shù)舯荣?。如果是另外的兩種場景,那么玩家就贏得比賽。
1.4.3 偽代碼——0.0.1版本
現(xiàn)在游戲的目標(biāo)已經(jīng)明確了,請打開你最喜歡的編輯器,并記錄下主要的步驟。通常這被稱作偽代碼。
當(dāng)用戶希望一直玩這個游戲時:
- 打印游戲的任務(wù);
- 創(chuàng)建一個木屋的列表;
- 在5個木屋中隨機分配敵人、同伴或空閑類型;
- 提示用戶選擇一個木屋的編號;
- 如果選中敵人占據(jù)的木屋,打印“你輸了”;
- 否則,打印“你贏了”。
正如你所注意到的,代碼的關(guān)鍵部分就是讓同伴或者敵人隨機占據(jù)木屋,并且保持剩下的木屋是未被占據(jù)的空閑狀態(tài)。我們要如何實現(xiàn)呢?讓我們用Python解釋器來快速地解決這個問題。如果你安裝了IPython,啟動IPython解釋器;否則,就通過在終端窗口中輸入 python 命令來使用默認(rèn)的Python解釋器。首先,我們需要一個Python list來保存所有木屋占有者的類型。接下來,我們將使用內(nèi)置 random模塊并調(diào)用 random.choice 來從列表中隨機取得一個元素。代碼如下面的屏幕截圖所示:?
?現(xiàn)在,我們只需要編寫其他的條件代碼即可。接下來,讓我們來查看一下代碼。
1.4.4 代碼查看
從為本章提供的補充代碼包中下載源代碼文件 ch01_ex01.py 。文件擴展名 .py 表明它是一個Python文件。在Python編輯器或你選擇的一款I(lǐng)DE中打開它。建議在閱讀以下討論時,請保持隨時能查看該文件。通常能夠瀏覽完整的代碼會讓你更容易且更好地理解它。觀察下面的代碼片段,它只是上文提到的文件中的 if __name__ == \’__main__\’ 條件代碼塊中的一小部分。
如果你安裝的是Python 2.7.9的話,支持代碼包中有一個單獨的Python 2.7.9兼容源代碼文件。?
?讓我們來看一下上面截圖的代碼片段。
前兩行代碼導(dǎo)入了兩個內(nèi)置模塊,從而獲得這些模塊中提供的功能。 textwrap 模塊為命令行中的消息提供了很好的格式打印功能。
if條件塊 if __name__ == \’__main__\’ ,只有當(dāng)該文件作為一個獨立的腳本運行時才會被調(diào)用。換句話說,如果在其他文件中導(dǎo)入此文件,那么在條件塊中的代碼將不會被執(zhí)行。
現(xiàn)在,讓我們看看這個條件塊中的代碼。首先,我們會初始化一些變量。如前面所示的那樣, occupants 列表存儲了木屋占有人的類型。
最后幾行代碼只是對終端窗口中打印的文本進(jìn)行格式化。變量 dotted_line 是一個字符串,它是由72個連字符組成的一條長線。
代碼中的ASCII轉(zhuǎn)義序列是用來用粗體打印文本。序列033[1m表示使用粗體文本,033[0m表示返回到正常的打印樣式。
接下來的幾行代碼主要是在控制臺中打印關(guān)于游戲的進(jìn)一步信息:?
?讓我們看一看上面截圖中的代碼:
變量msg是一個非常長的變量。這也是textwrap被時常用到的地方。
使用textwrap.fill會讓每行以72個字符長度的方式來對消息進(jìn)行顯示,長度是通過前面代碼中定義的變量width來指定的。
現(xiàn)在,讓我們來看看下面的while循環(huán)吧。
對于Python 2.7.9來說,在上面的第一個示例代碼中唯一需要修改的是將調(diào)用內(nèi)置函數(shù)input的地方替換成raw_input:?
?
?最外層的循環(huán)讓玩家可以選擇重新開始游戲。
通過使用 random.choice ,我們可以隨機從 occupants 列表中挑選一個占有者,然后把它增加到小木屋的列表中。這個之前有過說明。
內(nèi)置的 input 函數(shù)用一個整數(shù)來接受用戶選擇的一個小木屋編號。變量 idx 用來存儲一個數(shù)字。
接下來,通過打印明細(xì)來表明占有者的信息。最后,根據(jù)與小木屋編號對應(yīng)的列表項來確定贏家。需要注意的是,huts 列表的索引是從0開始的。因此,根據(jù)選定的小木屋編號 idx 來取得相應(yīng)的列表項時,我們需要使用 idx-1 作為列表的索引。
1.4.5 運行獸人之襲v0.0.1
假設(shè)你的系統(tǒng)環(huán)境變量PATH中已經(jīng)包含了Python(可能是Python或者Python 3)的話,那么可以通過以下方式在命令行運行該程序:?
??僅此而已!請玩玩這個游戲,并嘗試選擇正確的木屋來解救Foo先生吧!下面的Linux終端窗口的快照顯示了程序的運行情況:?
?本文摘自《Python應(yīng)用開發(fā)實戰(zhàn)》?
?《Python應(yīng)用開發(fā)實戰(zhàn)》
[美] 尼納德·薩斯葉(Ninad Sathaye) 著
?用Python 3.5構(gòu)建健壯的、可重用的、高效的應(yīng)用程序 ;輕松奇幻的學(xué)習(xí)主線,解決Python開發(fā)中遇到的實際問題
本書使用一個生動有趣的、基于文本的游戲主題作為講解內(nèi)容來介紹Python應(yīng)用開發(fā)過程的各個方面。全書共10章,涉及簡單應(yīng)用開發(fā)、模塊化、打包和發(fā)布應(yīng)用的代碼、文檔規(guī)范、單元測試、重構(gòu)、設(shè)計模式、性能監(jiān)測、性能優(yōu)化、GUI應(yīng)用、MVC框架等方方面面的軟件開發(fā)知識和技能。
版權(quán)聲明:本文內(nèi)容由互聯(lián)網(wǎng)用戶自發(fā)貢獻(xiàn),該文觀點僅代表作者本人。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如發(fā)現(xiàn)本站有涉嫌抄襲侵權(quán)/違法違規(guī)的內(nèi)容, 請發(fā)送郵件至 舉報,一經(jīng)查實,本站將立刻刪除。