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)