函数详解(二)

 函数的参数传递:

通常,将定义函数时设置的参数称为形式参数(简称为形参),而调用函数时传入的参数称为实际参数(简称为实参)。函数的参数传递是指将实际参数传递给形式参数的过程。

函数可以有参数,也可以没有,但必须保留括号。

格式如下:

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}。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一直再追梦

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值