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)]))