Python小白學習之路(十)—【函式】【函式返回值】【函式引數】
阿新 • • 發佈:2018-10-31
寫在前面:
昨天早睡之後,感覺今天已經恢復了百分之八十的樣子
又是活力滿滿的小夥郭
今日份雞湯:
我始終相信,在這個世界上,一定有另一個自己,在做著我不敢做的事,在過著我想過的生活。-------宮崎駿
函式
一、函數出現的背景
在學習函式之前,一直遵循:面向過程程式設計,
即:根據業務邏輯從上到下實現功能,其往往用一長段程式碼來實現指定功能,
開發過程中最常見的操作就是貼上複製,
也就是將之前實現的程式碼塊複製到現需功能處,如下:
while True: if cpu利用率 > 90%: #傳送郵件提醒 連線郵箱伺服器 傳送郵件 關閉連線 if 硬碟使用空間 > 90%:#傳送郵件提醒 連線郵箱伺服器 傳送郵件 關閉連線 if 記憶體佔用 > 80%: #傳送郵件提醒 連線郵箱伺服器 傳送郵件 關閉連線
但是,學習了函式之後,if條件語句下的內容實質是相同的,可以將其提取出來
進行公用。修改後的程式如下:
def 傳送郵件(內容) #傳送郵件提醒 連線郵箱伺服器 傳送郵件 關閉連線 while True: if cpu利用率 > 90%: 傳送郵件('CPU報警') if 硬碟使用空間 > 90%: 傳送郵件('硬碟報警') if 記憶體佔用 > 80%: 傳送郵件('記憶體報警')
對於上述的兩種實現方式,第二次必然比第一次的重用性和可讀性要好,
第二次稱為函數語言程式設計
第一次稱為面向過程程式設計
- 總結使用函式的好處:
- 程式碼重用
- 保持一致性,易維護
- 可擴充套件性
二、函式的定義
python中函式定義:函式式邏輯結構化和過程化的一種程式設計方法
def 函式名(引數): ... 函式體 ... 返回值
函式的定義主要有如下要點:
- def:表示函式的關鍵字
- 函式名:函式的名稱,日後根據函式名呼叫函式
- 引數:為函式體提供資料
- 函式體:函式中進行一系列的邏輯計算,如:傳送郵件、計算出 [11,22,38,888,2]中的最大數等...
- 返回值:當函式執行完畢後,可以給呼叫者返回資料。
舉例:
def test(x): "The function definitions" x+=1 return x
- def:定義函式的關鍵字
- test:函式名
- ():內可定義形參
- "":文件描述(非必要,但是強烈建議為你的函式新增描述資訊)
- x+=1:泛指程式碼塊或程式處理邏輯
- return:定義返回值
以上要點中,比較重要有引數和返回值。
1.返回值:
函式是一個功能塊,該功能到底執行成功與否,需要通過返回值來告知呼叫者。
過程定義:過程就是簡單特殊沒有返回值的函式
總結:當一個函式/過程沒有使用return顯示的定義返回值時,python直譯器會隱式的返回None,
所以在python中即便是過程也可以算作函式。
- 總結:
- 返回值數=0:返回None
- 返回值數=1:返回object
- 返回值數>1:返回tuple
2.引數:
舉例: # ######### 定義函式 ######### # name 叫做函式func的形式引數,簡稱:形參 def func(name): print name # ######### 執行函式 ######### # 'xhg' 叫做函式func的實際引數,簡稱:實參 func('xhg')
2.1形參
形參變數只有在被呼叫時才分配記憶體單元,
在呼叫結束時,即刻釋放所分配的記憶體單元。
因此,形參只在函式內部有效。
函式呼叫結束返回主呼叫函式後則不能再使用該形參變數
2.2實參
實參可以是常量、變數、表示式、函式等,
無論實參是何種型別的量,在進行函式呼叫時,它們都必須有確定的值,以便把這些值傳送給形參。
因此應預先用賦值,輸入等辦法使引數獲得確定值
2.3位置引數和關鍵字
#位置引數,必須一一對應,缺一不行,多一也不行 def test(x,y,z): # x = 1;y = 2; z = 3 print(x) print(y) print(z) test(1,2,3)
#關鍵字引數,無需一一對應,缺一不行,多一也不行 def test(x,y,z): print(x) print(y) print(z) test(y=1,z=22,x=3)
#關鍵字引數和位置引數混合使用時,位置引數必須在關鍵字引數左邊 def test(x,y,z): print(x) print(y) print(z) test(1,y=2,3)#報錯 test(1,3,y=2)#報錯 test(1,2,z=3)#正確
2.4預設引數
def func(name, age=18): print("%s:%s" % (name, age)) # 指定引數 func('xhg', 19) #執行結果 xhg:19 # 使用預設引數 func('alex') #執行結果 alex:18
2.5引數組
- 非固定長度的引數
- *args 針對位置引數傳遞
- **kwargs 針對關鍵字引數傳遞
- *表傳遞的資料型別為列表
- **表傳遞的資料型別為字典
#*args 針對位置引數傳遞 def func(*args): print(args) func(1,2,3,4,'xhg','python')
#*args 針對位置引數傳遞,實參以列表形式,需要*表明 def func(*args): print(args) li = [1,2,3,4,'xhg','python'] func(*li)
#**kwargs 針對關鍵字引數傳遞 def func(x,**kwargs): print(x) print(kwargs) func(12, name = 'xhg',age =18)
#**kwargs 針對位置引數傳遞,實參以字典形式,需要**表明 def func(x,**kwargs): print(x) print(kwargs) s = {'name': 'xhg','age':18} func(12, **s)
def func(x, *args, **kwargs): print(x) print(args) print(kwargs) li = [2, 2, 2, 2] s = {'z': 3, 'v ': 3} func(1, *li, **s) #執行結果 1 (2, 2, 2, 2) {'z': 3, 'v': 3}
def func(x, *args, **kwargs): print(x) print(args) print(kwargs) func(1, 2, 2, 2, 2, z = 3, v = 3) #執行結果 1 (2, 2, 2, 2) {'z': 3, 'v': 3}