Python自定义函数的参数解读

近期有朋友提问,在学习Python的自定义函数时有些费解,主要是不能透彻的理解自定义函数中的可变参数和关键字参数,它们的区别和应用场景是什么?那在此借助自己的公众号跟大家聊聊Python中自定义函数的那点常识。

一、自定义函数的语法


       自定义函数,顾名思义就是根据用户自己的需求做一个DIY,通过这个DIY就可以解决特定场景下的问题了。同时,这个被各种表达式封装的DIY还可以重复利用,从而可以避免代码的大量重复,我举个例子也许就能明白了。首先,我们来看一下构造自定义函数的语法:

# 自定义函数语法def func_name(parameters):
    expression        return(res)
  • def为创建自定义函数的关键字,即告诉Python,我要准备构造函数了;

  • func_name是用户为自己的函数起的一个名称,最好能够做到见名如见意;

  • parameters为该函数需要使用到的形参,当然你也可以不使用参数;

  • expression就是你的函数实体了,即需要这个实体做什么;

  • return也是个关键字,目的是将最终的结果进行输出;


例子:

       小明今天刚上完等差数列相关的知识点,晚上老师布置了关于求解等差数列an = 3 + 5n的前5项、前10项、前50项和前100项的和。换着是现在,你完全可以通过Python写一段循环完成累加,具体如下:

s = 0i = 1while(i<=N):
    s += 3 + 5*i
    i += 1print(s)

       基于上面的这个循环,只需要将N换成5、10、50和100跑4次就可以得到结果。但你会发现,每次运行的时候都是这7行代码一起运行,会显得不是那么简介而高大上。如果,你把这个7行代码封装到一个函数体内,那将是一劳永逸。具体看下方的代码:

# 等差数列的前N项和def sn(N):    s = 0    i = 1    while(i <= N):
       s += 3 + 5*i
       i += 1    return(s)# 求和sn(5)
sn(10)
sn(50)
sn(100)

求等差数列的任意前N项和的话,我只需要调用这个自定义函数sn,然后将参数N换着不同的值即可。

       从上面的例子我们也确实感受到了函数的威力,既可以完成特定的需求,又可以将这个封装的函数随时进行重复调用,避免了多行代码的重复编写与运行。


自定义函数的参数


       自定义函数有个parameters参数,如上面讲的sn函数,其中的N就叫参数,每次运行函数的时候,只需要将一个实参传递给这个形参N即可。在Python中,有关自定义函数的参数一共有4种定义,他们分别是:

  • 必选参数

  • 默认参数

  • 可变参数

  • 关键字参数

接下来我们对这四种参数进行举例说明。

1、必选参数

       必选参数,顾名思义就是当你在调用一个自定义函数时,必选给函数中的一些参数赋值,否则程序将会报错,并提醒用户“缺少一些必选的位置参数”。就拿上面的sn函数,如果不给该函数的参数N提供一个值,结果就是这样的:

def sn(N):
    s = 0
    i = 1
    while(i <= N):
        s += 3 + 5*i
        i += 1
    return(s)# 求和sn()

0?wx_fmt=png


2、默认参数

       我们还是以老师布置给小明的等差数列为例,小明就在想,这次老师布置的是an=3+5n的前N项和,那么下次的作业很可能就不是这个通项公式了,但有一条不变的规则就是通项公式中的3和5会变。那在自定义函数的时候,只需要再增加两个参数分别代表3和5。

def sn(a, d, N = 10):
    s = 0
    i = 1
    while(i <= N):
        s += a + d*i
        i += 1
    return(s)

       上面这个自定义函数一共有3个参数,其中a和d就是必须参数,因为在函数定义时并没有给他一个初始值,而N参数就是一个默认参数,并假定初始值为10,即默认求解通项公式的前10项和。如果你需要改变前10项和的话,只需要给参数N重新赋值即可,举例如下:

# 求解通项公式为an=8+5n的前100项和sn(a = 8, d = 5, N = 100)

0?wx_fmt=png

3、可变参数

       上面讲解的必选参数和默认参数,都是在已知这个自定义函数需要多少个形参的情况下构建的。那如果我不确定该给这个函数传入多少个参数的时候,该怎样自定义函数呢?这么说可能有点抽象,我们举个对比的例子来说明。小明的弟弟小亮刚读一年级,老师布置了一些关于两个数的求和运算,针对这个问题,我们可以构建如下的自定义函数:

def add(a,b):
    s = sum([a,b])        return(s)# 求和add(10,13)

       这个问题很简单的利用自定义函数就可以解决了。但要求比较严格的爸爸对小亮的智商提出了挑战,即不单单是两个数之和,还可能是三个数、四个数、五个数的和...那这个时候,是不确定老爸会要求计算几个数的和,这个add函数似乎就不能使用了。好在Python给自定义函数提供了可变参数,目的就是解决这类问题的。举例如下:

def adds(*args):
    s = sum(args)        return(s)# 求和adds(10,13,7,8,2)

       看见了吧,这个可变参数就可以接受任意多个数值,需要注意的是,用一颗星“*”放在参数的前面,就代表了该参数为可变参数。一个可变参数之所以可以接受多个数值,起背后的原理是将这些输入的数值进行了一次捆绑,即组装到元组中。看下面这个打印的例子就能明白了:

def adds(*args):
    print(args)# 打印参数值adds(10,13,7,8,2)

0?wx_fmt=png


4、关键字参数

       虽然可变参数可以接受多个实参,但其背后运行的原理是将这些实参存到到一个元组中,然后将捆绑的元素传递给表达式,这是一个捆绑打包的概念,但无法实现某个实参指定给某个形参。那你会问,我用必选参数就好啦,问题是当你又不确定该给自定义函数设置多少个形参,那必选参数是不是就不能使用了。所以就诞生了关键字参数,我们仍然举例说明这个关键字参数的使用:

       如果用户注册某个平台,手机号及出生日期为必填,其他信息可以选填。那可以根据用户填写的内容来判断其年龄、性别等,这里的选填项就可以使用关键字参数了,因为你不知道用户回填多少项信息:

def info(tel, birthday, **args):
    import re
    user = {}
    user['tel'] = str(tel)        if args.get('id') == None:
       user['birthday']=''.join(re.findall('\d+',str(birthday)))           else:
       user['birthday']=str(args.get('id'))[6:14]
    user['name'] = args.setdefault('name',None)
    user['gender'] = args.setdefault('gender',0)
    user['income'] = args.setdefault('income',5000)
    user['edu'] = args.setdefault('edu','大专')
    print(user)

0?wx_fmt=png

这段代码的含义是,用户注册时必需填写手机号和出生日期,如果除此还填写了身份证号,则以身份证号里面的出生日期为准;如果用户没有填写姓名,则为空(None表示),否则以填写的内容为准;如果用户没有填写性别,则默认为女性(0表示),否则以填写的为准;如果用户没有填写收入状况,则默认为5000,否则以填写的为准;如果用户没有填写学历,则默认为大专,否则以填写内容为准....以此类推,可以填写其他更多的信息,而且还可以将实参与形参一一配对。

       需要注意的是,用两颗星“*”放在参数的前面,就表示该参数为关键字参数。之所以能够将形参与实参对应,是因为传递给函数的实参最终以字典的形式捆绑起来,而字典就是用键值对组成的。同样,我们通过打印的方式来看看字典式的捆绑:

def info(**args):
    print(args)# 打印参数值info(name = 'Sim', age = 28, gender = '男')

       OK,到此,关于Pyhton自定义函数的四种参数就介绍这些,希望对各位看官有帮助。最后需要说明一点的是,如果你的自定义函数写的非常复杂而庞大,可能会同时使用到这四种参数,则四种参数就必须按照这样的顺序排列:必须参数、默认参数、可变参数和关键字参数。

关于本文的文章内容和脚本可以从下面的,便于您的操作和保存:

链接: https://pan.baidu.com/s/1slr0UHB 密码: va3n


每天进步一点点2015

学习与分享,取长补短,关注小号!

640?wx_fmt=jpeg
长按识别二维码 马上关注


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Sim1480

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

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

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

打赏作者

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

抵扣说明:

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

余额充值