Python之函數&參數&參數解構


1.1函數定義

def 函數名(參數列表): 
    函數體(代碼塊) 
    [return 返回值] p 
函數名就是標識符,命名要求一樣
語句塊必須縮進,約定4個空格
Python的函數沒有return語句,隱式會返回一個None值,這個值可被變量接收並且print
定義中的參數列表成為形式參數,只是一種符號表達,簡稱形參 
調用
函數定義,只是聲明了一個函數,它不會被執行,需要調用
調用的方式,就是函數名加上小括號,括號內寫上參數
調用時寫的參數是實際參數,是實實在在傳入的值,簡稱實參

1.2函數不可變參數

1.位置參數
def f(x, y, z) 調用使用 f(1, 3, 5) 
按照參數定義順序傳入實參 
要求位置參數必須在關鍵字參數之前傳入,位置參數是按位置對應的
2.關鍵字參數(keywords)
def f(x, y, z) 調用使用 f(x=1, y=3, z=5) 
使用形參的名字來出入實參的方式,如果使用了形參名字,那么傳參順序就可和定義順序不同
3.參數默認值
定義時在形參后跟上默認值
def fn(x=4,y=5):
參數的默認值可以在未傳入足夠的實參的時候,對沒有給定的參數賦值為默認值 
參數非常多的時候,並不需要用戶每次都輸入所有的參數,簡化函數調用 
可以用位置參數的形式來傳遞實參,也可以用關鍵字參數傳遞實參
可以以關鍵字,或者位置參數傳遞實參

1.3函數之可變參數:一個形參可以匹配任意個參數

1.位置參數的可變參數
在形參前使用*表示該形參是可變參數,可以接收多個實參 
收集多個實參為一個tuple 
*args,可以接受0到任意個參數
2.關鍵字參數的可變參數
形參前使用**符號,表示可以接收多個關鍵字參數 
收集的實參名稱和值組成一個字典
**kwargs,可以接受0到任意個參數
3.可變參數混合使用
def showconfig(username, password, **kwargs, *args):  #**kwargs 不能放在*args之前
def showconfig(username, password, **kwargs) #username,password可以同時當作位置參數或者keywords參數
def showconfig(username, *args, **kwargs)     #username不能做關鍵字參數,關鍵字參數不能放在可變位置參數之前

1.3.1可變參數總結

有位置可變參數和關鍵字可變參數
位置可變參數在形參前使用一個星號*
關鍵字可變參數在形參前使用兩個星號**
位置可變參數和關鍵字可變參數都可以收集若干個實參,位置可變參數收集形成一個tuple,關 鍵字可變參數收集形成一個dict
混合使用參數的時候,可變參數要放到參數列表的最后,普通參數需要放到參數列表前面,位 置可變參數需要在關鍵字可變參數之前

1.4keyword-only參數

如果在一個星號參數后,或者一個位置可變參數后,出現的普通參數,實際上已經不是普通的 參數了,而是keyword-only參數 
def fn(*args, x, y, **kwargs): #x,y放在位置可變參數之后,在傳遞實參的時候,必須要用關鍵字參數傳遞x,y否則會報錯
args可以看做已經截獲了所有的位置參數,x,y不使用關鍵字參數就不可能拿到實參 
def fn(y, *args, x=5):  #x 是 keyword-only參數

1.4.1keyword-only另外一種形式

def fn(*,x,y):
*號之后,普通形參都變成了必須給出的keyword-only 參數

1.5參數規則

參數列表參數一般順序是,普通參數、缺省參數、可變位置參數、keyword-only參數(可帶缺 省值)、可變關鍵字參數 
def fn(x, y, z=3, *args, m=4, n, **kwargs): 
1.x,y傳遞的實參不可省略
2.fn(100,99,98,97,m='a',n='b')    #位置參數超2個就會更該默認參數
3.fn(100,99,m='a',n='b')    #傳遞2個位置參數的時候默認參數生效

1.6參數解構

給函數提供實參的時候,可以在集合類型前使用*或者**,把集合類型的結構解開,提取出所有 元素作為函數的實參 
非字典類型使用*解構成位置參數 
字典類型使用**解構成關鍵字參數
提取出來的元素數目要和參數的要求匹配,也要和參數的類型匹配 
def add(x, y): 
add(4, 5)     #正常調用
add((4,5))     #錯誤調用被當做一個參數
add(*(4,5))    #參數解構
add(*range(1,3))
add(**{'a': 5, 'b': 6})      #解構value
add(*{'a': 5, 'b': 6})         #解構key

1.7參數解構例子

import random
def double_valuse(*nums):
    return max(nums),min(nums)
#調用1
x,y = double_valuse(*[random.randint(1,20) for i in range(10)])
print(x,y)

#調用2,print() 也是個函數,所以在打印的時候 double_vaules也可以參數解構
print(*double_valuse(*[random.randint(1,20) for i in range(10)]))

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM