设为首页 加入收藏

TOP

python *args **kwargs(一)
2017-09-30 14:25:12 】 浏览:416
Tags:python args kwargs

简单来说,当你传入的参数不能确定是几个的时候会用到 *args和**kwargs,这里星号后边只是个代号,你写成a也可以。

而这两者的区别是 如果是键值对就要用后者,反之前者就可以。

同时还可以用(a, *args, **kwargs)这种方式

 

具体例子见下面代码:

In [1]: def h(a):
   ...:     print a
   ...:     

In [2]: h(3)
3

In [3]: def h(*args):
   ...:     for i in args:
   ...:         print i
   ...:         

In [4]: h((1, 2, 3))
(1, 2, 3)

In [5]: a = [1, 2, 3]

In [6]: h(a)
[1, 2, 3]

In [7]: h(3)
3

In [8]: h(3, 3)
3
3

In [9]: h(3, 5)
3
5

In [10]: def h(a, *args):
   ....:     print a
   ....:     for i in args:
   ....:         print i
   ....:         

In [11]: h(3, 4, 5)
3
4
5

In [12]: h(3, a)
3
[1, 2, 3]

In [13]: h(3, (1, 2, 3))
3
(1, 2, 3)

In [14]: h(a)
[1, 2, 3]

In [15]: h(a, a)
[1, 2, 3]
[1, 2, 3]

In [16]: def h(a):
   ....:     for i in a:
   ....:         print i
   ....:         

In [17]: h(a)
1
2
3

  

In [19]: def h(a, *args):
    print 'a', a
    for i in args:
        print i
   ....:         

In [20]: h(1, 3, 4)
a 1
3
4

In [21]: h(1, a)
a 1
[1, 2, 3]

In [22]: h(1, (1, (2, 3)))
a 1
(1, (2, 3))

In [23]: h(1, (1, 2, 3))
a 1
(1, 2, 3)

In [24]: h(1, (1, 2, 3), (3, 4))
a 1
(1, 2, 3)
(3, 4)

 注意: 此处并没有正确的打印出结果,小括号里的数并没有按行打出,而是直接打出了,正确的用法是要加上*才可以,见下面的代码

**kwargs的用法:

In [25]: def h(**kwargs):
   ....:     for k, v in kwargs.items():
   ....:         print k, v
   ....:         

In [26]: h({'a': 1, 'b': 3})
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-26-557f772fd853> in <module>()
----> 1 h({'a': 1, 'b': 3})    # 此处没有**,提示错误

TypeError: h() takes exactly 0 arguments (1 given)

In [27]: h(**{'a': 1, 'b': 3})
a 1
b 3

In [28]: def hh(*args):
   ....:     for i in args:
   ....:         print i
   ....:         

In [29]: hh(*(1, 2, 3))   # 此处是正确的使用方法
1
2
3

In [30]: a = (1, 2, 3)

In [31]: hh(*a)
1
2
3

In [32]: def hhh(a, *args):
   ....:     print a, 'a'
   ....:     for i in args:
   ....:         print i
   ....:         

In [33]: hhh(*(1, 3, 4))
1 a
3
4

 

同时使用三种方式的顺序是, def f(a, *args, **kwargs)

In [34]: def hhhh(a, *args, **kwargs):
   ....:     print 'a:', a
   ....:     for i in args:
   ....:         print i
   ....:     print 'kwargs:'
   ....:     for k, v in kwargs:
   ....:         print k, v
   ....:         

In [35]: hhhh(1, *(2, 3), **{'c': 1, 'b': 3})
a: 1
2
3
kwargs:
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-35-6ac13cc71458> in <module>()
----> 1 hhhh(1, *(2, 3), **{'c': 1, 'b': 3})

<ipython-input-34-18188bbea105> in hhhh(a, *args, **kwargs)
      4         print i
      5     print 'kwargs:'
----> 6     for k, v in kwargs:
      7         print k, v
      8 

ValueError: need more than 1 value to unpack

In [36]: def hhhh(a, *args, **kwargs):
    print 'a:', a
    for i in args:
        print i
    print 'kwargs:'
    for k, v in kwargs.items:
        print k, v
   ....:         

In [37]: hhhh(1, *(2, 3), **{'c': 1, 'b': 3})
a: 1
2
3
kwargs:
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-37-6ac13cc71458> in <module>()
----> 1 hhhh(1, *(2, 3), **{'c': 1, 'b': 3})

<ipython-input-36-0e0a773cdf48> in hhhh(a, *args, **kwargs)
      4         print i
      5     print 'kwargs:'
----> 6     for k, v in kwargs.items:
      7         print k, v
      8 

TypeError: 'builtin_function_or_method' object is not iterable

In [38]: def hhhh(a, *args, **kwargs):
    print 'a:', a
    for i in args:
        print i
    print 'kwargs
首页 上一页 1 2 下一页 尾页 1/2/2
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇pythonic编程示例及简析 下一篇python字符串常用操作方法

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目