在 python函數的聲明和調用 中咱們簡單的瞭解了函數的相關使用,然而在函數傳遞參數的時候,咱們埋下了一個坑,關於不定長參數的傳遞咱們尚未講,今天這篇文章主要就是講解這個問題。python
函數的不定長參數包含*args和**kwargs,完整實例以下:git
1github 2微信 3ide 4函數 5spa |
def function_print(*args,**kwargs): # 傳遞不定長參數,即參數個數不固定 print(args) print(kwargs) function_print() |
輸出結果:code
1orm 2blog |
() {} |
代碼分析:由輸出結果能夠看出來,第一個形參*args 是元組tuple類型,第二個形參**kwargs是字典dict類型.
a.形參 *args 類型是元組tuple,外部調用函數時傳遞的參數不管是整數仍是BOOL值或者是字符串str,實際上傳遞的都是元組數據;
b.若是函數形參是不定長參數,外部調用函數傳遞多個參數時,默認按順序實參匹配形參,剩餘的參數所有做爲(元組)不定長參數傳遞;
c.若是沒有爲函數的不定長參數傳遞參數,默認爲空元組();
示例代碼以下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
#普通形參 def function_print1(arg): print("普通形參 : arg=",arg) #不定長形參 def function_print2(*args): print("不定長形參 : args=",args) #普通形參 + 不定長形參 def function_print3(arg,*args): print("普通形參 + 不定長形參 : arg=",arg) print("普通形參 + 不定長形參 : args=",args) function_print1(False) function_print1("hello world") print("***"*20) function_print2(False) function_print2("hello world") print("***"*20) function_print3(False) # 只爲函數傳遞了一個形參,不定長參數的形參默認爲空元組() function_print3("hello world") print("***"*20) # 若是函數的形參是不定長參數,當外部調用函數傳遞多個參數時,默認按順序匹配形參,剩餘的參數所有做爲不定長參數傳遞 function_print3(False,1,23,4,5) function_print3("hello world",False,0,True,"python教程") |
輸出結果:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
普通形參 : arg= False 普通形參 : arg= hello world ************************************************************ 不定長形參 : args= (False,) 不定長形參 : args= ('hello world',) ************************************************************ 普通形參 + 不定長形參 : arg= False 普通形參 + 不定長形參 : args= () 普通形參 + 不定長形參 : arg= hello world 普通形參 + 不定長形參 : args= () ************************************************************ 普通形參 + 不定長形參 : arg= False 普通形參 + 不定長形參 : args= (1, 23, 4, 5) 普通形參 + 不定長形參 : arg= hello world 普通形參 + 不定長形參 : args= (False, 0, True, 'python教程') |
a.形參 **kwargs 類型是字典dict,函數外部調用函數傳遞參數時須要使用關鍵字參數,實參寫法:a=1,b=2,c=False,d=」hello」;
b.若是函數形參是不定長參數,外部調用函數傳遞多個參數時,默認按順序實參匹配形參,關鍵字參數所有做爲(字典)不定長參數傳遞;
c.若是沒有爲函數的不定長參數傳遞參數,默認爲空字典{};
示例代碼以下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
#普通函數 def function_print1(arg): print("普通函數形參 : arg=",arg) #普通函數不定長形參 def function_print2(**kwargs): print("不定長形參 : args=",kwargs) #普通函數形參 + 不定長形參 def function_print3(arg,**kwargs): print("普通函數形參 + 不定長形參 : arg=",arg) print("普通函數形參 + 不定長形參 : args=",kwargs) function_print1(False) function_print1("hello world") print("***"*20) function_print2(a=False) function_print2(c="hello world") print("***"*20) function_print3(False) function_print3("hello world") print("***"*20) function_print3(False,a=1,b=23,h=4,v=5) function_print3("hello world",y=False,i=0,a=True,j="python教程") |
輸出結果:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
普通函數形參 : arg= False 普通函數形參 : arg= hello world ************************************************************ 不定長形參 : args= {'a': False} 不定長形參 : args= {'c': 'hello world'} ************************************************************ 普通函數形參 + 不定長形參 : arg= False 普通函數形參 + 不定長形參 : args= {} 普通函數形參 + 不定長形參 : arg= hello world 普通函數形參 + 不定長形參 : args= {} ************************************************************ 普通函數形參 + 不定長形參 : arg= False 普通函數形參 + 不定長形參 : args= {'a': 1, 'b': 23, 'h': 4, 'v': 5} 普通函數形參 + 不定長形參 : arg= hello world 普通函數形參 + 不定長形參 : args= {'y': False, 'i': 0, 'a': True, 'j': 'python教程'} |
3.函數不定長參數*args和**kwargs只能放在形參的末尾,順序不能錯.
1 2 |
def function_print(arg1,*args,**kwargs): # *args,**kwargs 必須在形參的末尾,順序不能亂 pass |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
# !usr/bin/env python # -*- coding:utf-8 _*- """ @Author:何以解憂 @Blog(我的博客地址): shuopython.com @WeChat Official Account(微信公衆號):猿說python @Github:www.github.com @File:python_args.py @Time:2019/10/3 21:48 @Motto:不積跬步無以致千里,不積小流無以成江海,程序人生的精彩須要堅持不懈地積累! """ ''' 普通函數形參 + 不定長形參: arg1:普通形參 arg1:普通形參 args:不定長參數-元組 kwargs:不定長參數-字典 ''' def function_print(arg1,arg2,*args,**kwargs): print(arg1,arg2,args,kwargs) function_print(False,1,b=23,h=4,v=5) function_print("hello world",False,0,True,j="python教程",a=True) |
輸出結果:
1 2 |
False 1 () {'b': 23, 'h': 4, 'v': 5} hello world False (0, True) {'j': 'python教程', 'a': True} |
注意:注意參數的順序匹配
注意函數傳參的三種形式:
1.普通傳參
2.缺省參數,若是外部沒有爲缺省參數傳遞實參,形參等於默認值
3.注意不定長參數的拆包,普通實參打包爲元組tuple類型,關鍵字參數打包爲字典dict類型