在学习python的过程中,第一次接触函数的参数可能会有点懵,因为python所支持的函数参数种类很多也很强大,参数之间的名称也容易引起混淆。这就造成了初次接触时,难免记不住或者混淆这几个概念。为了加强记忆,特自己整理总结一下。
函数的参数分为必选参数、默认参数、可变参数、关键字参数和命名关键字参数这几种。
必选参数就是最常见的参数,定义一个变量名用来接收,如
def sum(a,b):
sum = a + b
return sum
这里的变量a,b便是必选参数了。
默认参数,就是当调用函数时,如果该参数未传值,那么就使用定义参数时的默认值,如
def sum(a,b,c=0):
sum = a + b + c
return sum
这里的变量c就是个默认参数,其默认值为0,当调用sum函数时,如果没有传c这个参数,只给了两个参数,那么c就视为0。注意,如果一个函数有必选参数和默认参数,那么必选参数一定在默认参数之前。思考一下就知道其中缘由了,因为如果把默认参数放在必选参数前面,那么调用函数的时候,python如何对应赋值呢,一定是必选参数在前,这样如果只传了必选参数,那么后面的默认参数就使用默认值。
这时候如果有个需求,这个sum求和函数不固定传几个参数,只要求把所有的传参都加起来,那么无论定义几个参数,都是不合适的。为了达到其通用性,就需要用到可变参数,如
def sum(*a):
for x in a:
sum += x
return sum
通过在参数前加上一个*星号,就标识了这个参数为可变参数,这时候a就变成了一个tuple元组,调用时可以传入一个list或者tuple。如果一个函数有必选参数、默认参数和可变参数,那么一定是必选参数在前,默认参数在中,可变参数在后。这里的原因也很简单,如果可变参数在前面,那么还有必要定义必选参数和默认参数吗。
在编程的过程中,有时候需要传入一个dict字典,根据字典的key来取相应的value去做一些操作,这时候就需要用到关键字参数,如
def info(**dict):
print('学生的名字:%s,学号:%s'%(dict['name'],dict['no'] ))
在参数前加**两个星号,就代表了这个参数是一个关键字参数。如果一个函数有必选参数、默认参数、可变参数和关键字参数,那么前面的顺序不变,关键字参数在最后。其实可变参数和关键字参数的前后顺序无所谓,至于为什么python这样安排,我们后面再讲。
有时候,我们需要限制关键字参数中的key,相当于哪些是必须传的,这时候可能就需要在函数体内去判断这个key是否存在。为了简化操作,python提供了命名关键字参数,如
def info(*,name,no):
print('学生的名字是%s,学号是%s'%(name,no))
通过在参数前加上*,(星号加逗号),就标志了后面的参数都是命名关键字参数。调用时,需要使用key=value这样的形式传参。如果前面已经有了一个可变参数,那么*,就可以省略。如果函数中有必选参数、默认参数、可变参数、关键字参数和命名关键字参数,那么前面顺序不变,明明关键字参数要在关键字参数之前,这个和必选参数、可变参数顺序的理由一致。这时候我们就知道为什么python要安排可变参数在关键字参数之前了,因为如果只有有可变参数和命名关键字参数,而没有关键字参数的话,就可以使用简化语法,不需要在命名关键字参数前加上*,了。
至此函数的参数类型讲解完毕,可以看到python是一种很强大的语言,为了简化代码,在写的时候提供了很多方便的功能。