習(xí)題 36: 設(shè)計和調(diào)試

現(xiàn)在你已經(jīng)學(xué)會了“if 語句”,我將給你一些使用“for 循環(huán)”和“while 循環(huán)”的規(guī)則, 一面你日后碰到麻煩。我還會教你一些調(diào)試的小技巧,以便你能發(fā)現(xiàn)自己程序的問題。最后,你將需要設(shè)計一個和上節(jié)類似的小游戲,不過內(nèi)容略有更改。
If 語句的規(guī)則?
每一個“if 語句”必須包含一個 else.
如果這個 else 永遠都不應(yīng)該被執(zhí)行到,因為它本身沒有任何意義,那你必須在 else 語句后面使用一個叫做 die 的函數(shù),讓它打印出錯誤信息并且死給你看,這和上一節(jié)的習(xí)題類似,這樣你可以找到很多的錯誤。?
“if 語句”的嵌套不要超過 2 層,最好盡量保持只有 1 層。這意味著如果你在 if 里邊又有了一個 if,那你就需要把第二個 if 移到另一個函數(shù)里面。?
?將“if 語句”當(dāng)做段落來對待,其中的每一個 if, elif, else 組合就跟一個段落的句子組合一樣。在這種組合的最前面和最后面留一個空行以作區(qū)分。?
你的布爾測試應(yīng)該很簡單,如果它們很復(fù)雜的話,你需要將它們的運算事先放到一個變量里,并且為變量取一個好名字。?
如果你遵循上面的規(guī)則,你就會寫出比大部分程序員都好的代碼來。回到上一個練習(xí)中,看看我有沒有遵循這些規(guī)則,如果沒有的話,就將其改正過來。?
Warning?
在日常編程中不要成為這些規(guī)則的奴隸。在訓(xùn)練中,你需要通過這些規(guī)則的應(yīng)用來鞏固你學(xué)到的知識,而在實際編程中這些規(guī)則有時其實很蠢。如果你覺得哪個規(guī)則很蠢,就別使用它。?
循環(huán)的規(guī)則?
只有在循環(huán)永不停止時使用“while 循環(huán)”,這意味著你可能永遠都用不到。這條只有 Python 中成立,其他的語言另當(dāng)別論。?
?其他類型的循環(huán)都使用“for 循環(huán)”,尤其是在循環(huán)的對象數(shù)量固定或者有限的情況下。
調(diào)試(debug)的小技巧?
不要使用 “debugger”。 Debugger 所作的相當(dāng)于對病人的全身掃描。你并不會得到某方面的有用信息,而且你會發(fā)現(xiàn)它輸出的信息態(tài)度,而且大部分沒有用,或者只會讓你更困惑。
?最好的調(diào)試程序的方法是使用 print 在各個你想要檢查的關(guān)鍵環(huán)節(jié)將關(guān)鍵變量打印出來,從而檢查哪里是否有錯。
讓程序一部分一部分地運行起來。不要等一個很長的腳本寫完后才去運行它。寫一 點,運行一點,再修改一點。?
家庭作業(yè)?
寫一個和上節(jié)練習(xí)類似的游戲。同類的任何題材的游戲都可以,花一個星期讓它盡可能有趣一些。
作為加分習(xí)題,你可以盡量多使用列表、函數(shù)、以及模組(記 得習(xí)題 13 嗎?),而且盡量多弄一些新的 Python代碼讓你的游戲跑起來。 不過有一點需要注意,你應(yīng)該把游戲的設(shè)計先寫出來。在你寫代碼之前,你應(yīng)該設(shè)計出游戲的地圖,創(chuàng)建出玩家會碰到的房間、怪物、以及陷阱等環(huán)節(jié)。 一旦搞定了地圖,你就可以寫代碼了。如果你發(fā)現(xiàn)地圖有問題,就調(diào)整一下地圖, 讓代碼和地圖互相符合。?
最后一個建議:每一個程序員在開始一個新的大項目時,都會被非理性的恐懼影響到。為了避免這種恐懼,他們會拖延時間,到最后一事無成。我有時會這樣, 每個人都會有這樣的經(jīng)歷,避免這種情況的最好的方法是把自己要做的事情列出 來,一次完成一樣。 開始做吧。先做一個小一點的版本,擴充它讓它變大,把自己要完成的事情一一 列出來,然后逐個完成就可以了。
