当前位置: 首页 > 后端技术 > Python

位置参数,关键字参数,-,--

时间:2023-03-26 16:02:49 Python

位置参数,关键字参数,*python中函数的参数主要包括位置参数和关键字参数,使用和*参数可以实现不定数量的位置,变量关键字参数的个数,以及传入的强制关键字参数。位置参数在调用函数时,根据函数定义的参数位置传递参数。deffunc(a,b):print('a:%s,b:%s'%(a,b))>>>func(1,2)#参数1为第一个参数,传给a;Parameter2为第二个参数,传递给ba:1,b:2>>>func(2,1)a:2,b:1关键字参数用于函数调用,通过“key-value”形式来被指定。它可以使函数更清晰易用,同时也去掉了参数的顺序要求。在编程中,推荐使用关键字参数来传递参数。deffunc(a,b):print('a:%s,b:%s'%(a,b))>>>func(a=1,b=2)a:1,b:2>>>func(b=2,a=1)#key匹配参数而不是位置a:1,b:2不定数量的位置参数用*包裹0个或多个位置参数,多个位置参数打包传递一个元组到函数deffunc1(*t):print(t)foriint:print(i)>>>func1(1)(1,)1>>>func1()()>>>func1(1,2,3)(1,2,3)123另一种情况是函数有固定参数,传参时用*封装:deffunc(a,b):print('a:%s,b:%s'%(a,b))>>>params=(10,20)>>>func(*params)#会自动匹配第一个参数10和a;第二个Parameter20匹配b;a:10,b:20可变数量的关键字参数用**包裹,包裹0个或多个关键字参数,多个关键字参数打包为字典传入函数deffunc2(**a):print(a)对于a.items()中的k,v:print(k,v)>>>func2(m=1,n=2){'m':1,'n':2}m1n2>>>func2(a=1,b=2,c=3){'a':1,'b':2,'c':3}a1b2c3>>>func2(){}在另一种情况下,a字典也被打包传入,进入函数后会自动根据字典的k和v进行解析:deffunc(a,b):print('a:%s,b:%s'%(a,b))func(**{'a':1,'b':2})#相当于a=1,b=1传入。a:1,b:2建议在实际项目开发中使用强制关键字参数,不建议使用**封装作为可变参数的输入,这样会使代码不清晰;但是上面的情况使用2可以简化多参数函数的代码。强制关键字参数后跟*位置参数,只能跟关键字参数deffunc(a,*b,c):print(a,b,c)>>>func(1,2,3,4,c=10)1(2,3,4)10>>>func(1,2,3,4)#后面的c必须是关键字参数traceback(最近调用last):File"",line1,inTypeError:func()missing1requiredkeyword-onlyargument:'c'其实很好理解,前面有不定数量的位置参数,如果最后一个没有明确指定关键字,如何识别是不是前面传入的不定数量的参数?比如栗子中的4是b还是c会造成歧义,所以*后面的参数必须跟关键字参数。还有一种形式:deffunc1(a,*,c):print(a,c)>>>func1(10,c=20)1020>>>func1(10,20)Traceback(最近调用最后):File"",line1,inTypeError:func1()takes1positionalargumentbut2weregiven*中间没有作为参数使用,只是规定后面的c必须指定通过关键字参数。这种用法在scikit-learn的源代码中被广泛使用。这种用法的目的是让开发者在模块内部开发时可以使用关键字传参。还有一点:位置参数必须在关键字参数之前,即**args必须在最后。deffunc2(a,**b,c):print(a,b,c)>>>func2(1,{'t':1},c=3)文件“”,第1行deffunc2(a,**b,c):^SyntaxError:语法无效>>>func2(1,b=2,m=3)12{'m':3}>>>func2(1,b=2,m=3,k=4)12{'m':3,'k':4}总结:在开发过程中,参数的顺序一般是位置参数和关键字参数;最好使用关键字参数,可以用*来限定。