本節書摘來自異步社群《python 3程式開發指南(第2版•修訂版)》一書中的第1章,第1.5節,作者[英]mark summerfield,王弘博,孫傳慶 譯,更多章節内容可以通路雲栖社群“異步社群”公衆号檢視。
在本書的每一章最後,都有一節練習,設定練習的目的是鼓勵讀者對python進行實踐,擷取實際經驗,以助于吸收每章中所學的知識。本節包括的執行個體與練習既涉及數字處理,也涉及文本處理,以便盡可能滿足更多讀者的需求。此外,這些執行個體與練習都有非常小的代碼規模,以便于讀者将重點和注意力集中于學習與思考,而不是僅僅輸入代碼。本書的執行個體中,為每個練習都提供了一個解決方案。
1.bigdigits.py程式的一個變形,不再列印*,而是列印具體的數字。例如:
可以采取兩種方法。最簡單的方法隻是簡單地改變清單中的,但這種方法太過死闆,也不是你應該采取的方法。讀者應該采取的方法是,改變處理代碼,不再将每個數字的行字元串一次性地添加到行,而是逐個字元添加,遇到時,就使用相關的數字替代。
為實作上述方法,可以複制本章中講解的bigdigits.py,并修改其中大概5行,這些工作并不難,但稍有些微妙之處。對于這一練習題,提供了解決方案bigdigits_ans.py。
2.idle可以用作一個功能非常強大而靈活的電腦,但有時候,針對特定任務的電腦也是有用的。建立一個程式,該程式提示使用者在while循環中輸入數值,并根據輸入的數值逐漸建構一個清單。使用者結束輸入(按enter鍵)時,列印出輸入的數值本身、輸入數值個數、輸入數值和、輸入的最小值與最大值以及平均值(sum/count),下面給出一個運作執行個體:
要完成這一程式,需要大約4行代碼初始化必要的變量(空清單使用[]表示),少于15行代碼實作while循環,包括基本的錯誤處理,最後列印相關結果也可以在幾行代碼中實作,是以,整個程式(包括為代碼清晰添加的空白行)應該在25行左右。
3.有些情況下,我們需要生成測試文本——比如,在網站真實内容可用之前,生成一個web站點的設計方案,或者在開發報告寫入者之前提供測試内容。為這一目的,可以編寫一個用于生成可怕的詩歌(那種讓vogon都自愧不如的詩歌)的程式。
建立一些詞彙清單,比如,冠詞("the"、"a"等)、主題("cat"、"dog"、"man"、"woman")、動詞("sang"、"ran"、"jumped")與狀語("loudly"、"quietly"、"well"、"badly")等,之後循環5次,在每次疊代中,使用random.choice()函數選取冠詞、主題、動詞、狀語等内容。使用random.randint()函數在兩種語句結構之間進行選擇:冠詞、主題、動詞、狀語;隻包括冠詞、主題與動詞,之後列印語句,下面給出了一個運作的執行個體:
為實作上述功能,你需要導入random子產品。清單部分大概需要4~10行代碼完成,具體代碼量依賴于在其中放置多少詞彙;循環本身需要不到10行代碼,加上一些必要的空白行,整個程式代碼量大約在20行左右。對于這一練習題,提供了解決方案awfulpoetry1_ans.py。
4.為了使得産生可怕詩歌的程式功能更豐富,可以向其中添加一些代碼,以便于使用者在指令行上輸入一個數字(在1與10之間)時,程式将輸出該數字代表的行數。如果沒有給定指令行參數,預設就像以前一樣列印5行。為了完成上述任務,需要改變主循環(比如,變為一個while循環)。要記住的是,python的比較操作符可以結鍊,是以,在檢查某參數是否在範圍内時,并不需要使用邏輯and操作符。添加這些額外的功能,大概需要10行代碼。對于這一練習題,提供了解決方案awfulpoetry2_ans.py.
5.對于練習2,如果可以計算中間值以及平均值,那麼應該是一個不錯的功能。為了做到這一點,我們必須對清單進行排序。在python中,清單可以很容易地使用list.sort()方法排序,但是目前尚未講解這方面的知識,是以這裡不适用這種方法。使用一段對數清單排序的代碼,擴充平均值計算程式——不需要太考慮性能問題,使用你能想到的最簡單的方法即可。對清單排序後,如果清單有奇數個資料項,中間值就是中間那個資料項的值;如果清單有偶數個資料項,中間值就是兩個中間項值的平均值。計算中間值,并将其與其他相關資訊一起輸出。
上面的要求還是相當棘手的,對不熟練的程式員更是如此。如果你已具備一些python程式設計經驗,可能仍然會感覺到有些棘手,尤其是要限定在使用本書到此為止講解的相關知識。排序需要大約十幾行代碼,中間值計算(注意不能使用modulus操作符,因為本書尚未講到)大約要4行代碼。對于這一練習題,提供了解決方案average2_ans.py。