天天看點

《樹莓派Python程式設計指南》——3.4 使用函數複用代碼

本節書摘來自華章計算機《樹莓派python程式設計指南》一書中的第3章,第3.4節,作者:(美) alex bradbury ben everard更多章節内容可以通路雲栖社群“華章計算機”公衆号檢視。

我們已經使用過一些函數,如print()和input()。這些都是python内置函數。你還可以自己定義函數。第2章中你已經定義過自己的函數,這裡我們來複習一下。看下這個:

《樹莓派Python程式設計指南》——3.4 使用函數複用代碼

這段代碼定義了一個名叫square(平方)的函數,然後使用這個函數計算了4的平方。使用它的時候需要在名字後面跟一個包含在小括号裡的數字——我們稱為參數。函數運作時,參數名(本例中是num)将會被指派為你給定的數字。return語句可以出現在程式中的某個地方,用來給主程式傳回資料。如果有多個return語句,python将在第一次遇到return時傳回。

你也可以建立包含多個參數的函數。例如,下面的程式就有一個函數需要兩個參數并傳回其中較大的一個。

《樹莓派Python程式設計指南》——3.4 使用函數複用代碼

https://yqfile.alicdn.com/e4e32549f0c7aef6c6961e7214bb86c41ec101bc.png

" >

至此為止,它們都工作地很好。然而如果需要在函數中改變了變量的值呢?看看下面的程式:

《樹莓派Python程式設計指南》——3.4 使用函數複用代碼

https://yqfile.alicdn.com/cae1a142976a4d5cbfac237cfc3cfd42af0c53f4.png" >

《樹莓派Python程式設計指南》——3.4 使用函數複用代碼

運作這段程式之前,先想一下運作結果。可以肯定的是,number_2将會是2,但number_1呢?它應該是1麼?因為我們在主程式中給它指派為1。還是2呢?因為我們把它傳遞給函數add_one()并在裡面改變了它的值。

運作後,你會發現number_1是1。這是因為這一行:

《樹莓派Python程式設計指南》——3.4 使用函數複用代碼

https://yqfile.alicdn.com/09bd8037b8efb83d25a4c9be5145322752daf1bb.png

你告訴python不想讓num繼續保持原來的值(和number_1一樣),而是給它一個加1後的新值。

然而,可變資料類型如清單、集合和對象就不一樣了。如果它們中的一種資料類型傳入函數并改變它,那麼作為參數傳入的原始值也會跟着變化。比如:

《樹莓派Python程式設計指南》——3.4 使用函數複用代碼

運作之後将得到:

《樹莓派Python程式設計指南》——3.4 使用函數複用代碼

https://yqfile.alicdn.com/80d59a103fd4fa8529b69928cb89b5ab8b6c073b.png

通常情況下,這樣做沒有什麼問題,但有時你并不想讓作為參數傳入的原始值發生變化。這種情況下,你需要使用copy.deepcopy(),不過首先你得導入copy子產品。如果你把上個例子改為:

《樹莓派Python程式設計指南》——3.4 使用函數複用代碼

你将得到:

《樹莓派Python程式設計指南》——3.4 使用函數複用代碼

可選參數

有時你需要建立這樣一個函數,它有時候需要參數,有時候不需要。比如,你可能需要建立函數increment(),該函數接受兩個參數并将它們相加。當隻給一個參數時,該函數就把這個參數加上1。這時候你就可以使用預設值(本例中為1)作為參數:

《樹莓派Python程式設計指南》——3.4 使用函數複用代碼

這裡唯一需要注意的就是可以省略的參數必須放在其他參數之後。