天天看點

第5.5節 函數遞歸、嵌套及樣例

一、    函數遞歸及嵌套簡介

1.    函數支援遞歸,遞歸就是函數可以在函數内調用自己,這種情況在c語言等語言就已經支援,不單獨介紹;

2.    python支援函數内再定義函數,這種方式稱為函數嵌套。函數内的函數稱為局部函數,其上層函數稱為封閉函數:

1)    在預設情況下,局部函數對外部是隐藏的,局部函數隻能在其封閉函數内有效;

2)    封閉函數也可以傳回局部函數,以便程式在其他作用域中使用局部函數,此時傳回的函數在調用方使用時就可以等同于普通函數一樣使用;

3)    在局部函數中如果需要通路封閉函數的變量,需要使用nonlocal進行聲明;

4)    局部函數大多數情況下可以與封閉函數使用兩個函數實作,但局部函數在某些特定場景下使用可以簡化程式的實作方式。相關内容在後面章節再介紹。

二、    函數其他的知識

1.    要判斷某個對象是否為函數可調用,可使用内置函數callable,該函數參數為需要判斷的對象如函數名,傳回值為布爾值,為true就表示可調用;

2.    所有函數都是 function 對象,這意味着可以把函數本身指派給變量,就像把整數、浮點數、清單、元組指派給變量一樣。舉例:

3.    可将函數作為其他函數的形參,通過使用函數作為參數可以在調用函數時動态傳入函數,實際上就可動态改變被調用函數的部分代碼;

4.    python 還支援使用函數作為其他函數的傳回值;

5.    如果函數需要有多個傳回值,則既可将多個值包裝成容器的元素如清單之後傳回,也可直接傳回多個值。如果 函數直接傳回多個值,python 會自動将多個傳回值封裝成元組。六、    案例

1.    實作完整的可變參數的計算函數

該函數輸入一串至少2個數字的不限數量的數字,然後調用對應的運算符進行連續運算(如連加、連減、連乘等),如:cal(‘+’,1,2,3) 、cal(‘*’,1,2,3,4)結果為24。不多說,直接上代碼:

第5.5節 函數遞歸、嵌套及樣例

    說明:

1)    上述實作先定義了函數cal2var,實作兩個數的運算,因為cal函數中需要先實作第一個和第二個參數的運算,後面才是可變個數的參數參與運算,為了簡化代碼,就定義了cal2var,該函數的定義可以直接放到函數cal函數中作為局部函數,使用效果是相同的;

2)    看了cal函數的第一個print語句的輸出就知道收集參數怎麼使用;

3)    cal函數的calmethod有預設值,是以放在最後,如果不使用預設值,就可以放在第一個,這樣後面調用時就不用關鍵字參數方式調用,本例特地這樣使用,實際上由于收集參數後面必須是關鍵字參數的形式,是以這個預設值沒有用,主要是為了示範收集參數的實參和形參比對過程;

4)    這個函數其實結合後面章節的動态執行方法有個更簡單的實作方式,到時再示範。

2.    使用遞歸函數和局部函數再次實作上述案例

執行截圖:

第5.5節 函數遞歸、嵌套及樣例

本節詳細介紹了函數函數遞歸、函數嵌套以及函數的作用域相關内容,并進行了計算函數的實作。