*args and **kwargs

首先要知道, 并不是必须写成*args 和**kwargs。 只有变量前面的 *(星号)才是必须的. 你也可以写成*var 和**vars. 而写成*args 和**kwargs只是一个通俗的命名约定。 

*args 的用法

*args 和 **kwargs 主要用于函数定义。 你可以将不定数量的参数传递给一个函数。这里的不定的意思是:预先并不知道, 函数使用者会传递多少个参数给你, 所以在这个场景下使用这两个关键字。 *args 是用来发送一个非键值对的可变数量的参数列表给一个函数.

先看一个例子:

>>> def test_args(f_args,*argv):
...     print("first normal args:",f_args)
...     for arg in argv:
...             print("another arg through *argv",arg)
...
>>> test_args('yasoob','python','eggs','test')
first normal args: yasoob
another arg through *argv python
another arg through *argv eggs
another arg through *argv test
>>>

 

再看一个例子:

>>> def one(*args):
...     print(args)  #1
...
>>> one()
()
>>> one(1,2,3)
(1, 2, 3)
>>> def two(x,y,*args):
...     print(x,y,args)  #2
...
>>> two('a','b','c')
a b ('c',)
>>>

第一个函数one只是简单的将任何(如果有)传递给它的位置参数打印出来。正如你在#1处见到的,在函数内部我们只是引用了args变量——*args只是表明在函数定义中位置参数应该保存在变量args中。Python也允许我们指定一些变量并捕获到任何在args变量里的其它参数,正如#2处所示,args为可迭代对象,可理解为tuple(元组)。

 

谈起tuple,看下python多线程参数用法:

'''
回零独立子线程
'''
def ThreadGoHomeFunction(self,axis):
    try:
        ThreadGoHomeFunction = threading.Thread(target=self.GoHomeFunction,args=(axis,))
        ThreadGoHomeFunction.start()
    except:
        self.ShowErroeMessage("ThreadGoHomeFunction except fail")
        return -1

 

在调用一个函数时带有一个以*为前导的变量作为参数表示这个变量(可迭代对象)内容需要被解析然后用作位置参数。再一次以实例来说明:

>>> def add(x,y):
...     return x+y
...
>>> lst = [1,2]
>>> add(lst[0],lst[1])  #1
3
>>> add(*lst)  #2
3
>>>

#1处的代码抽取出了和#2处相同的参数——在#2处Python为我们自动解析了参数,我们也可以像在#1处一样自己解析出来。*args既表示当调用函数是从一个iterable抽取位置参数,也表示当定义一个函数是接受任何额外的位置变量。

 

**kwargs 的用法

**kwargs 允许你将不定长度的键值对, 作为参数传递给一个函数。 如果你想要在一个函数里处理带名字的参数, 你应该使用**kwargs与*表示iterables和位置参数一样,**表示dictionaries & key/value对

>>> def greet_me(**kwargs):
...     for key,value in kwargs.items():
...             print("{0} == {1}".format(key,value))
...
>>> greet_me(name="YangARTuan")
name == YangARTuan
>>>
>>> def foo(**kwargs):
...     print(kwargs)
...
>>> foo()
{}
>>> foo(x=1,y=2)
{'x': 1, 'y': 2}
>>>

 

当我们定义一个函数时我们可以用**kwargs表明所有未捕获的keyword变量应该被存储在一个名为kwargs的字典中。

>>> dct = {'x': 1, 'y': 2}
>>> def bar(x, y):
...     rturn x + y
>>> bar(**dct)
3

 

使用 *args 和 **kwargs 来调用函数

def test_args_kwargs(arg1, arg2, arg3):
    print("arg1:", arg1)
    print("arg2:", arg2)
    print("arg3:", arg3)

# 首先使用 *args
>>> args = ("two", 3, 5)
>>> test_args_kwargs(*args)
arg1: two
arg2: 3
arg3: 5

# 现在使用 **kwargs:
>>> kwargs = {"arg3": 3, "arg2": "two", "arg1": 5}
>>> test_args_kwargs(**kwargs)
arg1: 5
arg2: two
arg3: 3

 

标准参数与*args、**kwargs在使用时的顺序

那么如果你想在函数里同时使用所有这三种参数, 顺序是这样的:

some_func(fargs, *args, **kwargs)

 

转载于:https://www.cnblogs.com/YangARTuan/p/10571725.html

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值