本節書摘來自華章計算機《樹莓派python程式設計指南》一書中的第3章,第3.4節,作者:(美) alex bradbury ben everard更多章節内容可以通路雲栖社群“華章計算機”公衆号檢視。
我們已經使用過一些函數,如print()和input()。這些都是python内置函數。你還可以自己定義函數。第2章中你已經定義過自己的函數,這裡我們來複習一下。看下這個:
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsIyZuBnL1AzY0YTN2UDO3IzN5MWZmVjZiJWY0MGZykjY5YzY3Y2Y5MTNmFGMl9CXt92Yu4GZjlGbh5SZslmZxl3Lc9CX6MHc0RHaiojIsJye.png)
這段代碼定義了一個名叫square(平方)的函數,然後使用這個函數計算了4的平方。使用它的時候需要在名字後面跟一個包含在小括号裡的數字——我們稱為參數。函數運作時,參數名(本例中是num)将會被指派為你給定的數字。return語句可以出現在程式中的某個地方,用來給主程式傳回資料。如果有多個return語句,python将在第一次遇到return時傳回。
你也可以建立包含多個參數的函數。例如,下面的程式就有一個函數需要兩個參數并傳回其中較大的一個。
https://yqfile.alicdn.com/e4e32549f0c7aef6c6961e7214bb86c41ec101bc.png
" >
至此為止,它們都工作地很好。然而如果需要在函數中改變了變量的值呢?看看下面的程式:
https://yqfile.alicdn.com/cae1a142976a4d5cbfac237cfc3cfd42af0c53f4.png" >
運作這段程式之前,先想一下運作結果。可以肯定的是,number_2将會是2,但number_1呢?它應該是1麼?因為我們在主程式中給它指派為1。還是2呢?因為我們把它傳遞給函數add_one()并在裡面改變了它的值。
運作後,你會發現number_1是1。這是因為這一行:
https://yqfile.alicdn.com/09bd8037b8efb83d25a4c9be5145322752daf1bb.png
你告訴python不想讓num繼續保持原來的值(和number_1一樣),而是給它一個加1後的新值。
然而,可變資料類型如清單、集合和對象就不一樣了。如果它們中的一種資料類型傳入函數并改變它,那麼作為參數傳入的原始值也會跟着變化。比如:
運作之後将得到:
https://yqfile.alicdn.com/80d59a103fd4fa8529b69928cb89b5ab8b6c073b.png
通常情況下,這樣做沒有什麼問題,但有時你并不想讓作為參數傳入的原始值發生變化。這種情況下,你需要使用copy.deepcopy(),不過首先你得導入copy子產品。如果你把上個例子改為:
你将得到:
可選參數
有時你需要建立這樣一個函數,它有時候需要參數,有時候不需要。比如,你可能需要建立函數increment(),該函數接受兩個參數并将它們相加。當隻給一個參數時,該函數就把這個參數加上1。這時候你就可以使用預設值(本例中為1)作為參數:
這裡唯一需要注意的就是可以省略的參數必須放在其他參數之後。