申明: 本站飛宇網 https://feiyetopro.blogspot.com/。自網路收集整理之書籍、文章、影音僅供預覽交流學習研究,其[書籍、文章、影音]情節內容, 評論屬其個人行為, 與本網站無關。版權歸原作者和出版社所有,請在下載 24 小時內刪除,不得用作商業用途;如果您喜歡其作品,請支持訂閱購買[正版]。謝謝!
第7章 使用函數和模組來重用你的代碼
想一想你每天丟掉多少東西:礦泉水瓶、可樂罐、薯片袋子、包三明治的塑膠紙、包胡蘿蔔條或蘋果片的袋子、購物袋、報紙、雜誌等等。現在想想如果這些垃圾不分紙啊、塑膠啊還是易開罐什麼的,一股腦都地堆在你前進的方向上,那會是什麼樣的情景。
當然,你可能會儘量回收重用,這很好,因為沒人想爬過垃圾山才能去學校。我們並沒有坐在超級大的垃圾堆裡是因為你回收的那些玻璃瓶被熔化掉並重新做成了罐子和瓶子,紙張被做成了再生紙,塑膠會被做成更重些的塑膠產品。因此我們要重新利用那些本來要被扔掉的東西。
在編寫程式的世界裡,重用也同樣重要。顯然,你的代碼不會跑到垃圾堆裡去,但如果你不重複利用你現在做的事情,那麼最終你會打字打到手指酸痛。重用還會使你的代碼變得簡短而易讀。
你將在這一章裡學到,Python提供的多種重用代碼的方式。
7.1 使用函數
你已經見過一種重用Python代碼的方式。在前一章裡,我們用函數range和list來讓Python計數:

只要你會數數,自己打字來創建一個連續數字的清單並不難。但是這個清單越大,你需要打的字就越多。然而,如果你用函數的話,你可以用同樣簡單的方式來創建一個有上千個數字的清單。
下面的清單是使用list和range函數來產生的一個數位清單:

“函數”是一段代碼,它讓Python做某些事情。他們是重用代碼的一種方式——你可以在你的程式裡多次使用函數。
當你寫一些簡單的程式時,用函數很方便。一旦當你開始寫長一些的、更複雜的程式時,比方說遊戲程式,函數就更加必不可少了(如果你想在本世紀之內完成的話)。
7.1.1 函數的組成部分
一個函數有三個部分組成:名字、參數,還有函數體。下面的例子是一個簡單的函數:

這個函數的名字叫testfunc。它只有一個參數,叫myname。它的函數體就是緊接著由def開始的那一行的代碼塊。def是define(定義)的縮寫。參數是一個變數,只有使用函數的時候才存在。
你可以通過調用一個函數的名字來使用它,用括弧把它的參數值括起來:

函數可以有兩個、三個,或者任意個數的參數,而不是只能有一個:

兩個參數的值用逗號分開:

我們也可以先創建一些變數,然後在調用函數時使用它們:

函數常常需要返回一個值,這就用到了return(返回)語句。例如,你可以寫個函數來計算你存下來多少錢:

這個函數有三個參數。它把前兩項相加(pocket_money和paper_route)然後減去最後那個參數(spending)。計算的結果被返回,這個結果可以賦給一個變數(和我們給其他變數賦值的方式一樣)或者列印出來:

7.1.2 變數和作用域
在函數體內的變數在函數執行結束後就不能再用了,因為它只在函數中存在。在編寫程式的世界裡,這被稱為“作用域”。
讓我們來看一個簡單的函數,它使用了幾個變數,但是沒有任何參數:

在這個例子裡,我們在第

如果我們用print來調用這個函數,我們得到的結果是:200。然而,如果我們想要試著列印first_variable(或者second_variable)的內容的話,我們會得到一條錯誤資訊:

如果一個變數定義在函數之外,那麼它的作用域則不一樣。例如,讓我們在創建立函數之前先定義一個變數,然後嘗試在函數中使用它:

在這段代碼中,儘管變數first_variable和second_variable不可以在函數之外使用,變數another_variable(在函數之外的第
下面是調用這個函數的結果:

現在,假設你要用像可樂罐這樣的經濟材料建造一個太空船。你覺得你每個星期可以壓平兩個用來做太空船倉壁的罐子,但你要用大約500個罐子才能造出船身。我們可以很容易地寫出一個函數來幫我們計算,如果每週做兩個罐子的話總共需要多少時間來壓平500個罐子。
讓我們創建一個函數來顯示在每一周到一年內我們可以壓平多少罐子。我們的函數會把罐子的個數當作參數:

在函數的第一行,我們創建了一個叫total_cans(罐子合計)的變數並把它的值設置為0。然後我們創建一個對於一年中每一周的迴圈,並把每週壓平的罐子數累加起來。這個代碼塊就構成了我們函數的內容。但這個函數中還有另外一個代碼塊,它有兩行,就是構成了for迴圈的那個代碼塊。
讓我們試著在Shell程式中輸入這個函數,並通過不同的cans的數值來調用它:

這個函數可以用每週不同的罐數來反復重用,比你每次試著用不同的數位來把for迴圈重新輸入要高效得多。
函數還可以按模組的方式組織起來,這才使得Python能真正大展拳腳,而不只是做些雕蟲小技。
7.2 使用模組
模組用來把函數、變數,以及其他東西組織成更大的、更強的程式。有些模組內置在Python之中,還有一些可以單獨下載。這裡有説明你寫遊戲軟體的模組(如內置的tkinter,和非內置的PyGame),用來操縱圖像的模組(如PIL,Python圖像庫),還有用來畫3D立體畫的模組(如Panda3D)。
模組可以用來做各種有用的事情。例如,如果你在設計一個模擬遊戲,你想讓遊戲中的世界有真實感,你可以使用內置的叫time的模組來計算當前的日期和時間:

在這裡,import(引入)命令用來告訴Python我們想要使用模組time。
然後我們可以使用點號來調用在這個模組中的函數。(還記得嗎?我們在第4章就這樣使用過turtle模組的函數,比如t.forward(50)。)例如,下面的例子就是如何調用time模組中的asctime函數:

函數asctime是time模組的一部分,它作為一個字串返回當前的日期和時間。
現在假設你要讓別人用你的程式來輸入一個值,可能是他們的生日或他們的年齡。你可以使用print語句來顯示一條資訊,然後使用sys模組(sys是system,系統的縮寫),其中包含了與Python系統自身交互的工具。首先我們引入sys模快:

在sys模組中有一個特別的物件叫stdin(standard input的縮寫,標準輸入),它有一個很有用的函數叫readline。readline函數用來讀取來自鍵盤的一行文本輸入,直到你按回車鍵為止。(我們會在第8章解釋物件是如何工作的。)為了測試readline,在Shell程式中輸入以下代碼:

然後,如果你輸入一些字並按回車鍵,這些字會在Shell程式中列印出來。
回想一下我們在第5章寫的代碼,它用到了一個if語句:

除了創建一個變數age並在if語句之前給它賦一個特定的值,我們現在還可以讓別人輸入這個值。但首先讓我們把這些代碼放到一個函數中:

現在我們可以調用它了,先輸入這個函數的名字,然後在括弧中輸入數字。試試看吧!

真的可以!現在,讓我們用這個函數來得到一個人的年齡。(你可以多次的增加或修改函數。)

你認出在第

7.3 你學到了什麼
在這一章裡,你看到了在Python裡如何用函數來寫出可以重複使用的代碼,還有如何使用模組提供的函數。你學會了變數的作用域是如何控制它在函數內外的可見性的,還有如何用def關鍵字來創建函數。你還知道了如何引入模組來使用它的內容。
7.4 程式設計小測驗
自己寫一些函數來試試下面這些例子吧。答案可以在網站http://python-for-kids.com/ 上找到。
#1:算月球上的體重的基礎函數
在第6章中,有一個程式設計測驗建立了一個for迴圈來計算15年後你在月球上的體重。那個for迴圈可以很容易地變成一個函數。試著創建一個函數,它把起始體重和每年增加的重量當作參數。這個函數用起來是這樣的:

#2:月球體重函數外加年數
把你剛剛創建的那個函數改成可以使用不同的年數,比如5年或20年。記得要把函數改成要三個參數:起始體重、每年增加的體重,還有年數。
#3:月球體重程式
我們不光可以寫個簡單的需要傳入參數的函數,還可以寫個小程式用sys.stdin.readline()來提示輸入這些數值。這樣的話,調用這個函數就不再需要任何參數了:

這個函數會顯示一個資訊來詢問起始體重,然後第二個資訊來詢問每年將增加的體重,最後的資訊詢問的是多少年。差不多像這樣:

別忘了在創建函數之前先引入sys模組:







0 留言:
發佈留言