Python基礎-函式(六)
一、函式介紹
函式是組織好的,可重複使用的,用來實現單一,或相關聯功能的程式碼段。
函式能提高應用的模組性,和程式碼的重複利用率。Python提供了許多內建函式,比如print()。但你也可以自己建立函式,這被叫做使用者自定義函式。
如果在開發程式時,需要某塊程式碼多次,但是為了提高編寫的效率以及程式碼的重用,所以把具有獨立功能的程式碼塊組織為一個小模組,這就是函式。
二、定義函式
定義函式:
1、函式程式碼塊以 def 關鍵詞開頭,後接函式識別符號名稱和圓括號 ()。
2、任何傳入引數和自變數必須放在圓括號中間,圓括號之間可以用於定義引數。
3、函式的第一行語句可以選擇性地使用文件字串:用於存放函式說明。
4、函式內容以冒號起始,並且縮排。
5、return [表示式] 結束函式,不帶表示式的return相當於返回 None。
函式名的命名規則:
1、推薦使用英文,可以使用中文(不建議用)
2、數字不能開頭,可以使用數字
3、不可以使用特殊字元,除下劃線
4、函式名區分大小寫
5、不能和系統關鍵字重名
三、語法
def 函式名(引數列表):
函式體
示例1(不帶引數):
#宣告無引數函式 def print_Hello(): #函式說明 """這是函式說明,該函式列印hello wordView Code""" print("hello word") #函式呼叫 print_Hello()
示例2(帶引數):
#宣告有引數函式 def print_Hello(strs,strss): #函式說明 """這是函式說明,該函式列印hello word和123""" print(strs) print(strss) #函式呼叫 print_Hello("hello word","123") '''註釋: 形參:形式上的引數,宣告函式時,括號()中的引數,是形參。 實參:實際上的引數,呼叫函式是,括號()中的引數,是實參。 實參將值傳遞給形參的本質過程,本質上就是簡單的變數賦值。 呼叫的時候,這個函式定義時有幾個引數,就需要傳遞幾個引數 預設情況下,引數值和引數名稱是按函式宣告中定義的的順序匹配起來的。View Code'''
示例3(帶關鍵字引數):函式名(形參1=實參1,形參2=實參2。。。)
#宣告有引數函式 def print_Hello(strs=0,strss=0): #函式說明 """這是函式說明,該函式列印hello word和123""" print(strs) print(strss) #函式呼叫 print_Hello(strss="123",strs="hello word") '''註釋: 形參:形式上的引數,宣告函式時,括號()中的引數,是形參。 實參:實際上的引數,呼叫函式是,括號()中的引數,是實參。 實參將值傳遞給形參的本質過程,本質上就是簡單的變數賦值。 呼叫的時候,這個函式定義時有幾個引數,就需要傳遞幾個引數 預設情況下,引數值和引數名稱是按函式宣告中定義的的順序匹配起來的。 關鍵字引數就是呼叫函式時,在實參前面指定形參的做法,為了防止引數按照位置傳遞出現的錯誤。 '''View Code
四、函式的引數傳遞
不可變型別:整數、字串、元組。如fun(a),傳遞的只是a的值,沒有影響a物件本身。比如在 fun(a)內部修改 a 的值,只是修改另一個複製的物件,不會影響 a 本身。
可變型別:列表、字典。如fun(a),則是將a真正的傳遞過去,修改後fun外部的a也會受影響。
傳遞不可變型別引數:
傳遞可變型別引數:
五、函式的引數
分類:必須引數、關鍵字引數、預設引數、可變引數
1、必須引數
從字面理解:必須要傳入引數
傳入的引數:與定義的形參順序一一對應
2、關鍵字引數
引數位置匹配,關鍵字引數,與形參的位置順序無關
3、預設引數:
預設引數必須指向不變的物件
當函式有多個引數,把變化大的引數放在前面,變化小的引數放在後面。變化小的引數就作為預設引數。
預設引數好處:降低呼叫函式的難度
4、可變引數(*args,**kwargs):
*args **args
用途:在定義函式需要,每個定義函式功能的都可以繼續優化,所以我們需要用動態引數
如果把引數寫死了,後期繼續修改完善的功能的,修改該函式功能則會相當麻煩
*args 結果型別是元祖,傳遞值是任意型別
**kwargs結果型別是字典,傳遞值是以key=value方式傳入
5、函式引數總結:
1.形參的位置順序,必須與實參的順序一一對應,缺一不行,多一不行
2.關鍵字引數,無須一一對應,缺一不行,多一不行
3.位置引數必須在關鍵字引數左邊
4.預設引數一定要用不可變物件,如果是可變物件,程式執行時會有邏輯錯誤。
六、函式巢狀
簡單來說:就是在函式內部呼叫其它函式
示例:
def print_one(): print("第一個函式") print_two() def print_two(): print("第二個函式") print_one()
七、全域性變數和區域性變數
在子程式中定義的變數稱為區域性變數,只在子程式內部生效
在程式一開始定義的變數稱為全域性變數
注意:
1、全域性變數作用域是整個程式,區域性變數作用域是定義該變數的子程式。
2、當全域性變數與區域性變數同名時:在定義區域性變數的子程式內,區域性變數起作用,在其他地方全域性變數起作用
3、如果全域性變數是可變的資料型別,函式可以對全域性變數內部直接進行修改
4、函式優先讀取區域性變數,能讀全域性變數,無法對全域性變數重新賦值操作
5、變數的查詢順序 從裡向外查詢:
作用域區域性>外層作用域>當前模組中的全域性>python內建作用域;
八、global和nonlocal
1、global
定義:使用global定義全域性變數
names = ['李四'] def print_name(ages): global names names = ages print(names)#列印王二 print_name('王二') print(names)#列印王二
2、nonlocal
定義:nonlocal關鍵字使用外層(非全域性)變數。
1 names = ['李四'] 2 def print_name(ages): 3 names = ages 4 print(names)#列印 王二 5 def print_name1(): 6 nonlocal names 7 names = '麻子' 8 print(names)#列印 麻子 9 print_name1() 10 print(names)#列印王二 11 12 print_name('王二') 13 print(names)#列印 ['李四']
九、遞迴函式
定義:如果一個函式在內部呼叫自身本身,這個函式就是遞迴函式。
示例:計算乘階
1 def fact(n): 2 if n == 1: 3 return 1 4 else: 5 return n*fact(n-1) 6 sum=fact(3) 7 print(sum)
注意:
1、必須有一個明確的結束條件
2、每次進入更深一層遞迴時,問題規模相比上次遞迴都應有所減少
3、遞迴層次過多會導致棧溢位
十、匿名函式lambda
用lambda關鍵詞能建立小型匿名函式。這種函式得名於省略了用def宣告函式的標準步驟。
lambda函式的語法只包含一個語句,如下:
示例:
student = [ {'name':'小明','class':'一班','age':5}, {'name':'小明','class':'二班','age':6}, {'name':'小明','class':'三班','age':7}, ] #求最大年齡的資訊 max_age=max(student,key=lambda x:x['age']) print(max_age)