python函数的位置参数、默认参数、不定长参数、关键字参数、命名关键字参数 作者:马育民 • 2018-10-31 09:46 • 阅读:10225 # 位置参数 普通定义参数方式,调用函数时,按照形参的位置顺序传递实参 ```python def dengji(name , age ,sex ): print("姓名:",name) print("年龄:",age) print("性别:",sex) ``` `name`、`age`、`sex` 都是必选参数,调用时不传实参,会报错,错误如下: ``` TypeError: add() missing 1 required positional argument: ... ``` 调用时,必须按照位置顺序传递 ``` add_student('张三',20,'男') ``` 不按照位置顺序传参,数据大乱套: ``` add_student(20,'男','张三') ``` # 关键字参数 不按顺序传递时,在小括号()里写上形参名 例子: ```python add_student(age = 20,sex = '男',name = '张三') ``` **好处:** 调用函数时参数的顺序,与定义函数时参数的顺序,可以不一致 # 默认值参数 见print()函数,sep、end就是有默认值的参数 ```python def dengji(name , age = 20,sex = '男' ): print("姓名:",name) print("年龄:",age) print("性别:",sex) ``` **调用:** ``` dengji("韩梅梅",19,"女") # 有值就依次传入 ``` ``` dengji("李雷") # 没有传入值,就使用默认值 ``` ### 注意 默认值参数只能在最后,否则报错 ### 查看print()函数定义 在python交互环境中,通过执行命令 ``` help(print) ``` 查看print()函数定义,如下图: [](http://www.malaoshi.top//upload/0/0/1EF2BQI58ccd.png) # 可变位置参数(可变参数) print()函数,第一个参数的个数是不定长的 例子: ```python def cook(*name): #查看传入的类型 print(type(name)) print(name) #调用 cook('小鸡','蘑菇','土豆') ``` 执行结果: ```shell ('小鸡', '蘑菇', '土豆') ``` 加了星号 `*` 的参数会以元组(tuple)的形式传入 ### 注意 可变参数只能在最后,否则报错 ### 如何将list变量传进去? ``` l=['小鸡','蘑菇','土豆'] #错误操作 cook(l) #正确操作 #在前面加*号,把list或tuple的元素变成可变参数传进去 cook(*l) ``` # 可变关键字参数 ### 提出问题: 1. 当一个函数的参数非常多,定义函数时形参较长 2. 当一个函数的参数不确定,可能会改变,那么会导致形参会经常改动 ``` def add_student(name,birthday,tel,sex,fname='',fjob='',ftel='',mname='',mjob='',mtel=''): print("姓名:",name) print("生日:",birthday) print("联系方式:",tel) print("性别:",sex) print("父亲姓名:",fname) print("父亲工作:",fjob) print("父亲联系方式:",ftel) print("母亲姓名:",mname) print("母亲工作:",mjob) print("母亲联系方式:",mtel) ``` 解决上面问题的方法是使用 **关键字参数** ### 定义 两个星号 `**` 的参数会以字典的形式导入 一般形参名为kw,keyword缩写 ```python def add_student(name,birthday,tel,sex,**fm): print("姓名:",name) print("生日:",birthday) print("联系方式:",tel) print("性别:",sex) print("fm:",fm) print("父亲姓名:",fm.get("fname")) print("父亲工作:",fm.get("fjob")) print("父亲联系方式:",fm.get("ftel")) print("母亲姓名:",fm.get("mname")) print("母亲工作:",fm.get("mjob")) print("母亲联系方式:",fm.get("mtel")) ``` 调用: ``` add_student('李雷','2000-10-1','138','男',fname = '李大大',fjob='处长',mname='李妈妈',mtel='138888888') ``` **好处:**主要参数和非主要参数,将非主要参数定义成可变关键字参数 **缺点:**可以传入任意参数,无法指定传入某些参数 ### 如何将dict变量传进去 ```python def emp(**info): print(info) d={'name':'鹿晗','job':'歌手','age':'30'} emp(**d) ``` # 命名关键字参数(应用较少) 有时我们在定义函数时,想指定传入某些参数,解决方法如下: ```python def find_girl(age, *, city, like): print(age, city, like) #错误调用 find_girl(20,name='长春',like='电影') #正确调用 find_girl(20,city='长春',like='电影') #或者 d={"city":"长春","like":"吃饭睡觉打豆豆"} find_girl(18,**d) ``` 命名关键字参数需要一个特殊分隔符*,*后面的参数被视为命名关键字参数 # 参数组合的常见情况 1.默认值参数后面 **不能** 跟没有默认值参数 ``` def fun(b=1,a): pass ``` 2.默认值参数后面可以跟没有默认值参数的情况 ``` def fun(*c,d=1,a): pass ``` 3.**不能** 定义多个 **不定长参数** ``` def fun(*a,b=1,*b): pass ``` 4.**不能** 定义多个 **关键字参数** ``` def fun(**a,**b): pass ``` 5.正确调用下面函数: ``` def fun(*h,w=12,k): print(h,w,k) fun(1,2,3,w=13,k='测试') ``` # 总结 不要同时使用太多的组合,否则函数接口的可理解性很差,一般使用如下方式,即可完成所有功能 ```python def fun(*args,**kw): pass ``` **但不要过度使用,不便于理解** ### 参数定义的顺序 网上有很多参数定义的顺序,经验证,都有瑕疵 原文出处:http://www.malaoshi.top/show_1EF29xwEf8df.html