赞
踩
如有函数定义
def f(pos1, pos2, /, pos_or_kwd, *, kwd1, kwd2):
pos1
和pos2
只能以位置的形式传参,而不能以关键字的形式传参。pos_or_kwd
可以以位置和关键字的形式传参kwd1
和kwd2
只能以关键字的形式传参def f(pos1, pos2, /, pos_or_kwd, *, kwd1, kwd2):
print(pos1,pos2,pos_or_kwd,kwd1,kwd2)
f(pos1=2,pos2=3,pos_or_kwd=4,kwd1=5,kwd2=6)
f(2,3,4,5,6)
f(1,2,pos_or_kwd=3,kwd1=4,kwd2=5)
f(1,2,3,kwd1=4,kwd2=5)
f
语句会显示f() got some positional-only arguments passed as keyword arguments: 'pos1, pos2'
错误,表示pos1
和pos2
只能以位置传入f
语句会显示f() takes 3 positional arguments but 5 were given
错误,说明位置参数只有3个(pos1,pos2和pos_or_kwd
)确传入了5个。1 2 3 4 5
。参数中的**指传入的是字典,字典前面要加**
,诸如
def f(name,**args):
print([ {k,v} for k,v in args.items()])
f('n',**{'1':"name",'2':'age'})
上式输出[{'name', '1'}, {'age', '2'}]
存在的问题
args
中不能有name
的key,即args中的key不能存在f函数的形参。即不能传入
f('n',**{'name':"1",'age':'2'})
上式会报f() got multiple values for argument 'name'
错误,但如果非要如此写,则可以这样定义
def f(name,/,**args):
这样第一个参数值不能以关键字传入,即可避免与args中的key冲突。
最后的结果为
def f(name,/,**args):
print([ {k,v} for k,v in args.items()])
f('n',**{'name':"1",'age':'2'})
输出[{'1', 'name'}, {'age', '2'}]
函数中的剩余的若干参数会被当成一个列表处理,在它之前可以有0个或多个普通变量,而在它之后的变量只能以关键字的形式传入。
下面的代码将最后一行中的"1",“2”,"c:"分别传给了arg1,arg2和arg3,然后才传给了args。最后的结果为workspace.sos.3.4
def concat(arg1,arg2,arg3,*args, sep="/"):
return sep.join(args)
print(concat("1","2","c:","workspace","sos","3","4",sep='.'))
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。