在 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类型