1. 程式人生 > >Python小白學習之路(十)—【函式】【函式返回值】【函式引數】

Python小白學習之路(十)—【函式】【函式返回值】【函式引數】

寫在前面:

昨天早睡之後,感覺今天已經恢復了百分之八十的樣子

又是活力滿滿的小夥郭

今日份雞湯:

我始終相信,在這個世界上,一定有另一個自己,在做著我不敢做的事,在過著我想過的生活。-------宮崎駿

函式

一、函數出現的背景

在學習函式之前,一直遵循:面向過程程式設計,
即:根據業務邏輯從上到下實現功能,其往往用一長段程式碼來實現指定功能,
開發過程中最常見的操作就是貼上複製,
也就是將之前實現的程式碼塊複製到現需功能處,如下:

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}