形参---函数完成其工作所需的一项信息,在定义函数时出现的参数
实参---调用函数时传递给函数的信息
提供的实参多余或者少于函数完成其工作所需的信息时,将出现实参不匹配错误。
形参实参:
- 定义一个函数之后,我们后面可以进行多次调用。
- 调用函数时,必须使得实参和形参一一对应,最简单的关联方式就是基于实参的顺序,即形参的顺序是power(x,y),实参的power(a,b)就要依次将a,b值传递给(x,y),
- 实参可以覆盖形参的值,若形参power(x=0,y),调用时power(2),python会先列出没有默认值的参数y,然后赋值2;若调用时power(x=0,y=1),则传递的实参的值会覆盖掉形参的值,即,传递的参数值为0,1。
- 关键值实参---关键值实参传递的时候直接将参数和值以成对的形式传递给函数,在实参传递的时候务必要保证写对形参以及对应的值,这样的传递无所谓顺序,因为我已经一一对应了。
大家一起看个栗子。
不可更改的对象
这个函数的输出值是多少?很多人会回答7,其实程序运行之后,其答案是6
为什么在这里形参的数值并不改变实参的数值?
这里需要给大家普及一个Python中的基础,在python中,string(字符串), tuples(元组), 和number(数值)是不可更改的对象,而list(列表),dict(字典)等则是可以修改的对象。
也就是说,这里形参的数值对于外部的实参的数值(number类型,不可变)来说是没有任何关系的,他们虽然是同一个名字,但是其指向对象是不一样的。所以当在程序最后进行打印a输出值的时候,其输出仍然是6。
下面这个栗子我们来看看可变的对象,以list(列表)作为实验对象。
可更改的对象
这个函数的输出值是多少?很多人会回答[1,2],其实程序运行之后,其答案是[2,1]。
与第一个栗子刚刚相反,这里形参的数值调用把实参改变了。因为本例中参数传递的是列表,其是可更改的对象,在函数内部经过系列赋值变化之后,所以在程序运行之后其输出值产生了变化。
另一个例子:
def modify1(m,K):
m=2
K=[4,5,6]
return
def modify2(m,K):
m=2
K[0]=0
return
n=100
L=[1,2,3]
modify1(n,L)
print(n)
print(L)
modify2(n,L)
print(n)
print(L)
从结果可以看出,执行modify1( )之后,n和L都没有发生任何改变;执行modify2( )后,n还是没有改变,L发生了改变。因为在Python中参数传递采用的是值传递方式,在执行函数modify1时,先获取n和L的id( )值,然后为形参m和K分配空间,让m和K分别指向对象100和对象[1,2,3]。m=2这句让m重新指向对象2,而K=[4,5,6]这句让K重新指向对象[4,5,6]。这种改变并不会影响到实参n和L,所以在执行modify1之后,n和L没有发生任何改变;在执行函数modify2时,同理,让m和K分别指向对象2和对象[1,2,3],然而K[0]=0让K[0]重新指向了对象0(注意这里K和L指向的是同一段内存),所以对K指向的内存数据进行的任何改变也会影响到L,因此在执行modify2后,L发生了改变。
最后一个例子:
函数定义中,y=2是形参中的默认值,若只传递一个参数值,则y就默认为2,若实参传递两个值,则覆盖掉y这个默认值;return那里,因为参数z是一个字符串类型,xy是一个整型,所以要将数值类型转化为字符类型,同一类型才能进行拼接,一起输出。