在Python中,可变参数的传递使用*args**kwargs来实现,其中:

  • *args表示任意个位置参数(positional argument),被表示为一个只读的数组(tuple);
  • **kwargs表示任意个关键字参数(keyword argument),被表示为一个字典(dict)。

例如:

>>> def foo(*args, **kwargs):
... print("*args:\t\t", args)
... print("**kwargs:\t", kwargs)
...
>>>
>>> foo()
*args: ()
**kwargs: {}
>>> foo(1)
*args: (1,)
**kwargs: {}
>>> foo(1, 2)
*args: (1, 2)
**kwargs: {}
>>>
>>> foo(a=1, b=2)
*args: ()
**kwargs: {'a': 1, 'b': 2}
>>>
>>> foo(1, 2, a=1, b=2, c=3)
*args: (1, 2)
**kwargs: {'a': 1, 'b': 2, 'c': 3}
>>>
>>> foo(1, 2, [3, 4, 5], a=1, b=2, c={'A':1, 'B':2, 'C':3})
*args: (1, 2, [3, 4, 5])
**kwargs: {'a': 1, 'b': 2, 'c': {'A': 1, 'B': 2, 'C': 3}}
>>>
>>> foo(1, a=1, 2, b=2, 3, c=3)
File "<stdin>", line 1
SyntaxError: positional argument follows keyword argument
>>>

注意: 位置参数(*args)必须在关键字参数(**kwargs)的前面。

另外,*args和**kwargs都是可以无限次地向下传递的(这一点类似Bash里的"$@"),例如:

  • foo_args.py
 #!/usr/bin/python

 from __future__ import print_function
import sys def l2_foo(*args):
print(">>L2:\t\t*args =", args, "\n") def l1_foo(head, *args):
print(" >L1: head =", head, "\t*args =", args)
l2_foo(*args) def main(argc, argv):
l1_foo(1)
l1_foo(1, 2)
l1_foo(1, 2, 3) return 0 if __name__ == '__main__':
argv = sys.argv
argc = len(argv)
sys.exit(main(argc, argv))

注意L6, L9 和 L11:

 6  def l2_foo(*args):
..
9 def l1_foo(head, *args):
..
11 l2_foo(*args)
  • 运行foo_args.py
$ ./foo_args.py
>L1: head = 1 *args = ()
>>L2: *args = () >L1: head = 1 *args = (2,)
>>L2: *args = (2,) >L1: head = 1 *args = (2, 3)
>>L2: *args = (2, 3)

最后,给出一个使用*args的更有工程意义的例子:

  • foo.py
 #!/usr/bin/python
from __future__ import print_function
import sys class Foo(object):
def __init__(self, name, oid):
self.name = name
self.oid = oid def get_name(self):
return self.name def set_name(self, name):
self.name = name def get_info(self):
return "name = %s, oid = %d" % (self.name, self.oid) def set_info(self, name, oid):
self.name = name
self.oid = oid class Bar(object):
def __init__(self, name, oid):
self.foo = Foo(name, oid) def __op_foo(self, method, *args):
func = getattr(self.foo, method)
try:
prop = func(*args)
return prop
except Exception as e:
print(e) def foo_set_name(self, name):
return self.__op_foo('set_name', name) def foo_get_name(self):
return self.__op_foo('get_name') def foo_set_info(self, name, oid):
return self.__op_foo('set_info', name, oid) def foo_get_info(self):
return self.__op_foo('get_info') def get_oid(self):
return self.foo.oid # XXX: Ugly but simple for demo def foo_arg0():
b = Bar('Jack', 12345)
s = b.foo_get_name()
print("foo_arg0: name = %s, oid = %d" % (s, b.get_oid())) def foo_arg1():
b = Bar('Jack', 12345)
o = b.foo_set_name('Lynn')
print("foo_arg1: return", o)
s = b.foo_get_name()
print("foo_arg1: name = %s, oid = %d" % (s, b.get_oid())) def foo_arg2():
b = Bar('Jack', 12345)
o = b.foo_set_info('Mary', 54321)
print("foo_arg2: return", o)
s = b.foo_get_info()
print("foo_arg2: %s" % s) def main(argc, argv):
if argc != 2:
sys.stderr.write("Usage: %s <func ID>\n" % argv[0])
return 1 func_id = int(argv[1])
exec('foo_arg%d()' % func_id) return 0 if __name__ == '__main__':
argv = sys.argv
argc = len(argv)
sys.exit(main(argc, argv))
  • 运行foo.py
$ ./foo.py
foo_arg0: name = Jack, oid =
$ ./foo.py
foo_arg1: return None
foo_arg1: name = Lynn, oid =
$ ./foo.py
foo_arg2: return None
foo_arg2: name = Mary, oid =

小结:在函数的参数列表中,零个*表示普通的位置参数, 一个*表示元组(tuple), 两个*表示字典(dict)。

 '*' * 0:   arg : regular arg
'*' * 1: *args: tuple (i.e. readonly list)
'*' * 2: **args: dict

[Python学习笔记-004] 可变参数*args和**kwargs的更多相关文章

  1. Python函数可变参数*args及**kwargs详解

    初学Python的同学们看到代码中类似func(*args, **kwargs)这样的函数参数定义时,经常感到一头雾水. 下面通过一个简单的例子来详细解释下Python函数可变参数*args及**kw ...

  2. Python可变参数*args和**kwargs

    本文我们将通过示例了解 Python函数的可变参数*args和 **kwargs的用法. 知识预备:Python 函数和 Python 函数参数 在Python编程中,我们定义一个函数来生成执行类似操 ...

  3. 理解 Python 中的可变参数 *args 和 **kwargs:

    默认参数:  Python是支持可变参数的,最简单的方法莫过于使用默认参数,例如: def getSum(x,y=5): print "x:", x print "y:& ...

  4. python函数可变参数*args和**kwargs区别

    #*args(元组列表)和**kwargs(字典)的区别 def tuple_test(*args): for i in args: print 'hello'+i s=('xuexi','mili' ...

  5. python学习笔记:函数参数

    1. 位置参数:一般的参数 2. 默认参数: def power(x, n=2): s = 1 while n > 0: n = n - 1 s = s * x return s 参数里有默认赋 ...

  6. Python学习笔记之默认参数

    函数定义时 参数定义的顺序必须是:必选参数.默认参数.可变参数和关键字参数. def test(a,b,c=1,*d,**e) pass

  7. 跟着太白老师学python 10day 函数的动态参数 *args, **kwargs, 形参的位置顺序

    1. *args 接收实参的位置参数, **kwargs接收实参的关键字参数 def func(*args, **kwargs): print(args, kwargs) func(1, 2, 3, ...

  8. python学习笔记-os模块参数

    python的os 模块提供了非常丰富的方法用来处理文件和目录.常用的方法如下表所示: os.access(path, mode) 检验权限模式 os.chdir(path) 改变当前工作目录 os. ...

  9. Python学习笔记004

    变量 变量的命名规则1. 要具有描述性2. 变量名只能_,数字,字母组成,不可以是空格或特殊字符(#?<.,¥$*!~)3. 不能以中文为变量名4. 不能以数字开头,下划线或者小写字母开头,驼峰 ...

随机推荐

  1. Android记录10--android.os.NetworkOnMainThreadException异常解决办法

    2013年11月1日小光棍节 有一段时间没有发表新的博客了,最近一直在忙着开发新浪微博客户端遇到很多问题比较头痛,比如说本篇博客要讲的NetworkOnMainThreadException这个异常, ...

  2. unigui 设置单元格颜色

    procedure TF_Resource2.UniDBGrid1DrawColumnCell(Sender: TObject; ACol,  ARow: Integer; Column: TUniD ...

  3. hdu 1.2.3

    很简单的算法基础题...闰年判断以及计算 #include<iostream> #include<cstdio> using namespace std; int main() ...

  4. linux中yum命令的解析

    yum(全称为 Yellow dog Updater, Modified)是一个在Fedora和RedHat以及SUSE中的Shell前端软件包管理器.基於RPM包管理,能够从指定的服务器自动下载RP ...

  5. caffe 训练imagenet

    1.整理得到自己的数据库,并生成自己数据库的列表文件.txt 2.将数据库转成lmbp格式 3.计算图像均值 4.修改网络参数 5.得到结果 1.整理得到自己的数据库 因为前面博文提到的原因,技术水平 ...

  6. .net图表之ECharts随笔01-最简单的使用步骤

    找了几种绘制图表的办法,后面选定了ECharts.下载链接如下,好像不同的ECharts有不同的用法,要下对. https://gitee.com/Tuky/SomeWebFrame/tree/mas ...

  7. 最值得拥有的免费Bootstrap后台管理模板

    在PHP开发项目中,后台管理因为面向群体相对比较固定,大部分以实现业务逻辑和功能.使用Bootstrap后台模板可以让后端开发很轻松的就展现给客户一个响应式的后台,节约前端开发的时间.下面PHP程序员 ...

  8. JVM调优推荐

    此文已由作者赵计刚薪授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. 1.JVM的调优主要是内存的调优,主要调两个方面: 各个代的大小 垃圾收集器选择 2.各个代的大小 常用的 ...

  9. updateByPrimaryKey 和 updateByPrimaryKeySelective

    1. 数据库记录 2. updateByPrimaryKey Preparing: UPDATE t_token_info SET entity_id = ?,entity_type = ?,time ...

  10. 在express3里用ejs模版引擎时,如何使其支持'.html'后缀

    ①express 默认jade模板,改为ejs模板,需执行以下命令: express -e --ejs ②在app.js中,将 app.set('view engine', 'jade'); 替换为 ...