這篇文章帶給大家的內容是關於python函數中參數的詳細介紹,有一定的參考價值,有需要的朋友可以參考一下,希望對你有幫助。
定義函數
python中的函數使用關鍵字def 定義,格式為:
def 函数名(形参): 函数语句块
函數名稱只能包含字串、底線和數字且不能以數字開頭。
函數的形參分為:位置參數、預設參數(自帶預設值的參數)、動態參數
return是關鍵字,作用是返回函數的結果,遇到return時函數立刻結束,不再執行其他語句
位置參數
def func(a,b): return a,b print(func(1,2)) #按照位置传入参数,1赋值给a,2赋值给b print(func(a=2,b=3))#按照关键字传入参数,指定a、b的值 print(func(3,b=6))#混合传入,此时注意,位置参数要在前面 #如果不指定实参会报错,因为函数中由位置参数,则调用函数时必须传入参数 #print(func())
輸出結果為:
(1, 2) (2, 3) (3, 6)
不寫return或只寫return,後面不寫其他內容時,函數會傳回None
return可以傳回任意資料類型的值。當return傳回多個值時,會被組織成元組,也就是說傳回多個值時,類型為元組。可以用多個變數接收結果,但變數的數量要與傳回的值數相同,範例如下:
def func(): return 1,'asd',(1,'a',['hello','world']),[1,2,3] print('直接打印结果:',func()) a,b,c,d = func() print('a:',a) print('b:',b) print('c:',c) print('d:',d)
輸出:
直接打印结果: (1, 'asd', (1, 'a', ['hello', 'world']), [1, 2, 3]) a: 1 b: asd c: (1, 'a', ['hello', 'world']) d: [1, 2, 3]
預設參數##
def func(name,age=20): print('{}已经{}岁啦'.format(name,age)) func('刘小姐')#默认参数可以不传,这时age值为默认的20 func('刘小姐',28)#默认参数传值时则覆盖默认值
刘小姐已经20岁啦 刘小姐已经28岁啦預設值只被賦值一次。這使得當預設值是可變物件時會有所不同,例如列表、字典或大多數類別的實例。例如,下面的函數在後續呼叫過程中會累積(前面)傳給它的參數:
def func(a = []): a.append('x') return a for i in range(6): print(func())每次循環呼叫的時候,雖然沒有給a傳入參數,但是a並不會被賦值空列表[],原因是預設值只會被賦值一次,所以輸出結果變成了下面的樣子:
['x'] ['x', 'x'] ['x', 'x', 'x'] ['x', 'x', 'x', 'x'] ['x', 'x', 'x', 'x', 'x'] ['x', 'x', 'x', 'x', 'x', 'x']如果你不想讓預設值在後續呼叫中累積,你可以像下面一樣定義函數:
def func(a = None): if a is None: #如果a是None a = [] a.append('x') return a for i in range(6): print(func())
['x'] ['x'] ['x'] ['x'] ['x'] ['x']
動態參數
動態參數分成兩種:一種是用*args表示,它會把多餘的位置參數統一接收,保存成一個元組的形式
另一種是用**kwargs表示,他會把多餘的關鍵字參數統一接收,保存成一個字典的形式
先看一個*args的例子
def func(a,b,c,*args): print('*args内容为:',args) sum1 = 0 for i in args: sum1 += i sum1 = sum1 + a +b +c return sum1 print(func(1,2,3,4,5,6,7,8,9,10))雖然形參只有4個,但是我們傳入了10個,4—10 都被*args接收形成元組
*args内容为: (4, 5, 6, 7, 8, 9, 10) 55再來看看**kwargs
def func(a,b,*args,c=20,**kwargs): print('*args内容为:',args) print(c) print('**kwargs内容为:',kwargs) sum1 = 0 for i in args: sum1 += i sum1 = sum1 + a +b +c for k in kwargs: sum1 += kwargs[k] return sum1 print(func(1,2,3,4,5,6,7,8,9,10,c=22,x=11,y=33,z=66))
*args内容为: (3, 4, 5, 6, 7, 8, 9, 10) 22 **kwargs内容为: {'x': 11, 'y': 33, 'z': 66} 187從上例可以看出如果各種類型的形參都出現時,它們的順序應該是:位置參數、動態參數
args、預設參數、動態參數*keargs
#因為假設預設參數在args之前,也就是func(a,b,c=20,args,*kwargs),那麼傳入參數時,形參c的值先會被實參3賦值(因為3的位置恰好對應c,默認參數不賦值時值為默認,賦值時則覆蓋默認值),此時c=3,但是後面又出現了c=20,這時就會報錯,因為形參c被重複賦值了兩次,這是不允許的所以預設參數排在args後面
預設參數必須排在kwargs前面,因為如果排在後面,則c=22會被kwargs直接接收,這樣預設參數就毫無意義,這是不被允許的,會報錯
下面是預設參數排在*args前面的另一種方式,這種方式雖然也得出了相同的結果但是在調用時要特別的小心c的值所在的位置,而且這種方式會造成默認參數變得毫無意義,因為始終用不到默認值20 。
所以預設參數還是放在*args後面合適。
def func(a,b,c=20,*args,**kwargs): print('*args内容为:',args) print(c) print('**kwargs内容为:',kwargs) sum1 = 0 for i in args: sum1 += i sum1 = sum1 + a +b +c for k in kwargs: sum1 += kwargs[k] return sum1 print(func(1,2,22,3,4,5,6,7,8,9,10,x=11,y=33,z=66))
*args内容为: (3, 4, 5, 6, 7, 8, 9, 10) 22 **kwargs内容为: {'x': 11, 'y': 33, 'z': 66} 187
動態參數的一種快捷傳參方式
#對於*args,可以在傳入參數時在lis前面加上*號直接傳入內容def func(*args): return args lis = [1,2,{3,4,5},6,7,[8,9,0,1,23],34,5,(56,67),78,23] print(type(lis)) print(func(*lis))
<class 'list'> (1, 2, {3, 4, 5}, 6, 7, [8, 9, 0, 1, 23], 34, 5, (56, 67), 78, 23)對於**kwargs可以在傳入參數時在dic前面加上**號直接傳入內容
def func(**kwargs): return kwargs dic = {'name':'超人','age':'500','job':'装逼'} print(func(**dic))
{'name': '超人', 'age': '500', 'job': '装逼'}
以上是python函數中參數的詳細介紹的詳細內容。更多資訊請關注PHP中文網其他相關文章!