关于Python中*与**的区别与使用

(*)与(**)的区别

        一个星(*)表示将参数作为元组来处理;两个星(**)表示将参数作为字典来处理。

实例

a)在函数参数列表中使用

        在函数参数列表中使用*或者**表示将调用时传入的参数组合成一个元组或是字典,然后在函数中使用。
        当作元组:

def func(*l):
    for index, item in enumerate(l):
        print "{}:{}".format(index, item)
def main():
    func("apple", "banana",)
if __name__ == "__main__":
    main()

        运行结果:




        作为字典:

def func(**d):
    for key, value in d.items():
        print "{}:{}".format(key, value)
def main():
    func(a="apple", b="banana")
if __name__ == "__main__":
    main()



b)调用函数时作为参数传入

        调用函数时使用*或者**表示将元组或者是字典解析出来。如果是元组的话,则将元组拆成n个参数,分别按照对应位置传给函数的n个参数;如果是字典的话,相当于在字典中查找与函数参数列表同名的key,将其值赋给对应参数,位置关系并不需要对应,只需要字典中的key与函数形参名一致就行,如果不一致,将报错。
        当作元组:

def func(a, b):
    print a
    print b
def main():
    l = ("apple", "banana")
    func(*l)
if __name__ == "__main__":
    main()

        运行结果:




        作为字典:

def func(arg1, arg2):
    print arg1
    print arg2
def main():
    d = {"arg1":"apple", "arg2":"banana"}
    func(**d)
if __name__ == "__main__":
    main()

        运行结果:



联想

        相信大家看完了上面的内容之后会想到我们的一般化的函数参数列表:

def func_a(*args):
    ...
def func_b(**kwargs):
    ...

        没错,这就是我们常说的可变参数。*args可以表示任意个无名参数(即位置参数),是一个元组,而**kwargs表示关键字参数,是一个字典。如果我们同时使用*args和**kwargs,那么*args必须要在**kwargs前面,否则将会提示语法错误“SyntaxError: non-keyword arg after keyword arg”。
        比如:

def func(*args,**kwargs):
    for index, item in enumerate(args):
        print "{}.{}".format(index, item)
    for key, value in kwargs.items():
        print "{}:{}".format(key, value)
def main():
    func("hi", "oh", a="apple", b="banana")
if __name__ == "__main__":
    main()

        输出为:




        错误示范:

def func(*args,**kwargs):
    for index, item in enumerate(args):
        print "{}.{}".format(index, item)
    for key, value in kwargs.items():
        print "{}:{}".format(key, value)
def main():
    func(a="apple", b="banana", "hi", "oh")
if __name__ == "__main__":
    main()

        报错:




        不过这时候有人会说了,函数定义里面是*args在**kwargs前面,下面传入的时候又是先传入命名参数,当然要错,如果我们在函数定义时就将**kwargs写在*args前面呢?

def func(**kwargs, *args):
    for index, item in enumerate(args):
        print "{}.{}".format(index, item)
    for key, value in kwargs.items():
        print "{}:{}".format(key, value)
def main():
    func(a="apple", b="banana", "hi", "oh")
if __name__ == "__main__":
    main()

        可是这样并不行,直接报错了:



        好了,关于*与**的探索就到这里,如果有什么好的补充请留言,谢啦~





  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值