关于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()

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



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





猜你喜欢

转载自blog.csdn.net/u013745804/article/details/79610129
今日推荐