你知道可变参数、位置参数、lambda函数吗

本文揭示Python函数中可变参数*args和**kwargs的使用技巧,包括可变参数的灵活性、位置参数与关键字参数的区别,以及如何结合lambda函数创建简洁临时函数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

函数的参数以及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

可能例子举得不太好,不太好理解,等哪天有空了,我再改改
如果对你有帮助,不要忘记点赞、关注、评论加收藏哦!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Python和数据分析

钟意作者

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

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

打赏作者

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

抵扣说明:

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

余额充值