zoukankan      html  css  js  c++  java
  • *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)

     

  • 相关阅读:
    vs2013如何在C++中调用Lua(二)
    用vs2013编译lua源码方法(一)
    使用Sublime Text 直接运行Quick-cocos2d-x 项目
    SubmitText 中配置lua 运行环境
    在VS2012/2013上编辑和调试Quick-cocos2d-x的Lua代码
    Cocos2d-x 开发 v3.2 建立新项目并添加库文件
    计算一段函数的执行效率
    C++中嵌入Lua脚本环境搭建
    Android开发环境配置
    cocos2d-x-3.1.1 创建项目
  • 原文地址:https://www.cnblogs.com/YangARTuan/p/10571725.html
Copyright © 2011-2022 走看看