函数的参数传递:
通常,将定义函数时设置的参数称为形式参数(简称为形参),而调用函数时传入的参数称为实际参数(简称为实参)。函数的参数传递是指将实际参数传递给形式参数的过程。
函数可以有参数,也可以没有,但必须保留括号。
格式如下:
def <函数名>( ):
<函数体>
return <返回值>
示例如下:
def fact(): print("我也是参数") fact()
可选参数传递:
函数定义时,我们也可以为某些参数指定一些默认值构成可选参数
所谓可选参数,就是在调用函数的时候,某些变量我们不提供,我们提供一些其他变量
格式如下:
def <函数名>( <非可选参数>,<可选参数>):
<函数体>
return <返回值>
我们通过示例进行了解,求解n!//m的代码示例如下:
def fact(n,m=1): #其中n.m即为可选参数,如果不给参数m,就把m设为1进行下面的运算,即为默认参数的传递。 s=1 for i in range(1,n+1): s*=i return(s//m) print(fact(10)) #调用时可以使用第二个参数也可以不使用第二个参数,此时参数只有n,没有m,即把m看作1进行计算。 print(fact(10,5))#此时的参数n=10,m=5。
运行界面如下:
可变参数传递:
定义函数时,可以设计函数接收的参数是可变数量的,即不确定参数总数量
语法格式如下:
def <函数名>( <参数>,<*b>): #其中的*b表达不确定的参数。
<函数体>
return <返回值>
我们通过示例进行了解,求解n!乘数的代码示例如下:
def fact(n,*b): s=1 for i in range(1,n+1): s*=i for item in b: #列表遍历循环(一个或多个数) s*=item return s print(fact(10,3)) print(fact(10,3,5,8))
运行界面如下:
函数调用时,参数可以按照位置或名称方式调用。
1.位置参数的传递
函数在被调用时会将实参按照相应的位置依次传递给形参,即将第一个实参传递给第一个形参,将第2个实参传递给第2个形参。
示例代码如下:
def fact(n,m=1): s=1 for i in range(1,n+1): s*=i return s print(fact(10,3))
运行界面如下:
2.关键字参数的传递
关键字参数的传递是通过“形参=实参”的格式将实参与形参相关联,将实参按照对应的关键字传递给形参。
示例代码如下:
def fact(n,m=1): s=1 for i in range(1,n+1): s*=i return s print(fact(n=10,m=3))
运行界面如下:
在何时使用位置传递何时使用关键字传递的问题中,在Python3.8中新增了仅限位置形参的语法,使用符号“/"来限定部分形参只接受采用位置参数传递方式的实参。即在符号/前面的参数仅接受位置传递。
示例代码如下:
def func(a,b,/,c): #其中a,b的形参只接受位置传递,不接受关键字传递。 print(a,b,c) func(10,5,c=5)
运行界面如下:
参数的打包:
如果函数在定义时无法确定需要接收多少个数据,那么可以在定义函数时为形参添加“*”或“**”。
如果形参的前面加上“*”,那么它可以接收以元组形式打包的多个值
如果形参的前面加上“**”,那么它可以接收以字典形式打包的多个值
代码示例如下:
def test(*args): print(args) def text(**know): print(know) test(11,22,33,44,55) text(a=11,b=22,c=33,d=44,f=55)
运行界面如下:
参数的解包:
如果函数在调用时接收的实参是元组类型的数据,那么可以使用“*”将元组拆分成多个值,并将每个值按照位置参数传递的方式赋值给形参。
如果函数在调用时接收的实参是字典类型的数据,那么可以使用“**”将字典拆分成多个键值对,并将每个值按照关键字传递的方式赋值给与键名对应的形参。
代码示例如下:
def test(a,b,c,d,e): print(a,b,c,d,e) nums=(1,2,3,4,5) test(*nums) rnum={'a':'11','b':'22','c':'33','d':'44','e':'55'} test(**rnum)
运行界面如下:
混合传递:
前面介绍的参数传递的方式在定义函数或调用函数时可以混合使用,但是需要遵循一定的优先级规则,这些方式按优先级从高到低依次为按位置参数传递,按关键字参数传递,按默认参数传递,按打包传递。
在定义函数时,带有默认值的参数必须位于普通参数(不带默认值或标识的参数)之后,带有“*”标识的参数必须位于带有默认值的参数之后,带有“**”标识的参数必须位于带有“*”标识的参数之后。
代码示例如下:
def test(a,b,c=33,*args,**know): print(a,b,c,args,know) test(1,2) test(1,2,3) test(1,2,3,4) test(1,2,3,4,5) test(1,2,3,4,e=5)
运行界面如下:
test()函数共有5个参数,当我们第一次调用该函数的时候,将1,2两个实参按照位置传递的方法分别赋值给a,b,剩余的三个形参没有收到实参,即c,*args,**know,输出他们的默认值即可。
第二次调用函数的时候,1,2,3三个实参按照位置传递的方法分别赋值给a,b,c。因为有值赋给c,所以c的默认值就不用了。剩余两个形参没有值赋给,即输出他们的默认值。
第三次调用函数的时候,1,2,3,4四个实参按照位置传递的方法分别赋值给a,b,c,args。因为有值赋给c,所以c的默认值就不用了。而第四个形参arg前面带一个*,可以接受以元组形式打包的多个值。即输出为(4,),最后一个形参没有值输出,即输出为默认值。
第四次调用函数的时候,1,2,3,4,5五个实参按照位置传递的方法分别赋值给a,b,c,args。此时因为5为值,不符合字典形式,所以将该值赋给可以接受多个值的元组形式的*args。其他的因为有值赋给c,所以c的默认值就不用了。而第四个形参args前面带一个*,可以接受以元组形式打包的多个值。即输出为(4,5),最后一个形参没有值输出,即输出为默认值。
第五次调用函数的时候,1,2,3,4,e=5五个实参按照位置传递的方法分别赋值给a,b,c,args,know。此时e=5符合字典形式,所以将该值赋给可以接受多个值的字典形式的*know。其他的因为有值赋给c,所以c的默认值就不用了。而第四个形参args前面带一个*,可以接受以元组形式打包的多个值。即输出为(4,5),最后一个形参know前面带两个**,可以接收以字典形式打包的多个值,即输出为{'e':5}。