官术网_书友最值得收藏!

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范例程序通過循環實現了階乘。

主站蜘蛛池模板: 牟定县| 黑龙江省| 金溪县| 汪清县| 青神县| 泉州市| 育儿| 内乡县| 铜山县| 荔波县| 平顺县| 英山县| 阳原县| 金华市| 北流市| 丘北县| 秀山| 商河县| 山丹县| 本溪市| 通化市| 威海市| 深圳市| 绿春县| 大竹县| 祁东县| 辉县市| 闽侯县| 清水河县| 武安市| 尼勒克县| 专栏| 革吉县| 望谟县| 榆林市| 广汉市| 湖北省| 民县| 东乡| 平南县| 老河口市|