本篇內容作為以函數為主題的最後一篇,來介紹一下函數傳回值以及編寫函數的一些基本的最佳實踐指導原則。
函數的回傳值是Python領先競爭對手的東西之一。在大多數其他語言中,函數通常只允許傳回一個對象,但在Python中,你可以傳回一個元組-這意味著可以傳回任何你想要的東西。這個特性允許程式設計師編寫用其他語言編寫的軟體要困難得多,或者肯定會更加乏味。我們已經說過,要從函數傳回一些東西,我們需要使用return語句,後面跟著我們想要回傳的東西。函數體中可以根據需要有多個返回語句。
另一方面,如果在函數體中我們不回傳任何東西,或者我們呼叫一個「裸」return語句,函數將會傳回None。當不需要時,這種行為是無害的,但是也允許你整些有趣的模式的,確認Python是一種非常一致的語言。
我們說它是無害的,因為你永遠不會被迫收集函數呼叫的結果。下面將透過一個例子向你展示所說的意思:
# 返回none值 def func(): pass func() # 这个调用是没有接收的,将丢失 a = func() # 这个调用被a接收 print(a) # prints: None
注意,整個函數體只由pass語句組成。正如官方文件告訴我們的那樣,pass是一個空操作,因為當它被執行時,什麼也不會發生。當語法上需要語句但不需要執行程式碼時,它作為佔位符非常有用。在其他語言中,我們可能只需要用一對花括號({})來表示,這定義了一個空作用域;但在Python中,作用域是由縮排程式碼定義的,因此像pass這樣的語句是必要的。
也要注意,func()的第一個呼叫會傳回一個沒有接收的值(None)。正如我們前面提到的,接收函數呼叫的回傳值不是必須的。
這很好,但不是很有趣,我們寫一個有趣的函數怎麼樣?還記得我們討論過階乘函數。讓我們在這裡編寫我們自己的實現(為了簡單起見,我們假設函數總是用適當的值正確調用,所以我們不需要檢查輸入參數):
# 阶乘函数,返回单个值 def factorial(n): if n in (0, 1): return 1 result = n for k in range(2, n): result *= k return result f5 = factorial(5) # f5 = 120
注意,我們有兩個返回點。如果n是0或1,則回傳1。否則,我們執行所需的計算並傳回結果。
提示:在Python中,通常使用in運算元來進行成員檢查,就像我們在前面的範例中所做的那樣,而不是更冗長的檢查:
if n == 0 or n == 1:
…
現在再來試著把這個函數寫得更簡潔一點:
# 返回单个值示例.2 from functools import reduce from operator import mul def factorial2(n): return reduce(mul, range(1, n + 1), 1) f5 = factorial(5) # f5 = 120
這個簡單的範例展示了Python是如何既優雅又簡潔的。即使我們從未見過reduce()或mul(),這個實作也是可讀的。如果你不能看懂或理解它,抽出幾分鐘來做一些Python文件研究,直到你清楚它的行為。能夠在文件中找到函數並理解由其他人編寫的程式碼是每個開發人員都需要能夠執行的任務,因此將其視為挑戰。
提示:學會查看Python自備協助,請確保尋找help()函數,這在使用控制台進行探索時非常有用。
如如我們前面所提到的,與大多數其他語言不同,Python非常容易從一個函數傳回多個物件。這個特性帶來了無限的可能性,並允許你以一種難以用其他語言再現的風格進行編碼。我們的思維會受到我們所使用的工具的限制。因此,當Python給你比其他語言更多的自由時,它就是在增強你的創造性能力。
傳回多個值非常簡單:只需使用元組(顯式或隱式)。讓我們來看一個模仿divmod()內建函數的簡單範例:
# 返回多个值 def moddiv(a, b): return a // b, a % b print(moddiv(20, 7)) # prints (2, 6)
我們可以將前面程式碼中粗體部分包裝在括號中,使其成為顯式元組,但沒有必要這樣做。上面的函數同時傳回除法的結果和餘數。
在編寫函數時,遵循一些最佳實踐指導原則是非常有用的,這樣才能很好地編寫函數。我們來看看這些指導原則,以助長你更好的理解和應用函數。
1)函數要只做一件事
做一件事的函數很容易用一句話來描述。執行多項任務的函數可以重構拆分為執行一項任務的較小函數。這些較小的函數通常更容易閱讀和理解。
2)函數應該是很小的
它們越小,測試和寫它們就越容易,這樣它們也就更專注於只做一件事。
3)輸入參數越少越好
接受大量參數的函數很快就變得難以管理(以及其他問題)。當需要更多的輸入參數時,請酌情考慮,例如重構為類別物件或其它複合型資料。
4)函數的回傳值應該一致
回傳False和回傳None不是一回事,即使在布林上下文中,它們的值都是False。 False表示我們有訊息(即False),而None表示沒有訊息。盡可能編寫以一致的方式傳回的函數,無論其邏輯中發生了什麼。
5)函数不应该有副作用
换句话说,函数不应该影响调用它们的值。这可能是目前最难理解的一条实践性原则,所以这里给出一个使用列表的示例。在下面的代码中,注意如何不使用sorted()函数对numbers进行排序,该函数实际上返回的是已排序的数字副本。相反,list.sort()方法作用于numbers对象本身,这很好,因为它是一个方法(属于对象的函数,因此有权修改它):
>>> numbers = [4, 1, 7, 5] >>> sorted(numbers) # 不会排序原始的'numbers' 数字列表 [1, 4, 5, 7] >>> numbers # 验证一下 [4, 1, 7, 5] # 很好,没有改变原始数据对象 >>> numbers.sort() # 这将实质性影响原始列表 >>> numbers [1, 4, 5, 7]
所以,遵循以上这些常规的基本指导原则,将有益于你写出更好的函数,为你实现更好的服务。
到此关于Python函数的主体性知识就介绍完了——函数定义语法、输入参数定义以及相关规则、返回值实现和多返回值等,并简单总结了基于最佳实践的一些有益基本指导原则。请多加练习和体会,以便更好的理解和掌握作为Python的核心特性之一的函数。
以上是Python程式設計:有關函數傳回值以及最佳實踐基本指導原則的詳細內容。更多資訊請關注PHP中文網其他相關文章!