Jessie.Y's Den

A blog for recoding life in pieces

Arvin.W, another owner.


WELCOME TO OUR WORLD

Python中的*args 和 **kwargs

*args 和 **kwargs 主要用于函数的定义,可以将不确定数量的参数传递给一个函数。

*args的用法

*args是用来发送一个非键值对的可变数量的参数列表给一个函数。

例子1:

def test_var_args(f_arg, *args):

    print  "first normal arg:", f_arg

    for arg in args:

        print "another arg through *argv:", arg

test_var_args(python, 'IT','IS','GOOD')

产生输入如下:

first normal arg: python
another arg through *argv: IT
another arg through *argv: IS
another arg through *argv: GOOD

**kwargs的用法

**kwargs允许将不定个数的key-value键值对作为参数传递给函数。

例子2:

def greet_me(**kwargs):

	for key, value in kwargs.items():

		print key, value

greet_me(name='python', version='2.7.2')
version 2.7
name python

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

*args 和 **kwargs既可以作为函数参数定义,还可以作为调用参数来调用函数。比如,你有如下一个函数:

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

那么,我们可以使用*args 或者 **kwargs来给这个函数传递参数,如下:

#使用*args
args=('abc',1,100)
test_args_kwargs(*args)

#使用**kwargs
kwargs={"arg2":1,"arg1":3,"arg3":"abc"}
test_args_kwargs(**kwargs)

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

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

some_func(fargs, *args, **kwargs)

例子3:

def test_args_kwargs(f_arg0, arg1, arg2,arg3=None, arg4=None):
	print f_arg0,arg1,arg2,arg3,arg4

>>> arg=(1,)
>>> kwargs={"arg4":'python',"arg2":2}
>>> test_args_kwargs(0,*arg,**kwargs)
0 1 2 None python
最近的文章

Python的`__slots__`魔法

在Python中,每个类都有实例属性,默认情况下Python用一个字典来保存一个对象的实例属性。这非常有用,因为它允许我们在运行时去设置任意的新属性。然而,对于有着已知属性的小类来说,它可能是个瓶颈,这个字典浪费了很多内存。Python不能在对象创建时直接分配一个固定量的内存来保存所有的属性,因此如果你创建许多对象(我指的是成千上万个),它会消耗掉很多内存。不过还是有一个方法来规避这个问题。这个方法需要使用__slots__来告诉Python不要使用字典,而且只给一个固定集合的属性分配空间...…

继续阅读