在學習函數以前,一直遵循:面向過程編程,即:根據業務邏輯從上到下實現功能,其每每用一長段代碼來實現指定功能,開發過程當中最多見的操做就是粘貼複製,也就是將以前實現的代碼塊複製到現需功能處,以下:python
while True: if cpu利用率 > 90%: #發送郵件提醒 鏈接郵箱服務器 發送郵件 關閉鏈接 if 硬盤使用空間 > 90%: #發送郵件提醒 鏈接郵箱服務器 發送郵件 關閉鏈接 if 內存佔用 > 80%: #發送郵件提醒 鏈接郵箱服務器 發送郵件 關閉鏈接
定眼一看上述代碼,if條件語句下的內容能夠被提取出來公用,以下:編程
def 發送郵件(內容) #發送郵件提醒 鏈接郵箱服務器 發送郵件 關閉鏈接 while True: if cpu利用率 > 90%: 發送郵件('CPU報警') if 硬盤使用空間 > 90%: 發送郵件('硬盤報警') if 內存佔用 > 80%:
對於上述的兩種實現方式,第二次必然比第一次的重用性和可讀性要好,其實這就是函數式編程和麪向過程編程的區別:服務器
函數式編程最重要的是加強代碼的重用性和可讀性ide
def 函數名(參數): ... 函數體 ... 返回值
函數的定義主要有以下要點:函數式編程
一、返回值函數
函數是一個功能塊,該功能到底執行成功與否,須要經過返回值來告知調用者。學習
以上要點中,比較重要有參數和返回值:ui
def 發送短信(): 發送短信的代碼... if 發送成功: return True else: return False while True: # 每次執行發送短信函數,都會將返回值自動賦值給result # 以後,能夠根據result來寫日誌,或重發等操做 result = 發送短信() if result == False: 記錄日誌,短信發送失敗...
函數的有三中不一樣的參數:spa
一、普通參數日誌
# ######### 定義函數 ######### # 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
擴展:發送郵件實例
import smtplib from email.mime.text import MIMEText from email.utils import formataddr msg = MIMEText('郵件內容', 'plain', 'utf-8') msg['From'] = formataddr(["武沛齊",'wptawy@126.com']) msg['To'] = formataddr(["走人",'424662508@qq.com']) msg['Subject'] = "主題" server = smtplib.SMTP("smtp.126.com", 25) server.login("wptawy@126.com", "郵箱密碼") server.sendmail('wptawy@126.com', ['424662508@qq.com',], msg.as_string()) server.quit()