1. 程式人生 > >python *args 和**kwargs的用法

python *args 和**kwargs的用法

當函式的引數不確定時,可以使用*args 和**kwargs,*args 沒有key值,**kwargs有key值。

關於args:

#!-*-coding:utf-8-*-
#__author__ = 'ecaoyng'

def func_args(farg, *args):
    print("The first arg is %s" % farg)
    print(type(args))
    for arg in args:
        print('Other arg is %s' % arg)

func_args('hello','dear', 'python'
) 輸出: The first arg is hello <class 'tuple'> Other arg is dear Other arg is python

當然,也可以將

parameters = ['hello','dear', 'python']
func_args(*parameters)
結果也是一樣的

kwargs的用法

#!-*-coding:utf-8-*-
#__author__ = 'ecaoyng'

def fun_var_kwargs(farg, **kwargs):
    print ("arg:", farg)
    for
key in kwargs: print("another keyword arg: %s: %s" % (key, kwargs[key])) # fun_var_kwargs(farg=1, myarg2="two", myarg3=3) kargs={'a': 1, 'b': 2, 'c': 3, 'd' : 4} fun_var_kwargs(kargs) print('='*40) fun_var_kwargs('First',**kargs)

輸出結果:

arg: {'a': 1, 'd': 4, 'b': 2, 'c': 3}
========================================
arg: First another keyword arg: a: 1 another keyword arg: d: 4 another keyword arg: b: 2 another keyword arg: c: 3

現在更進一步討論Python的星號(、*)的作用
當函式的引數前面有一個星號的時候表示這是一個可變的位置引數,兩個星號*表示是可變的關鍵字引數。


def foo(*args, **kwarg):
    for item in args:
        print('In args:')
        print(item)

    for k,v in kwarg.items():
        print('In kwarg')
        print (k,v)
    print(30*'=')

foo(1, 2, 3, a=4, b=5)
# outputs:
# 1 in args.
# 2 in args.
# 3 in args.
# (a,4) in kwarg.
# (b,5) in kwarg.
foo(2, 3, a=4, b=5, c=1)
# outputs:
# 2 in args.
# 3 in args.
# (a,4) in kwarg.
# (b,5) in kwarg.
# (c,1) in kwarg.
#如上,我們可以傳入任意多個引數
v = (1, 2, 4)
v2 = [11, 15, 23]
d = {'a': 1, 'b': 12}
foo(v, d)
# In args:
# (1, 2, 4)
# In args:
# {'a': 1, 'b': 12}
foo(*v, **d)
# In args:
# 1
# In args:
# 2
# In args:
# 4
# In kwarg
# b 12
# In kwarg
# a 1
foo(v2, d)
# In args:
# [11, 15, 23]
# In args:
# {'b': 12, 'a': 1}
foo(*v2, **d)
# In args:
# 11
# In args:
# 15
# In args:
# 23
# In kwarg
# a 1
# In kwarg
# b 12

注意
上面的示例中如果v、v2、d沒有加星號那麼就當成了一個引數傳遞給了函式,如果加了星號那麼就會解包後傳遞給函式。
可變位置引數*args是一個元組,是不可修改的。
對於字典型別的如果只使用一個型號*那麼傳入的只是字典的鍵。