標籤:預設 basic 參數 是你 one 可讀性 問題: 支援 任務
函數
一、函 數的基本文法及特性
首先,我們要明確,函數的出現,目的就是為瞭解決重複代碼的問題。
接下來,舉個栗子來說明:
老闆讓你寫一個監控程式,用來監控伺服器的系統狀況,當CPU,記憶體 ,磁碟等指標超出閾值的時候發郵件警示。
恩,就這麼一個需求,當時拿到手的時候特別高興,覺得我草,終於可以寫代碼了,於是你寫了下面的代碼:
while True
if cpu利用率 > 90%:
#發送郵件
串連郵件伺服器
發送郵件
關閉串連
if disk > 90%:
#發送郵件
串連郵件伺服器
發送郵件
關閉串連
if mem >80%:
#發送郵件
串連郵件伺服器
發送郵件
關閉串連
完畢,你很激動,覺得這是此生寫的最多的Python代碼,不禁暗暗竊喜,想到你把代碼提交給老大以後,老大驚訝的表情,你很享受,於是,第二天,早早的,你提交了代碼,老大姓王,住你家隔壁,人送外號老王。
老王看了看你的代碼,說道,你這個重複代碼太多,每次警示都要重新寫一段發郵件的代碼,太low了,這樣幹 存在2個問題:
1、代碼重複過多,一個勁的copy 和paste不符合高端程式員的氣質。
2、不利用二次使用。
老王接著說,其實很簡單,只需要把重複的代碼提出來,放到一個公用的地方,起個名字,以後誰想用這段代碼,就可以通過這個名字直接調用即可,如下:
def 發送郵件(內容) #發送寄件提醒 串連郵箱伺服器 發送郵件 關閉串連while True: if cpu >90%: 發送郵件(‘CPU警示’) if disk > 90%: 發送郵件(‘硬碟警示’) if mem >80%: 發送郵件(‘記憶體警示’)
你還別說,這麼一些確實省去了不少的重複代碼,而且還增加了可讀性。
說了這麼多,那麼函數到底是什麼呢?
函數一詞來源於數學,但編程中的函數概念,與數學中的函數是有很大的不同的,編程中的函數在英文中也有很多不同的叫法。在BASIC中叫做subroutine(子過程或子程式),在Pascal中叫做procedure(過程)和function,在C中只有function,在Java中叫做method。
特性:
1、減少重複代碼
2、使程式變得可擴充
3、使程式變得易維護
文法定義:
def hanshuming():#函數名 print(“hehe”)sayhi() #調用函數
可以帶參數:
#舉個栗子,把下面代碼改成函數
a,b = 5,8c = a**bprint(c)#改成函數def calc(x,y): res = x**y return res # 返回函數執行的結果c = calc(a,b) #結果賦值給c變數print(c)
二、參數與局部變數內建
形參變數只有在被調用時才分配記憶體單元,在調用結束時,即刻釋放所分配的記憶體單元。因此,形參只在函數內部有效。函數調用結束返回主調用函數後則不能再使用該形參變數。
實參可以是常量、變數、運算式、函數等,無論實參是何種類型的量,在進行函數調用時,它們都必須有確定的值,以便把這些值傳送給形參。因此應預先用賦值,輸入等辦法使參數獲得確定值。
#改成用函數
def calc(x,y): #形參 res = x**y return res c = calc(a,b) #實參print(c)
舉個栗子
def sayhi(name,age,nationality="CN"): print("Hello,I am %s" % name,age,nationality )sayhi("jixuege",22,"JP")列印結果Hello,I am jixuege 22 JP
說明:
上面不傳國籍就使用預設的,傳了就使用傳的參數。
非固定參數
如果函數在定義時不確定使用者想傳入多少個參數,就可以用非固定參數
*args
舉個栗子
def stu(name,age,*args): print(name,age,args)stu("jixuege",22)stu("jixuege",22,"dajiba","python")輸出結果jixuege 22 ()jixuege 22 (‘dajiba‘, ‘python‘)
還有一個**args
def stu(name,age,*args,**kwargs): print(name,age,args,kwargs)stu("jixuege",22)stu("jixuege",22,"python","CN",sex="man",province="xinjiang")輸出結果jixuege 22 () {}jixuege 22 (‘python‘, ‘CN‘) {‘province‘: ‘xinjiang‘, ‘sex‘: ‘man‘}
全域與局部變數的區別
在子程式中定義的變數稱為局部變數,在程式的一開始定義的變數稱為全域變數。
全域變數範圍是整個程式,局部變數範圍是定義該變數的子程式。
當全域變數與局部變數同名時:
在定義局部變數的子程式內,局部變數起作用;在其他地方全域變數起作用。
三、傳回值及嵌套函數
想要擷取函數的執行結果,就可以用return語句把結果返回
注意:
1、函數在執行過程中只要遇到return語句,就會停止執行並返回結果,所以也可以理解為return語句代表著函數的結束。
2、如果未在函數中指定return,那這個函數的傳回值為none。
四、遞迴
什麼叫做遞迴函式?
如果一個函數在內部調用自己本身,這個函數就是遞迴函式。
遞迴特性:
1、必須有一個明確的結束條件。
2、每次進入更深一層遞迴時,問題規模相比上次遞迴都應有所減少。
3、遞迴效率不高,遞迴層次過多會導致棧溢出。
舉個栗子
def calc(n): print(n) if int(n/2) == 0: return n return calc(int(n/2))calc(10) 輸出結果10521
五、匿名函數
什麼是匿名函數?
匿名函數就是不需要顯示的指定函數。
舉個列子:
#這段代碼def calc(n): return n**nprint(calc(10))#換成匿名函數calc= lambda n:n**nprint(calc(10))輸出結果1000000000010000000000
六、函數式編程介紹
函數式Python內建支援的一種封裝,我們通過把大段代碼拆成函數,通過一層一層的函數調用,就可以把複雜任務分解成簡單的任務,這種分解可以稱之為面向過程的程式設計。函數就是面向過程的程式設計的基本單元。
記住:
函數式編程:講的是數學裡面的函數,跟我上面講的函數不是一回事。
七、高階函數
變數可以指向函數,函數的參數能夠接受變數,那麼一個函數就可以接受另一個函數作為參數,這種函數就叫高階函數
舉個栗子
def add(x,y,z): return z(x) + z(y)res = add(3,-6,abs)print(res) 列印結果9
八、內建函數
Python基礎 day4