查看原文
其他

Python自定义函数的参数解读

2017-09-23 刘顺祥 每天进步一点点2015

近期有朋友提问,在学习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 = 0
i = 1
while(i<=N):    s += 3 + 5*i    i += 1
print(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

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


长按识别二维码 马上关注


您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存