- Python網絡爬蟲與數據分析從入門到實踐
- 馬國俊
- 1500字
- 2024-12-28 12:00:33
1.3 函數及用法
定義和使用函數的目的是提升Python代碼的可維護性和可重用性。在本節中,我們除了介紹定義和調用函數的常規方法,還講解定義和調用Python函數時的諸多注意事項。
1.3.1 定義和調用函數
在Python程序中,函數(function)也叫方法(method),在其中可以封裝實現某種功能的代碼。在之前的范例程序中,我們已經介紹過調用Python內置函數的方式,比如調用print()函數實現輸出功能。除了可以調用Python自帶的函數外,在Python程序中還可以定義(即創建)自己的函數。比如,如果要在Python程序中多次執行累加和的操作,就可以定義一個函數,在其中封裝通用性的累加代碼,然后在需要時調用這個函數。以下的FuncDemo.py范例程序演示了函數的定義和調用。

本范例程序的第1行到第7行的代碼中,我們可以看到定義Python函數的示例。在定義Python函數時,需要像第1行語句那樣,通過def關鍵字定義名為calSum的函數,該函數攜帶一個名為maxNum的參數,請注意def語句也需要以冒號結尾。
第2行到第7行以縮進的方式定義了該函數的主體代碼,其中以while循環實現累加和,最后需要通過第7行的return關鍵字返回該函數的運行結果。
定義完該函數后,第8行和第9行的代碼通過兩次調用該calSum函數,實現了計算從1到100和從1到50的累加和。從該范例程序可知,通過定義和調用函數,在編程過程中能有效避免編寫重復性的代碼。
請注意,由于在定義函數參數時,無法指定參數的類型,因此在調用函數時要確保傳入的參數類型和定義時的類型一致。比如,該范例程序中第1行定義的calSum函數,它的maxNum參數是整型數據,因為在該函數中是以整型的方式使用該參數。如果調用時傳入的是浮點型數據,雖然結果有些怪,但不會出現語法問題,假如像第11行那樣傳入字符串類型的參數,那么在調用函數時就會出現異常。
1.3.2 return關鍵字
在定義和調用函數的場景中,如果僅在函數體內部修改參數值,而不用return返回該參數,那么在調用之后就無法得到更新后的數值,甚至會得到None而出現錯誤。在下面的FuncBadUsage.py范例程序中,可以看到因不用return語句而導致的錯誤結果。

本范例程序的第1行代碼中,用def關鍵字定義了名為addSaraly的函數,它有個名為currentNum的參數。在函數體中的第2行,執行了給currentNum變量加1000的運算。在這種情況下,在第4行調用addSaraly函數時,打印的結果是None,這是因為addSaraly函數沒有通過return語句返回結果。此時如果刪除第3行的注釋前導符“#”,就可以用return把currentNum的結果值返回調用該函數的程序段,那么在第4行調用addSaraly函數時,就能看到預期的結果,即6000。
1.3.3 遞歸調用函數
如果在一個函數內部調用該函數本身,這種做法叫函數的遞歸調用。下面的FactorialDemo.py范例程序以階乘為例來演示函數的遞歸調用。

本范例程序的第1行到第4行的factorial函數里,給出了以遞歸調用實現階乘的功能。具體做法是,在第2行判斷num是否為1,如果是則返回1,否則在第4行遞歸調用factorial(num - 1)。
第5行調用factorial函數的參數是3,那么根據定義,會遞歸調用3* factorial(2),而factorial(2)則會遞歸調用2* factorial(1),由于factorial(1)有明確的返回值1,遞歸結束,隨后向上推導factorial(2)等于2,而3* factorial(2)等于6,由此得到最終結果。
在函數中引入遞歸可以提升代碼的可讀性,不過在實現遞歸時務必注意兩點:
● 第一,在函數里一定需要明確定義遞歸的結束條件,比如在上述范例程序中,通過第2行和第3行代碼的定義,當num等于1時,遞歸調用結束,返回1。如果沒有結束條件,那就會出現無限遞歸的情況。
● 第二,計算機操作系統支持的遞歸層數是有限的,如果遞歸層數過多,就會出現異常,從而中止程序的運行。
為了避免因遞歸導致的異常,不少項目組會在使用函數時禁用遞歸,或者定義一個比較小的閾值,比如只有當明確知道遞歸層數小于5,才能使用遞歸。在禁用遞歸的場景里,一般可以通過循環來實現相同的功能,比如下面的FactorialDemo 1.py范例程序通過循環實現了階乘。

- 零基礎學C++程序設計
- Hands-On Machine Learning with scikit:learn and Scientific Python Toolkits
- 區塊鏈架構與實現:Cosmos詳解
- NLTK基礎教程:用NLTK和Python庫構建機器學習應用
- Android 9 Development Cookbook(Third Edition)
- 程序員修煉之道:通向務實的最高境界(第2版)
- Python Data Structures and Algorithms
- Android傳感器開發與智能設備案例實戰
- Scratch·愛編程的藝術家
- 深入理解BootLoader
- Julia High Performance(Second Edition)
- Visual C++從入門到精通(第2版)
- Java多線程并發體系實戰(微課視頻版)
- jQuery Mobile Web Development Essentials(Second Edition)
- 深度學習:基于Python語言和TensorFlow平臺(視頻講解版)