一、参数列表中的/与*
如有函数定义
deff(pos1, pos2,/, pos_or_kwd,*, kwd1, kwd2):
pos1
和pos2
只能以位置的形式传参,而不能以关键字的形式传参。pos_or_kwd
可以以位置和关键字的形式传参kwd1
和kwd2
只能以关键字的形式传参
deff(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
。
二、参数列表中的**
参数中的**指传入的是字典,字典前面要加
**
,诸如
deff(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'
错误,但如果非要如此写,则可以这样定义
deff(name,/,**args):
这样第一个参数值不能以关键字传入,即可避免与args中的key冲突。
最后的结果为
deff(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
defconcat(arg1,arg2,arg3,*args, sep="/"):return sep.join(args)print(concat("1","2","c:","workspace","sos","3","4",sep='.'))
版权归原作者 贱贱的剑 所有, 如有侵权,请联系我们删除。