位置参数
普通定义参数方式,调用函数时,按照形参的位置顺序传递实参
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,'男','张三')
关键字参数
不按顺序传递时,在小括号()里写上形参名
例子:
add_student(age = 20,sex = '男',name = '张三')
好处:
调用函数时参数的顺序,与定义函数时参数的顺序,可以不一致
默认值参数
见print()函数,sep、end就是有默认值的参数
def dengji(name , age = 20,sex = '男' ):
print("姓名:",name)
print("年龄:",age)
print("性别:",sex)
调用:
dengji("韩梅梅",19,"女") # 有值就依次传入
dengji("李雷") # 没有传入值,就使用默认值
注意
默认值参数只能在最后,否则报错
查看print()函数定义
在python交互环境中,通过执行命令
help(print)
可变位置参数(可变参数)
print()函数,第一个参数的个数是不定长的
例子:
def cook(*name):
#查看传入的类型
print(type(name))
print(name)
#调用
cook('小鸡','蘑菇','土豆')
执行结果:
('小鸡', '蘑菇', '土豆')
加了星号 * 的参数会以元组(tuple)的形式传入
注意
可变参数只能在最后,否则报错
如何将list变量传进去?
l=['小鸡','蘑菇','土豆']
#错误操作
cook(l)
#正确操作
#在前面加*号,把list或tuple的元素变成可变参数传进去
cook(*l)
可变关键字参数
提出问题:
- 当一个函数的参数非常多,定义函数时形参较长
- 当一个函数的参数不确定,可能会改变,那么会导致形参会经常改动
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缩写
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变量传进去
def emp(**info):
print(info)
d={'name':'鹿晗','job':'歌手','age':'30'}
emp(**d)
命名关键字参数(应用较少)
有时我们在定义函数时,想指定传入某些参数,解决方法如下:
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='测试')
总结
不要同时使用太多的组合,否则函数接口的可理解性很差,一般使用如下方式,即可完成所有功能
def fun(*args,**kw):
pass
但不要过度使用,不便于理解
参数定义的顺序
网上有很多参数定义的顺序,经验证,都有瑕疵
