一、背景在學習函數之前,一直遵循:面向過程編程,即:根據業務邏輯從上到下實現功能,其往往用一長段代碼來實現指定功能,開發過程中最常見的操作就是粘貼複製,也就是將之前實現的代碼塊複製到現需功能處,如下while True: if cpu利用率 > 90%: #發送郵件提醒 ...
一、背景
在學習函數之前,一直遵循:面向過程編程,即:根據業務邏輯從上到下實現功能,其往往用一長段代碼來實現指定功能,開發過程中最常見的操作就是粘貼複製,也就是將之前實現的代碼塊複製到現需功能處,如下
while True: if cpu利用率 > 90%: #發送郵件提醒 連接郵箱伺服器 發送郵件 關閉連接 if 硬碟使用空間 > 90%: #發送郵件提醒 連接郵箱伺服器 發送郵件 關閉連接 if 記憶體占用 > 80%: #發送郵件提醒 連接郵箱伺服器 發送郵件 關閉連接
腚眼一看上述代碼,if條件語句下的內容可以被提取出來公用,如下:
def 發送郵件(內容) #發送郵件提醒 連接郵箱伺服器 發送郵件 關閉連接 while True: if cpu利用率 > 90%: 發送郵件('CPU報警') if 硬碟使用空間 > 90%: 發送郵件('硬碟報警') if 記憶體占用 > 80%:
對於上述的兩種實現方式,第二次必然比第一次的重用性和可讀性要好,其實這就是函數式編程和麵向過程編程的區別:
- 函數式:將某功能代碼封裝到函數中,日後便無需重覆編寫,僅調用函數即可
- 面向對象:對函數進行分類和封裝,讓開發“更快更好更強...”
函數式編程最重要的是增強代碼的重用性和可讀性
二、 函數的定義和使用
def 函數名(參數): ... 函數體 ...
函數的定義主要有如下要點:
- def:表示函數的關鍵字
- 函數名:函數的名稱,日後根據函數名調用函數
- 函數體:函數中進行一系列的邏輯計算,如:發送郵件、計算出 [11,22,38,888,2]中的最大數等...
- 參數:為函數體提供數據
- 返回值:當函數執行完畢後,可以給調用者返回數據。
以上要點中,比較重要有參數和返回值:
1、返回值
函數是一個功能塊,該功能到底執行成功與否,需要通過返回值來告知調用者。
def 發送簡訊(): 發送簡訊的代碼... if 發送成功: return True else: return False while True: # 每次執行發送簡訊函數,都會將返回值自動賦值給result # 之後,可以根據result來寫日誌,或重發等操作 result = 發送簡訊() if result == False: 記錄日誌,簡訊發送失敗...
1、返回值
函數是一個功能塊,該功能到底執行成功與否,需要通過返回值來告知調用者。
def 發送簡訊(): 發送簡訊的代碼... if 發送成功: return True else: return False while True: # 每次執行發送簡訊函數,都會將返回值自動賦值給result # 之後,可以根據result來寫日誌,或重發等操作 result = 發送簡訊() if result == False: 記錄日誌,簡訊發送失敗...
2、參數
為什麼要有參數?
def CPU報警郵件() #發送郵件提醒 連接郵箱伺服器 發送郵件 關閉連接 def 硬碟報警郵件() #發送郵件提醒 連接郵箱伺服器 發送郵件 關閉連接 def 記憶體報警郵件() #發送郵件提醒 連接郵箱伺服器 發送郵件 關閉連接 while True: if cpu利用率 > 90%: CPU報警郵件() if 硬碟使用空間 > 90%: 硬碟報警郵件() if 記憶體占用 > 80%: 記憶體報警郵件() 上例,無參數實現
def 發送郵件(郵件內容) #發送郵件提醒 連接郵箱伺服器 發送郵件 關閉連接 while True: if cpu利用率 > 90%: 發送郵件("CPU報警了。") if 硬碟使用空間 > 90%: 發送郵件("硬碟報警了。") if 記憶體占用 > 80%: 發送郵件("記憶體報警了。")
函數的有三中不同的參數:
- 普通參數
- 預設參數
- 動態參數
# ######### 定義函數 ######### # name 叫做函數func的形式參數,簡稱:形參 def func(name): print name # ######### 執行函數 ######### # 'wupeiqi' 叫做函數func的實際參數,簡稱:實參 func('wupeiqi') 普通參數
def func(name, age = 18): print "%s:%s" %(name,age) # 指定參數 func('wupeiqi', 19) # 使用預設參數 func('alex') 註:預設參數需要放在參數列表最後 預設參數
def func(*args): print args # 執行方式一 func(11,33,4,4454,5) # 執行方式二 li = [11,2,2,3,3,4,54] func(*li) 動態參數一
def func(**kwargs): print args # 執行方式一 func(name='wupeiqi',age=18) # 執行方式二 li = {'name':'wupeiqi', age:18, 'gender':'male'} func(**li)動態參數二
def func(*args, **kwargs): print args print kwargs
python的變參
*args和**kwargs是Python的兩個動態參數,兩者有所不同的是*args是個tuple,**kwargs是個dict。
*args 和**kwargs並用時,*args必須放在**kwargs的前面。
例如:
def func(a,b, *c):
pass
函數func至少有兩個參數變參數放在tuple c中
def func(*c): 或者 def func(**dc) 參數不確定
def func(a, *c, **dc): 可以共用*args和**kwargs,不過一定要把*args放在前