首頁 >後端開發 >Python教學 >python函數中參數的詳細介紹

python函數中參數的詳細介紹

不言
不言轉載
2018-10-09 16:33:173025瀏覽

這篇文章帶給大家的內容是關於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 &#39;list&#39;>
(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中文網其他相關文章!

陳述:
本文轉載於:segmentfault.com。如有侵權,請聯絡admin@php.cn刪除