参数可以让你的函数更灵活,不只能做死的动作,还可以根据调用时传参的不同决定函数内部的执行流程。

  • 形参:只有在被调用时才分配内存单元,在调用结束时,即可释放所分配的内存单元。因此形参只在函数内部有效。函数调用结束返回主调用函数后则不能再使用该形参变量。
  • 实参:可以是常量、变量、表达式、函数等,无论实参是何种类型的量,在进行函数调用时,它们都必须有确定的值,以便把这些值传送给形参。因此应预先用赋值、输入等办法使参数获得确定值。
def calc(x,y): #x,y是形参
    res = x**y
    return res

c = calc(a,b) #a,b是实参
print(a,b)
  • 默认参数
def stu_register(name,age,country,course):
    print('----注册学生信息----')
    print('姓名:',name)
    print('年龄:',age)
    print('国籍:',country)
    print('课程:',course)

stu_register('王山炮',22,'CN','python_devops')
stu_register('张叫春',21,'CN','linux')
stu_register('刘老根',25,'CN','linux')

发现country这个参数基本都是 'CN' 。

就像我们在网站上注册用户,像国籍这种信息,你不填写,默认就会是 中国 ,这就是通过默认参数实现的,把country变成默认参数非常简单。

这样,这个参数在调用时不指定,那默认就是CN,指定了的话,就用你指定的值。

def stu_register(name,age,course,country = 'CN'):
  • 关键参数

正常情况下,给函数传参数要按照顺序,不想按顺序就可以用关键参数,只需指定参数名即可(指定了参数名的参数就叫关键参数),但记住一个要求就是,关键参数必须放在位置参数(以位置顺序确定对应关系的参数)之后。

def stu_register(name,age,course='PY',country = 'CN'):
    print('----注册学生信息----')
    print('姓名:',name)
    print('年龄:',age)
    print('国籍:',country)
    print('课程:',course)

可以这样调用:

stu_register('王山炮',course='PY',age=22,country='JP')

不可以这样调用,不能把位置参数放在关键参数后面

stu_register('王山炮',course='PY',22,country='JP')

不可以这样调用,不能给一个参数赋两个值

stu_register('王山炮',22,age=25,country='JP')
  •  非固定参数
#报警,一个运维人员
def send_alert(msg,user):
    print(msg,',',user)
    
send_alert('别浪了','alex')

#报警,10个运维人员
send_alert('别浪了','alex')
send_alert('别浪了','xxx')
send_alert('别浪了','ooo')
如果参数中出现*args,传递的参数就可以不再是固定个数,传过来的所有参数都会被打包成元组发送给变量。
def send_alert(msg,*args): 
    for u in args:
        print(msg, ',', u)
#方式一:
send_alert('别浪了', 'alex','xxx','ooo')
#方式二:
send_alert('别浪了',*['alex','xxx','ooo'])#要输入一个列表或者元组的话,要在前面加上*,让   (['alex','xxx','ooo']) -> ('alex','xxx','ooo')
带*的参数要放在最后,不然不带*的参数就没有输入值了,因为带*的参数会把后面所有的输入打包,会截胡。
def send_alert(msg,*args,age):
    for u in args:
        print(msg,u,age)

 **kwargs只接收关键参数,以字典形式存储。

>>> def func(name,*args,**kwargs):
...     print(name,*args,*kwargs)
...
>>> func('alex',22,'tesla','500w')  #*args把位置参数后所有的输出元素都截胡了
alex 22 tesla 500w

>>> func('alex',22,'tesla','500w',addr='山东',num=2333)  #以关键参数形式输出的全部打包成字典发送给**kwargs
alex (22, 'tesla', '500w') {'addr': '山东', 'num': 2333}

>>> d = {'degree':'primary school'}
>>> func('Peiqi',d) #默认d为*args的参数
Peiqi ({'degree': 'primary school'},) {}

>>> func('Peiqi',**d) #用于直接给**kwargs赋值
Peiqi () {'degree': 'primary school'}