近期有朋友提问,在学习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()
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)
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)
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)
这段代码的含义是,用户注册时必需填写手机号和出生日期,如果除此还填写了身份证号,则以身份证号里面的出生日期为准;如果用户没有填写姓名,则为空(None表示),否则以填写的内容为准;如果用户没有填写性别,则默认为女性(0表示),否则以填写的为准;如果用户没有填写收入状况,则默认为5000,否则以填写的为准;如果用户没有填写学历,则默认为大专,否则以填写内容为准....以此类推,可以填写其他更多的信息,而且还可以将实参与形参一一配对。
需要注意的是,用两颗星“*”放在参数的前面,就表示该参数为关键字参数。之所以能够将形参与实参对应,是因为传递给函数的实参最终以字典的形式捆绑起来,而字典就是用键值对组成的。同样,我们通过打印的方式来看看字典式的捆绑:
def info(**args):
print(args)# 打印参数值info(name = 'Sim', age = 28, gender = '男')
OK,到此,关于Pyhton自定义函数的四种参数就介绍这些,希望对各位看官有帮助。最后需要说明一点的是,如果你的自定义函数写的非常复杂而庞大,可能会同时使用到这四种参数,则四种参数就必须按照这样的顺序排列:必须参数、默认参数、可变参数和关键字参数。
关于本文的文章内容和脚本可以从下面的,便于您的操作和保存:
链接: https://pan.baidu.com/s/1slr0UHB 密码: va3n
每天进步一点点2015
学习与分享,取长补短,关注小号!
长按识别二维码 马上关注