Shawn's Blog
目录 · 3 节

Python中的 *args和 **kwargs

0X00 *args是什么

我们知道Python3中的print从一个关键字变成了一个函数,那么调用的时候我们可以这样调用这个函数,可以随便接受几个参数。

python
1>>> print(1)
21
3>>> print(1, 2, 3)
41 2 3
5>>> print(1, "hello", 6.66)
61 hello 6.66

那么如果我们想自己实现类似这样‘变态’的函数该怎么实现呢?这就需要用到*args了,可以将一个非键值对的可变数量的参数列表传给一个函数(换个书佛啊:可以传n个参数给函数,而且n不是固定的),举个例子就容易理解多了。

python
1def say_something(*args):
2    for i in args:
3        print i
4    print '--------'
5
6say_something(1)
7say_something(1, 2, 3)
8say_something('hello')
9say_something('hello', 'world')

运行这个例子的输出就是这样的

11
2--------
31
42
53
6--------
7hello
8--------
9hello
10world
11--------

还有一个更棒的例子来自Gitbook

python
1def test_var_args(f_arg, *args):
2    print("first normal arg:", f_arg)
3    for arg in args:
4        print("another arg through *args:", arg)
5
6test_var_args('yasoob', 'python', 'eggs', 'test')

输出是这样的

python
1('first normal arg:', 'yasoob')
2('another arg through *args:', 'python')
3('another arg through *args:', 'eggs')
4('another arg through *args:', 'test')

这个例子完整的说明了\*args的用法,我们传入的第一个参数被函数指定的f_arg接收到了,其余的都被*args接收到了。

0X01 **kwargs是什么

写代码的时候还会有一种函数调用,大概是这个样子json.dumps(dict_data)json.dumps(dict_data, indent=4)。当然,实现这种的方式有一个最简单的方案就是def dumps(input_data, indent=0)。在可选参数只有一两个的时候这种方式固然是好用的,但是如果像是requests这种库中的常用方法,有很多很多个可选参数那就该用上这个**kwargs了。顾名思义这个就是keyworkargs的意思,也就是说是带有key的可变参数。可以这样定义一个函数

python
1def foo(**kwargs):
2    for key in kwargs:
3        print key
4        print kwargs[key]
5        print '-----'
6
7foo(a=1, b=2, c=3, d=4, e=5)

运行出来的结果可想而知:

1a
21
3-----
4c
53
6-----
7b
82
9-----
10e
115
12-----
13d
144
15-----

0X02 合在一起怎么用

值得一提的是如何把这两个放在一起用,这里列举个例子来演示一下

python
1#!/usr/bin/env python
2# coding=utf-8
3
4
5def foo(name, sex, *args, **kwargs):
6    print 'name is ', name
7    print 'sex is ', sex
8    print 'other is ', args
9    for key in kwargs:
10        print key, ' is ', kwargs[key]
11
12
13def bar(*args, **kwargs):
14    print 'args is ', args
15    print 'kwargs is ', kwargs
16
17
18foo('shawn', '???', 'hello', 'world', hobby='computer', number=666)
19print '--------------------------'
20bar('shawn', '???', 'hello', 'world', hobby='computer', number=666)

输出结果是这样的

python
1name is  shawn
2sex is  ???
3other is  ('hello', 'world')
4hobby  is  computer
5number  is  666
6--------------------------
7args is  ('shawn', '???', 'hello', 'world')
8kwargs is  {'hobby': 'computer', 'number': 666}

这里有需要注意的一点:参数的名字不一定非要是*args**kwargs,所以我们定义函数的时候不一定是def foo(*args, **kwargs):,也同样可以定义成def bar(*hehe, **haha):,这里真正标识的是星号而不是名字。不过建议命名的时候符合大家的习惯。

本文标题
Python中的 *args和 **kwargs
文章作者
Shawn
版权声明
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。

如果这篇文章对你有帮助,可以请我喝杯咖啡 ☕

评论