1。前言Python中函数的参数类型比较丰富。例如,我们经常看到*args和**kwargs作为参数。初学者遇到这个有些迷茫。今天我们就来分析总结一下Python中的函数参数。2、Python中的函数参数Python中定义了5种函数参数,下面一一说明。2.1强制参数强制参数是最基本的参数类型。在Python函数中定义强制参数时,每次调用都必须为其赋值,否则会报错。>>>deffun(a):print("a=",a)>>>fun('felord.cn')a=felord.cn>>>fun()Traceback(最近调用last):File"",line1,inTypeError:fun()missing1requiredpositionalargument:'a'2.2默认参数默认参数是具有默认值的参数。>>>deffun(a="felord.cn"):print("a=",a)>>>fun()a=felord.cn>>>fun("Felordcn")a=Felordcn让我们看看考虑一下这种情况:>>>deffun(a=[]):a.append("foo")print("a=",a)>>>fun()a=['foo']>>>fun()a=['foo','foo']>>>fun()a=['foo','foo','foo']什么情况?每次调用参数a时,都会“记住”原来的值。这是因为默认参数a的值在定义Python函数时被初始化为[]。其实a也是一个变量,指向对象[]。调用这个函数改变a的值会改变指针指向的对象的值。当您将a的默认值定义为不可变对象时,不会发生这种情况,您可以尝试我说的。因此,在定义默认参数时要记住一件事:默认参数必须指向不可变对象!2.3可变参数有很多场景我们是不确定参数个数的,也就是说参数是可变的。首先,你可能会想到用列表或者元组(tuple)来封装多个参数,但是你怎么从函数的语义上看出这是一个可变参数呢?所以我们通过前缀标识*声明参数为可变参数,通常记为*args,也可以记为*params。args会将所有参数存储到一个元组中。让我们演示一个求和函数:>>>defcalc(*args):total=0foriinargs:total+=ireturntotal>>>calc(1)1>>>calc(1,2,3,4,5)15>>>calc()02.4关键字参数关键字参数也是一种实现任意多个参数的方式,不同的是可变参数是以元组的形式存储的,而关键字参数就是我们传入参数的参数名称和相应的值存储为dict(字典)。通常记录为**kwargs,以区别于可变参数,其实kw是keyword的缩写。让我们试一试:>>>defmapper(**kwargs):print(kwargs)>>>mapper(){}>>>mapper(name="felord.cn"){'name':'felord.cn'}2.5命名关键字参数对于关键字参数,函数的调用者可以传入任意无限制的关键字参数。至于传入了哪些关键字,我们需要在函数内部进行显式检查才能确定,这种样板代码往往与我们的意图无关。那么Python本身可以限制关键字参数的名称吗?当然有!我们可以使用命名关键字参数来实现这一点。紧跟在*之后的连续非可变参数和非关键字参数被命名为关键字参数。我们也来演示一下:>>>definfo(name,*,age,city):print("name=",name,"age=",age,"city=",city)>>>info("felord.cn")回溯(最近调用最后一次):文件“”,第1行,在TypeError中:info()缺少2个必需的仅关键字参数:'age'和'city'>>>info("felord.cn",city="beijing",age=20)name=felord.cnage=20city=beijing根据上面说不定还能找到其他规则,也可以给named关键字设置关键字parameters默认值,但参数必须带关键字传递>>>definfo(name,*,age=20,city):print("name=",name,"age=",age,"city=",city)>>>info("felord.cn",city="beijing")name=felord.cnage=20city=beijing>>>info("felord.cn","beijing")Traceback(最近的calllast):File"",line1,inTypeError:info()takes1positionalargumentbut2weregiven3.参数的组合这5种参数可以组合使用,参数定义的顺序必须是:强制参数、默认参数、可变参数/命名关键字参数、关键字参数。请特别注意,可变参数不能与命名关键字参数混合使用。任何函数都可以像function(args,*kw)一样调用,不管它的参数是如何定义的。限于篇幅,我就不一一举例了,大家可以自行测试。4.总结Python函数的参数形式非常灵活,既可以实现简单的调用,也可以传入非常复杂的参数。还有很多细节,参数类型也是学习Python函数的一个重点知识点。关注公众号:Felordcn获取更多资讯个人博客:https://felord.cn