1. 程式人生 > >Python的學習之-函式

Python的學習之-函式

什麼是函式

函式是指將一組語句的集合通過一個名字(函式名)封裝起來,想要執行這個函式,只需呼叫其函式名即可

1、減少重複程式碼

2、使程式變的可擴充套件

3、使程式變得易維護

 

定義函式的語法

形參

主要的作用就是接受實參引數的傳遞,並且被語法呼叫  #形參只有在被呼叫時才記憶體單元,在呼叫解釋時,即可釋放所分配的記憶體單元。因此,形參只在函式內部有效。函式呼叫結束返回主呼叫函式後則不能再使用該形參變數

實參

主要的作用就是講引數傳遞給形參    #實參可以是常量、變數、表示式、函式等,無論實參是何種型別的量,在進行函式呼叫時,他們都必須有確定的值,以便把這些值傳遞給形參。因此應預先用賦值,輸入等辦法使引數獲得確定值

 

定義函式的形參,並且將實參傳遞給形參再呼叫

def calc(x,y):  #def關鍵詞,calc函式名,括號裡的是形參

  res = x**y

  return res

c = calc(a,b)    #括號裡的是實參

print(c)

 

形參也可以是預設值

def calc(x,y=2)   #這樣在函式呼叫時如果形參不指定引數,則在呼叫時就是預設值,如果指定,則是指定值

 

關鍵引數

一般情況下,給函式傳引數時要按順序,不想按順序就可以用關鍵引數,只需指定引數名即可(指定了引數名的引數就叫關鍵引數),關鍵引數必須放在位置引數(以位置順序確定對應關係的引數)之後

PS:位置引數就是形參沒有指定任何值,所以函式呼叫時候是按照位置傳遞的,關鍵引數就是指定形參的預設值,所以必須放在位置引數的後面,不然在函式傳遞時候按照位置傳遞,會出現錯誤

例:def stu_register(name,age,course='Py',counter='CN'):  #def是函式定義關鍵字,結尾必須用:結束,這是強制語法

  print("姓名:", name)

  print("年齡:", age)

  print("課程:" ,course)

  print("國籍:", counter)

stu-register(‘Karl’,course='Py',age=22,counter='JP')  #這裡Karl沒有用賦值去指定賦值給哪一個形參,所以必須對應形參的位置,而後面的實參都有賦值給指定的形參,所以可以不用按位置寫

 

非固定引數

若在函式的定義時不確定使用者想傳入多少個引數,就可以使用非固定引數(*args和*kwargs)

*args會把多傳入的引數變成一個元組形式

def stu(name,age,*args)

  print(name,age,args)

stu('Karl',22)

輸出的結果就是Karl 22()  #輸出結果後面有一個(),元組符號,這個就是args,因為沒有傳入任何值,所以就是一個空元組

 

**kwargs 會把多傳入的引數變成一個dict的形式(字典形式)

def stu(name,age,*args,**kwargs)

  print(name,age,args,kwargs)

stu('Karl',22,'cn','Py',sex='male')

輸出結果就是Karl 22 ('cn', 'Py') {'sex': 'male'}

PS:*args前面是一個*,**kwargs前面是兩個*,args傳入時候單個字串即可,而kwargs傳入的時候必須以鍵值(key=value)傳入

 

返回值(return)

函式外部程式碼想要獲取函式的執行結果,就可以在函式裡用return語句把結果返回

def stu_register(name,age,course='Py',counter='CN'):

  print("姓名:" ,name)

  print("年齡:" ,age)

  print("課程:" ,course)

  print("國籍:" ,counter)

  if age > 22:  #這裡輸出一個判定條件,用return返回後面的結果

    return False

  else:

    return True

s_reg = stu_register(‘Karl’,course='Py',age=22,counter='JP')

if s_reg:

  print('註冊成功')

else:

  print('年齡太大‘’)

PS:函式在執行過程中只要遇到return語句,就會停止執行並返回結果,return語句就是函式執行結束的一個語句,如果未在函式中指定return,那麼這個函式的返回值為None

 

全域性變數和區域性變數

1、在函式中定義的變數就是區域性變數,在程式的一開始定義的變數稱為全域性變數

2、全域性變數的作用域是整個程式,區域性變數作用域就是定義該變數的函式

3、當全域性變數與區域性變數同名時,在定義區域性變數的函式內,區域性變數起作用,在其他地方則是全域性變數起作用

name = 'Alex'   #這個是全域性變數

def change_name(name):

  print('beore change:',name)

  name ='Karl'  #這個是區域性變數,只給下面的呼叫

  print('after change:',name)

change_name(name)

 

作用域

作用域(scope),通常來說,一段 程式程式碼中所用到的名字並不總是有效/可用的,而限定這個民資的可用性的程式碼範圍就是這個名字的作用域

global 宣告全域性變數函式

def change_name():  #這裡沒有定義形參

  global name     #用global 函式宣告name就是全域性變數

  name ='Karl'    

  print('after change:',name)

change_name()   #用為用了global全域性函式宣告變數name,所以這裡也可以列印name

 

巢狀函式

name = 'Alex'

def change_name():  

  name = 'Alex2'

  def change_name2():

    name = 'Alex3'

    print('第三層:',name)

  change_name2()

  print('第二層:',name)

change_name()

print('最外層:',name)

PS:函式巢狀的呼叫也是需要按照層級來依次呼叫的,如果在第二層呼叫第三層則會報錯,所以第二層只能呼叫第二層

 

匿名函式(lambda)

匿名函式就是不需要顯式的指定函式名

通常函式的呼叫

def calc(x,y)

  return x**y

print(clac(2,5))

 

採用匿名函式

calc = lambda x,y:x**y

print(calc(2,5))

 

匿名函式的主要用法是和其他函式搭配使用

res = map(lambda x:x**2,[1,5,7,4,8])  #這裡直接定義了一個變數的計算過程,用lambda函式定義X,冒號後面傳遞一個計算的方式,最後用列表定義x的值

for i in res:

  print(i)

 

高階函式

變數可以指向函式,函式的引數能接受變數,那麼一個函式就可以接收另一個函式作為引數,這種函式就稱之為高階函式

只要滿足以下任意一個條件,即是高階函式

1、接受一個或多個函式作為輸入

2、return返回另一個函式

def add(x,y,f):

  return f(x) + f(y)

res = add(3,-6,abs)

print(res)

 

遞迴函式

在函式內部,可以呼叫其他函式。如果一個函式在內部呼叫自身本身,這個函式就是遞迴函式

def calc(n):

  print(n)

  if int(n/2) == 0:

    return n

return calc(int(n/2)

calc(10)