Python編程:有關函數返回值以及最佳實踐基本指導原則
本篇內容作為以函數為主題的最后一篇,來介紹一下函數返回值以及編寫函數的一些基本的最佳實踐指導原則。
函數輸出:返回值
函數的返回值是Python領先于競爭對手的東西之一。在大多數其他語言中,函數通常只允許返回一個對象,但是在Python中,你可以返回一個元組——這意味著可以返回任何你想要的東西。這個特性允許程序員編寫用其他語言編寫的軟件要困難得多,或者肯定會更加乏味。我們已經說過,要從函數返回一些東西,我們需要使用return語句,后面跟著我們想要返回的東西。函數體中可以根據需要有多個返回語句。
另一方面,如果在函數體中我們不返回任何東西,或者我們調用一個“裸”return語句,函數將返回None。當不需要時,這種行為是無害的,但是也允許你整些有趣的模式的,確認Python是一種非常一致的語言。
我們說它是無害的,因為你永遠不會被迫收集函數調用的結果。下面將通過一個例子向你展示所說的意思:
注意,整個函數體僅由pass語句組成。正如官方文檔告訴我們的那樣,pass是一個空操作,因為當它被執行時,什么也不會發生。當語法上需要語句但不需要執行代碼時,它作為占位符非常有用。在其他語言中,我們可能只需要用一對花括號({})來表示,這定義了一個空作用域;但在Python中,作用域是由縮進代碼定義的,因此像pass這樣的語句是必要的。
還要注意,func()的第一個調用返回一個沒有接收的值(None)。正如我們前面提到的,接收函數調用的返回值不是必須的。
這很好,但不是很有趣,我們寫一個有趣的函數怎么樣?還記得我們討論過階乘函數。讓我們在這里編寫我們自己的實現(為了簡單起見,我們假設函數總是用適當的值正確調用,所以我們不需要檢查輸入參數):
注意,我們有兩個返回點。如果n是0或1,則返回1。否則,我們執行所需的計算并返回結果。
提示:在Python中,通常使用in操作符來進行成員檢查,就像我們在前面的例子中所做的那樣,而不是更冗長的檢查:
if n == 0 or n == 1:
…
現在再來試著把這個函數寫得更簡潔一點:
這個簡單的示例展示了Python是如何既優雅又簡潔的。即使我們從未見過reduce()或mul(),這個實現也是可讀的。如果你不能看懂或理解它,抽出幾分鐘來做一些Python文檔研究,直到你清楚它的行為。能夠在文檔中查找函數并理解由其他人編寫的代碼是每個開發人員都需要能夠執行的任務,因此將其作為一個挑戰。
提示:學會查看Python自帶幫助,請確保查找help()函數,這在使用控制臺進行探索時非常有用。
返回多個值
正如我們前面提到的,與大多數其他語言不同,Python非常容易從一個函數返回多個對象。這個特性帶來了無限的可能性,并允許你以一種難以用其他語言再現的風格進行編碼。我們的思維會受到我們使用的工具的限制。因此,當Python給予你比其他語言更多的自由時,它就是在增強你的創造性能力。
返回多個值非常簡單:只需使用元組(顯式或隱式)。讓我們看一個模仿divmod()內置函數的簡單例子:
我們可以將前面代碼中粗體部分包裝在括號中,使其成為顯式元組,但沒有必要這樣做。上面的函數同時返回除法的結果和余數。
有關函數的有益建議
在編寫函數時,遵循一些最佳實踐指導原則是非常有用的,這樣才能很好地編寫函數。我們來看一看這些指導原則,以助益你更好的理解和應用函數。
1)函數應只做一件事
做一件事的函數很容易用一句話來描述。執行多項任務的函數可以重構拆分為執行一項任務的更小函數。這些較小的函數通常更容易閱讀和理解。
2)函數應是很小的
它們越小,測試和編寫它們就越容易,這樣它們也就更專注于只做一件事。
3)輸入參數越少越好
接受大量參數的函數很快就變得難以管理(以及其他問題)。當需更多的輸入參數時,酌情考慮,如重構為類對象或其它復合型數據。
4)函數的返回值應該一致
返回False和返回None不是一回事,即使在布爾上下文中,它們的值都是False。False表示我們有信息(即False),而None表示沒有信息。盡可能編寫以一致的方式返回的函數,無論其邏輯中發生了什么。
5)函數不應該有副作用
換句話說,函數不應該影響調用它們的值。這可能是目前最難理解的一條實踐性原則,所以這里給出一個使用列表的示例。在下面的代碼中,注意如何不使用sorted()函數對numbers進行排序,該函數實際上返回的是已排序的數字副本。相反,list.sort()方法作用于numbers對象本身,這很好,因為它是一個方法(屬于對象的函數,因此有權修改它):
所以,遵循以上這些常規的基本指導原則,將有益于你寫出更好的函數,為你實現更好的服務。
本文小結
到此關于Python函數的主體性知識就介紹完了——函數定義語法、輸入參數定義以及相關規則、返回值實現和多返回值等,并簡單總結了基于最佳實踐的一些有益基本指導原則。請多加練習和體會,以便更好的理解和掌握作為Python的核心特性之一的函數。