【008】Python全棧日記-函式
一、函式介紹
函式是組織好的,可重複使用的,用來實現單一,或相關聯功能的程式碼段。
函式能提高應用的模組性,和程式碼的重複利用率。你已經知道Python提供了許多內建函式,比如print()。但你也可以自己建立函式,這被叫做使用者自定義函式。
如果在開發程式時,需要某塊程式碼多次,但是為了提高編寫的效率以及程式碼的重用,所以把具有獨立功能的程式碼塊組織為一個小模組,這就是函式
二、定義一個函式
你可以定義一個由自己想要功能的函式,以下是簡單的規則:
函式程式碼塊以 def 關鍵詞開頭,後接函式識別符號名稱和圓括號 ()。
任何傳入引數和自變數必須放在圓括號中間,圓括號之間可以用於定義引數。
函式的第一行語句可以選擇性地使用文件字串—用於存放函式說明。
函式內容以冒號起始,並且縮排。
return [表示式] 結束函式,不帶表示式的return相當於返回 None。
三、語法
1、Python 定義函式使用 def 關鍵字,一般格式如下:
2、呼叫函式
3、函式說明
函式的第一行語句可以選擇性地使用文件字串—用於存放函式說明。
4、定義帶有引數的函式
呼叫的時候,這個函式定義時有幾個引數,就需要傳遞幾個引數
預設情況下,引數值和引數名稱是按函式宣告中定義的的順序匹配起來的。
定義時小括號中的引數,用來接收引數用的,稱為 “形參”
呼叫時小括號中的引數,用來傳遞給函式用的,稱為 “實參”
5、函式的返回值
所謂“返回值”,就是程式中函式完成一件事情後,最後給呼叫者的結果
如果一個函式返回了一個數據,那麼想要用這個資料,那麼就需要儲存
6、返回多個值
返回多值其實就是返回一個tuple,在語法上返回一個tuple可以省略括號
7、python 函式的引數傳遞:
不可變型別:整數、字串、元組。如fun(a),傳遞的只是a的值,沒有影響a物件本身。比如在 fun(a)內部修改 a 的值,只是修改另一個複製的物件,不會影響 a 本身。
可變型別:列表,字典。如 fun(la),則是將 la 真正的傳過去,修改後fun外部的la也會受影響。這其中的原理就是昨天日記中的賦值原理
(1)傳遞不可變型別
(2)傳遞可變引數
8、函式的引數
(1)必須引數:
從字面理解:必須要傳入引數
傳入的引數:與定義的形參順序一一對應,如果函式形參有3個,二實參只傳入2個或者4個都會報錯。
(2)關鍵字引數
引數位置匹配,關鍵字引數,與形參的位置順序無關
結果:
(3)預設引數
預設引數必須指向不變的物件
當函式有多個引數,把變化大的引數反正前面,變化小的引數放在後面。變化小的引數就作為預設引數。
預設引數好處:降低呼叫函式的難度
比如你要錄入一個工廠的名單,但是工廠裡百分之九十都是男的,就可以把函式的形參(sex=‘男)作為一個預設引數,當錄入為女的時候傳入一個sex=’女’就行了。
(4)可變引數
*args **args
用途:在定義函式需要,每個定義函式功能的都可以繼續優化,所以我們需要用動態引數
如果把引數寫死了,後期繼續修改完善的功能的,修改該函式功能則會相當麻煩
*args 結果型別是元祖,傳遞值是任意型別
結果:
**kwargs結果型別是字典,傳遞值是以key=value方式傳入
結果:
(5)函式引數總結:
- 形參的位置順序,必須與實參的順序一一對應,缺一不行,多一不行
- 關鍵字引數,無須一一對應,缺一不行,多一不行
- 位置引數必須在關鍵字引數左邊
- 預設引數一定要用不可變物件,如果是可變物件,程式執行時會有邏輯錯誤
四、函式巢狀
1、在函式內部呼叫其他函式
2、全域性變數和區域性變數
在子程式中定義的變數稱為區域性變數,只在子程式內部生效,
在程式一開始定義的變數稱為全域性變數
全域性變數作用域是整個程式,區域性變數作用域是定義該變數的子程式。
當全域性變數與區域性變數同名時:在定義區域性變數的子程式內,區域性變數起作用,在其他地方全域性變數起作用
如果全域性變數是可變的資料型別,函式可以對全域性變數內部直接進行修改
函式優先讀取區域性變數,能讀全域性變數,無法對全域性變數重新賦值操作
3、變數的查詢順序 從裡向外查詢
作用域區域性>外層作用域>當前模組中的全域性>python內建作用域;
我們簡稱LEGB原則:Local -> Enclosed -> Global -> Built-in
- Local 可能是在一個函式或者類方法內部。
- Enclosed 可能是巢狀函式內,比如說 一個函式包裹在另一個函式內部。
- Global 代表的是執行指令碼自身的最高層次。
- Built-in 是Python為自身保留的特殊名稱。
4、使用global 定義全域性變數
5、nonlocal關鍵字使用外層(非全域性)變數。
五、遞迴函式(回撥函式)(難點)
如果一個函式在內部呼叫自身本身,這個函式就是遞迴函式。
遞迴特性:
- 必須有一個明確的結束條件
- 每次進入更深一層遞迴時,問題規模相比上次遞迴都應有所減少
- 遞迴效率不高,遞迴層次過多會導致棧溢位(在計算機中,函式呼叫是通過棧(stack)這種資料結構實現的,每當進入一個函式呼叫,棧就會加一層棧幀。
- 每當函式返回,棧就會減一層棧幀。由於棧的大小不是無限的,所以,遞迴呼叫的次數過多,會導致棧溢位)
六、匿名函式
用lambda關鍵詞能建立小型匿名函式。這種函式得名於省略了用def宣告函式的標準步驟。
lambda函式的語法只包含一個語句,如下:
使用一、
結果:
25
使用二
結果:
24