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,'男','张三')

关键字参数

不按顺序传递时,在小括号()里写上形参名
例子:

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()函数定义,如下图:

可变位置参数(可变参数)

print()函数,第一个参数的个数是不定长的

例子:

def cook(*name):
    #查看传入的类型
    print(type(name))
    print(name)
#调用
cook('小鸡','蘑菇','土豆')

执行结果:

('小鸡', '蘑菇', '土豆')

加了星号 * 的参数会以元组(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缩写

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

但不要过度使用,不便于理解

参数定义的顺序

网上有很多参数定义的顺序,经验证,都有瑕疵


原文出处:/show_1EF29xwEf8df.html