函数的参数以及lambda函数
不知道你在用一个别人写好的函数的时候发现没有,有些函数只有一个参数,有些函数不指定你输入几个参数,而有的函数的参数必须要写成“参数名” = “参数值”的样子,还有些时候,一个函数中一些变量需要传入的是“参数名” = “参数值”的形式,而另一些参数又不需要这样写,而且如果把参数的位置写错了,还不能正常使用函数。难道说,这一个参数而已,里面还有什么道道不成?这里面不仅有道道,这里面的道道还大了。下面我们来看看它到底有什么道道!
可变参数
这就是上面讲到的一个函数里面可以传入零个或者多个参数的情况,这种函数,定义好之后可以按照调用者的需求来决定传入参数的个数,可以传入零个也可以传入一个或多个,这样的函数叫可变参数
函数。这样定义这个函数,参数的位置放上*args即可,例如:
def sum(*args):
total = 0
for arg in args: # 实现对传入的多个值求和,实际上这里传进来的args是一个元组,可以在此处用print(type(args))看
total += arg
return total
print(sum(1)) # 0
print(sum(1)) # 1
print(sum(1, 2)) # 3
print(sum(1, 2, 3)) # 6
这样做后,我们就实现了可以传入任意个参数函数,这个写法用在当我们写一个函数时不知道用户会传入多少个参数时,所以用可变参数来参与定义。
不知道你们知不知道,在没有用这个可变参数之前,函数的参数我们可以按位置传入,也可以不按位置传入,只需保证先传入不带参数名的参数值,再传入带参数名的参数值的条件下,可以任意交换为位置传入。就像以下这样:
def sum(a = 0, b = 0, c = 0): # 可以给参数一个默认值,如果传入这个参数的值就用传入的值,没有传入就用默认值
return a + b + c
print(sum(1,2,3))
print(sum(a = 1,b = 5)) # 可以不传入某一个参数
print(sum(c = 1,a = 2, b = 3))
print(sum(1,2, c = 3))
print(sum(1,c = 2, b = 3)) # 以上结果都为6
但是用可变参数后,以上形式除了第一个其它的都报错了。
位置参数和命名关键字参数
所以,用可变参数*args时(没有要求在星号后一定叫args,只是大家都是这么定义),要牢记,不能再使用"参数名“ = "参数值"的格式。但是并不是说换一种方法不能实现这样的需求。下面第三个要点—命名关键字下的可变参数 会讲到如何实现。接下来,我们先看看什么叫位置参数和关键字参数
位置参数和关键字参数
这两个名词其实很简单,实际上,前面那种直接传入函数参数的参数就叫做位置参数,而用"参数名“ = "参数值"传入的参数形式叫关键字参数,有些时候,我们想要强制要求用户调用函数时对某些参数使用"参数名“ = "参数值"的形式传入,这个时候,我们可以在这个参数之前再加上一个*,这样就可以限制星号后面的参数必须使用关键字参数传入了,这时候星号后面的参数叫做命名关键字参数。例如,上面的代码,在第二个参数位置加上了星号后
def sum(a=0, *,b=0, c=0):
return a + b + c
print(sum(1,2,3)) # 报错,第二、三个参数需要改成b = 2, c = 3
print(sum(a = 1,b = 2,)) # 正常运行
print(sum(c = 1,a = 2, b = 3)) # 正常执行
print(sum(1,2, c = 3)) # 第二个没有用关键字参数,报错
print(sum(1,c = 2, b = 3)) # *号在第1个参数后面,只限制第2、3个参数
下面,我们就来看看,怎样解决上面使用可变参数后遇到的问题
命名关键字下的可变参数
要能在可变参数的条件下还能使用关键字参数,也就是说,要同时使用可变参数、位置参数、关键字参数,那么,这样写
def foo(*args, **kwargs):
pass
return
例如:
def sum(*args, **kwargs):
total = 0
for arg in args: # 对传入的位置参数值求和
total += arg
for kwarg in kwargs.values(): # 对传入的关键字参数值求和,这里传入的kwargs实际上是一个字典
total += kwarg
return total
print(sum(1,2,3)) # 6
print(sum(1, a = 2, c = 3 , d = 4)) # 10
print(sum(a = 1, b = 2 , c = 3)) # 6
print(sum(1,3,c = 1)) # 5
注意这里如果再写一句print(sum(a = 1, 3, 1)) 的话,程序就要报错了,因为和前面讲的例子一样,传参数时要保证直接传的参数值在"参数名“ = "参数值"的前面,也就是说,要保证位置参数要在关键字参数前面传入。
匿名函数(lambda函数)
当一个函数很简单时,本来只需要实现一个小小的功能,并且只需要临时用一下而已,再使用def关键字去定义感觉太过麻烦也感觉没有必要,这时候可以使用一种叫作lambda函数的函数去实现即可,它也叫匿名函数,也就是说可以不给它命名函数名,就可以定义后直接使用。
格式:
lambda 参数名 : 返回值
例如:
# 一行代码定义判断素数的函数
is_prime = lambda x: x > 1 and all(map(lambda f: x % f, range(2, int(x ** 0.5) + 1)))
# 调用Lambda函数
print(is_prime(9)) # False
可能例子举得不太好,不太好理解,等哪天有空了,我再改改
如果对你有帮助,不要忘记点赞、关注、评论加收藏哦!