首先要知道, 并不是必须写成*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)

*args and **kwargs的更多相关文章

  1. How to use *args and **kwargs in Python

    Or, How to use variable length argument lists in Python. The special syntax, *args and **kwargs in f ...

  2. python中应用*args 与**kwargs

    这是Python函数可变参数 args及kwargs------->目的是:当函数的参数不确定时,可以使用*args 和**kwargs,*args 没有key值,**kwargs有key值. ...

  3. Python之路 day3 函数定义 *args及**kwargs

    #!/usr/bin/env python # -*- coding:utf-8 -*- #Author:ersa import time # def logger(): # time_format ...

  4. [翻译]PYTHON中如何使用*ARGS和**KWARGS

    [翻译]Python中如何使用*args和**kwargs 函数定义 函数调用 不知道有没有人翻译了,看到了,很短,顺手一翻 原文地址 入口 或者可以叫做,在Python中如何使用可变长参数列表 函数 ...

  5. python 中*args 和 **kwargs

    简单的可以理解为python 中给函数传递的可变参数,args 是 列表的形式.kwargs 是 key,value的形式,也就是python 中的字典. *args 必须出现在**kwargs 的前 ...

  6. python 的 *args 和 **kwargs

    Python支持可变参数,通过*args和**kwargs来指定,示例如下: def test_kwargs(first, *args, **kwargs):    print 'Required a ...

  7. 理解 Python 中的 *args 和 **kwargs

    Python是支持可变参数的,最简单的方法莫过于使用默认参数,例如: def test_defargs(one, two = 2): print 'Required argument: ', one ...

  8. Python中*args 和**kwargs的用法

    当函数的参数不确定时,可以使用*args 和**kwargs,*args 没有key值,**kwargs有key值.还是直接来代码吧,废话少说[python] def fun_var_args(far ...

  9. Python中的*args和**kwargs

    原文地址:http://www.linuxidc.com/Linux/2011-10/45083.htm 先来看个例子: ,2,3,4) foo(a=1,b=2,c=3) foo(1,2,3,4, a ...

  10. python 基础——*args和**kwargs

    *args表示任何多个无名参数,它是一个tuple:**kwargs表示关键字参数,它是一个dict. def func(one, *args, **kwargs): print type(one) ...

随机推荐

  1. android模拟按键问题总结[使用IWindowManager.injectKeyEvent方法](转)

    http://blog.csdn.net/xudongdong99/article/details/8857173 Android上面TreeView效果 http://blog.csdn.net/g ...

  2. 关于int转char类型引发的一些思考

    signed char unsigned char

  3. WebApi参数传递总结(转)

    出处:http://www.cnblogs.com/Juvy/p/3903974.html 在WebAPI中,请求主体(HttpContent)只能被读取一次,不被缓存,只能向前读取的流. 举例子说明 ...

  4. ffmpeg只编译h264

    ./configure --arch=arm --cross-prefix=arm-none-linux-gnueabi- --extra-ldflags=-static --target-os=li ...

  5. shell 用环境变量的值修改properties文件

    假设有如下属性文件 demo.properties user.name=test user.password=123456 ............................... 需求:先需要 ...

  6. “undefined JNI_GetCreatedJavaVM”和“File format not recognized”错误原因分析

    如果编译时,报如下所示错误:../../third-party/hadoop/lib/libhdfs.a(jni_helper.c.o): In function `getGlobalJNIEnv': ...

  7. linux每天一小步---grep命令详解

    1 命令功能 grep(global regular expression print全面搜索正则表达式并把行打印出来)是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹配的行打印出来. g ...

  8. http://blog.csdn.net/hongchangfirst/article/details/26004335

    悲观锁(Pessimistic Lock), 顾名思义,就是很悲观,每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,这样别人想拿这个数据就会block直到它拿到锁.传统的 关系型数 ...

  9. visual studio 2013 git 记住密码

    原有配置: C:\Users\Administrator 下.gitconfig内容为 [user] name = lijf4 email = lijf4@lenovo.com 删除,修改为 [cre ...

  10. postgresql的日志实现机制

    1.事务的概念   事务是从实际生活中引入数据库的一个概念,即事务内的操作,要么全做,要么全不做.就像银行转账一样,当从一个帐户转出一部分钱之后,就必须在另一个帐户中存入相同数目的钱,若是转出钱之后, ...