Python的参数列表

一、参数列表中的/与*

如有函数定义

def f(pos1, pos2, /, pos_or_kwd, *, kwd1, kwd2):
  • pos1pos2只能以位置的形式传参,而不能以关键字的形式传参。
  • pos_or_kwd可以以位置和关键字的形式传参
  • kwd1kwd2只能以关键字的形式传参
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)
  1. 第一个f语句会显示f() got some positional-only arguments passed as keyword arguments: 'pos1, pos2'错误,表示pos1pos2只能以位置传入
  2. 第二个f语句会显示f() takes 3 positional arguments but 5 were given错误,说明位置参数只有3个(pos1,pos2和pos_or_kwd)确传入了5个。
  3. 第三个和第四个是正确的,最后的结果都为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='.'))
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

贱贱的剑

你的鼓励将是我创作的最大动力

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

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

打赏作者

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

抵扣说明:

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

余额充值