函数参数在实际应用过程中也是比较广泛,比如在注册的时候,一些信息的填写,有的是参数类型是必选参数,有的是可变参数,有的默认参数等等,这些都是通过函数的传参决定的,以用户输入的数据作为参数传递,调用整个函数运行从而完成功能。我们今天主要和大家分享一下,在python中一些常用的参数划分,比如位置参数,默认参数,关键字参数,可变参数,组合参数等一些实际的应用举例方便大家对函数的参数有更进一步的认识和学习。
一、位置参数
简单点理解就是和位置有关系。
def say_hello(name,age): print "hello,%s my age is %s"%(name,age) say_hello(‘zhangshan‘,134)
在调用say_hello(‘zhangshan‘,134)函数时,‘zhansgahn’在前面,134在后面。所以打印出来的结果也就是
hello,zhangshan my age is 134
但是如果你把实参的实际位置更换一下呢?
def say_hello(name,age): print "hello,%s my age is %s"%(name,age) say_hello(134,‘zhangshan‘)
把134 放在实参的前面,‘zhangshan’放在say_hello()的后面,这样调用起来打印的结果是怎么样的呢?我们看一下结果:
hello,134 my age is ‘zhanshan’
这样的顺序是没有一点毛病的,这就是根据实参的位置传递给形参时决定的,把实参的134给了name,实参的‘zhanshan’给了age,从而输出这样的效果。
我们继续聊第二种传参方式:
默认参数:可以把默认参数理解为在定义函数时,给正常的参数赋值的一个过程。但是这个赋值不是随便赋值的,也是要有套路的,什么套路呢?我们在赋值时,一定要把默认参数放到正常参数的后面,切记默认参数是一定不可以放到正常参数的前面的,一旦放了前面,整个函数的执行就会报错,一会我们可以试试。OK,你知道了这个,那接下来我们就来创建一个带有默认值得函数来看看效果:
1)默认参数放到正常参数的后面
def add(a,b=40): return a+b add(60)
代码解析:
1.定义add函数,给b赋值等于40,b=40就是该函数的默认参数,a是正常,满足默认参数在正常参数的前面
2.调用函数给add()函数传递了一个实际值60,这个60的实参传递给了a,那么也就是a=60,b采用默认值进行使用
3.所以整个函数返回的结果就是 a+b=60+40 = 100
4.如果我们给ad的()传递的实参是(50,50)那么这样的结果也会发生一个大变化(这个大家可以自行演示)
对于第4点的返回结果做一些说明,当函数有默认值时,如果实参给形参进行传递时,那么函数会优先考虑实参的值进行使用,直接会把默认值进行覆盖。这就是默认参数的第二个特点。我们在看默认参数的第三个知识点。默认参数不可以放到正常参数的前面,如果放,那么结果是怎么样的呢?
2)默认参数放在正常参数的前面
def add(b=40,a): return a+b add(60)
这里面我们b=40默认参数放在了a的正常参数的前面。那么在这个基础上,我们运行一下代码,会发现程序报错,报错信息如下。
SyntaxError: non-default argument follows default argument 大概意思就是语法上的错误:SyntaxError:非默认参数遵循默认参数,告诉你把正常参数应该放到默认参数的后面。
计算机出现这样的报错信息也可以理解,因为他的处理逻辑是这样的:
1.60给b,a忘了传参
2.60给a,b采用默认值40 进行计算
也就是说有2个结果都会发生 ,但是计算机不知道我们的真正意图是什么?程序运行的结果只有一个,而不会出现2个。就像你找老婆一样,一定要专一,不能天天换,天天换最后肯定是要出事儿的。
OK,我们继续介绍第三种参数演示:
三、关键字参数
简单点理解就是形参等于实参,忽略参数位置的一种传参手段。我们来看一个例子。
def add(a,b): return a+b add(a=60,b=20)
还是一样的例子,调用add()函数,在调用时给函数指定a=60,b=20,在运行时函数的处理过程是直接告诉形参a=60,b=20直接作用到函数内部,而这个和位置没任何关系。也就是说你把b=20,a=60 这么调换位置也是可以的,打印的结果也是一样的,和前面的操作没有任何的变化。当然这是关键字参数的第一种用户,我们看第二种。
我们定义个函数用来实现一组学生的信息,那么这个函数名我们定义为strudentinfo
def studentinfo(name,age,address=‘beijing‘): print ‘name‘,name print ‘age‘,age print ‘address‘,address studentinfo(‘zhanshan‘,150) studentinfo(‘zhanshan‘,150,address=‘南昌‘)
运行结果:
name zhanshan age 150 address beijing name zhanshan age 150 address 南昌
我们不难发现第一次调用的结果和第二次调用的结果address的值发生了变化。因为我们第二次对address赋值为南昌,当然对address不进行重新赋值,直接将南昌这个参数放到第三个位置,运行的效果也是一样的,函数会优先采用实参进行使用。
def studentinfo(name,age,address=‘beijing‘): print ‘name‘,name print ‘age‘,age print ‘address‘,address studentinfo(‘zhanshan‘,150) studentinfo(‘zhanshan‘,150,‘南昌‘)
输出的结果:
name zhanshan age 150 address beijing name zhanshan age 150 address 南昌
我们继续改变一下上面的例子:
def studentinfo(name,age,address=‘beijing‘): print ‘name‘,name print ‘age‘,age print ‘address‘,address studentinfo(‘zhanshan‘,age=150,address=‘南昌‘)
运行结果是:
name zhanshan age 150 address 南昌
如果我们想定义的关键字参数可以接收多个参数呢?
def studentinfo(name,age=150,**kw): print ‘name is ‘,name print ‘age is‘,age print ‘city is‘,kw print ‘address is‘,kw studentinfo(‘zhangshan‘,15,city=‘beijing‘,address=‘nanchang‘)
**kw带表的是可以接收多个关键字参数,是关键字参数,不是默认参数哦。输出的结果是:
name is zhangshan age is 15 city is {‘city‘: ‘beijing‘, ‘address‘: ‘nanchang‘} address is {‘city‘: ‘beijing‘, ‘address‘: ‘nanchang‘}
因为接收的参数是不固定的,所以在返回时将所有接收的参数统一放到字典中保存。我们同样也可以把关键字参数作为一个字典存储起来去调用,请看正确的表演姿势。
def studentinfo(name,age=150,**kw): print ‘name is ‘,name print ‘age is‘,age print ‘city is‘,kw print ‘address is‘,kw dict ={‘city‘:‘beijing‘,‘address‘:‘shenzhen‘,‘home‘:‘china‘} studentinfo(‘zhangshan‘,1500,**dict)
那么,输出的结果如下:
name is zhangshan age is 1500 city is {‘home‘: ‘china‘, ‘address‘: ‘shenzhen‘, ‘city‘: ‘beijing‘} address is {‘home‘: ‘china‘, ‘address‘: ‘shenzhen‘, ‘city‘: ‘beijing‘}
也同样将关键字参数返回的结果储存到一个字典中。
四、可变参数