1. 程式人生 > >關於Python中*與**的區別與使用

關於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()

        可是這樣並不行,直接報錯了:



        好了,關於*與**的探索就到這裡,如果有什麼好的補充請留言,謝啦~