python函数中的参数*args和**kwargs的含义和用法
在python语言写成的模块中的函数里,常常可以看到函数的参数表列里面有这两个参数,形如:
def some_function(*args, **kwargs):
to do list
return 0
首先,解释星号的作用,一个星号
*
的作用是将tuple或者list中的元素进行unpack,分开传入,作为多个参数;两个星号
**
的作用是把dict类型的数据作为参数传入。
kwargs是keyword argument的缩写,args就是argument。我们知道,在Python中有两种参数,一种叫
位置参数
(positional argument),一种叫
关键词参数
(keyword argument),关键词参数只需要用
keyword = somekey
的方法即可传参,而位置参数只能由参数位置决定。这也就决定了位置参数一定要在前面,否则关键词参数数量的变化(比如有些kwargs有默认值因此没有传参或者在后面传参的),都会使得位置无法判断。因此常见的也是
*args
在
**kwargs
前面。
这两个的用途和效果如下:
def this_fun(a,b,*args,**kwargs):
print a
print b
print args
print kwargs
this_fun(0,1,2,3,index1=11,index2=22)
(2, 3)
{'index2': 22, 'index1': 11}
也就是说,第一中不定的参数形式把剩下的没有关键字的参数收起来形成一个tuple,而第二种把有关键字的收起来做成一个字典。
2018年06月05日23:27:57
抖落岁月的尘沙,以纯银一样的声音,和你的梦对话,世界也许很小很小,心的领域很大很大。 —— 诗人,舒婷
python函数中的参数*args和**kwargs的含义和用法在python语言写成的模块中的函数里,常常可以看到函数的参数表列里面有这两个参数,形如:def some_function(*args, **kwargs): to do list return 0首先,解释星号的作用,一个星号*的作用是将tuple或者list中的元素进行unpack,分开传入,作为...
复制代码 代码如下:#coding=utf8__author__ = ‘Administrator’
# 当
函数
的
参数
不确定时,可以使用*
args
和**k
war
gs
。*
args
没有key值,**k
war
gs
有key值
def fun_var_
args
(farg, *
args
): print ‘
args
:’, farg for value in
args
: print ‘another arg:’,value
# *
args
可以当作可容纳多个变量组成的list或tuplefun_var_
args
(1, ‘two’, 3, None)
#
args
: 1#another a
首先,要知道的是并不是必须写成*
args
和**k
war
gs
。只有变量前⾯的*才是必须的。所以,你也可以写成*var 和**vars。写成*
args
和**k
war
gs
只是⼀个通俗的命名约定。*
args
和 **k
war
gs
主要⽤于
函数
定义。你可以将不定数量的
参数
传递给⼀个
函数
。,作为
参数
传递给⼀个
函数
。使⽤ *
args
和 **k
war
gs
来调用
函数
。来调用⼀个
参数
为列表或者字典的
函数
。来给这个
函数
传递
参数
。最常见的用例是在写
函数
装饰器的时候。*
args
和 **k
war
gs
。**k
war
gs
的
用法
。
args
和**k
war
gs
都适用于
函数
的定义的。在日常工作
中
,如果我们不确定
函数
的
参数
时候,就可以使用*
args
和**k
war
gs
去把不定数量的
参数
传递给一个
函数
。**k
war
gs
存储可变的关键字
参数
,允许使用没有事先定义的
参数
名,将接收到任意多个关键字
参数
作为字典传递给
函数
。需要注意的是,
参数
arg、*
args
、**k
war
gs
三个
参数
的位置是确定的。这里需要强调的是,
函数
的
参数
的顺序:*
args
必须在**k
war
gs
前面,调用
函数
传递
参数
也必须依照这个顺序。(2)**k
war
gs
示例。
多个实参,放到一个元组里面,以*开头,可以传多个
参数
;**是形参
中
按照关键字传值把多余的传值以字典的方式呈现
*
args
:表示的就是将实参
中
按照位置传值,多出来的值都给
args
,且以元组的方式呈现,
主要是 用来表示
函数
接收可变长度的非关键字
参数
列表作为
函数
的输入。
**k
war
gs
:表示的就是形参
中
按照关键字传值把多余的传值以字典的方式呈现
主要是 用来表示
函数
接收可变长度的关键字
参数
列表作为
函数
的输入。
*
args
:
就是以元组的形式来呈现多余的
参数
,接受非关键字的
参数
def foo(x, *
args
):
print(x)
print(
args
)
foo(1,2
去面试的时候,做了一道笔试题——什么是*
args
和**k
war
gs
,区别在哪里?
有点蒙,好像见过,但是不知道具体的意思。所以回来查了一下资料,大概明白,做一下笔记。
总的来说,*
args
代表任何多个无名
参数
,返回的是元组;**k
war
gs
表示关键字
参数
,所有传入的key=value,返回字典;
*
args
和**k
war
gs
的用途:
*
args
和 **k
war
gs
主要用于
函数
定义, 可以将不定数量的
参数
传递给一个
函数
。
*
args
是用来发一个非键值对的可变数量的
参数
列表给一个
函数
; k
war
gs
允许将
表示的是,表示的是,他们两个叫做
python
中
的可变
参数
。注意:和可以随便修改,重点在于和,所以上述说法也可表述为表示的是,表示的是。他们两个之间的区别及使用场景为:在当传入的
参数
个数未知,且不需要知道
参数
名称时使用。代码为:
第一个
参数
是必须传入的形参,而后面的四个
参数
作为可变
参数
传入到了
函数
中
,并赋值为。
返回一个对象,这个对象是一个元组。
2. **k
war
gs
当传入的
参数
个数未知,但需要知道
参数
的名称时使用。代码为:
输出为:...
在
函数
定义时,
args
是argument的缩写,表示位置
参数
,k
war
gs
是key
war
darguments的缩写,表示关键字
参数
所以对应的*
args
表示可变的位置
参数
,*k
war
gs
表示可变的关键字
参数
,且位置
参数
是要在关键字
参数
之前的。“然后在调用的时候,*
args
对应的
参数
直接正常输入即可,然后
函数
会将其变为元组来使用,而*k
war
gs
的输入方式应为“x=y”的形式,
函数
会把输入的数据转变为字典的形式来使用。写代码时尤其是在
函数
的定义时经常会遇到*
args
,**k
war
gs
,那这到底是
什么意思
呢。..
好久没有学习
python
了,应为工作的需要,再次拾起
python
,唤起记忆。
当
函数
的
参数
不确定时,可以使用*
args
和**k
war
gs
,*
args
没有key值,**k
war
gs
有key值。
还是直接来代码吧,废话少说
def fun_var_
args
(farg, *
args
):
print "arg:", farg
for value in
args
:
不确定传入
参数
的数量或形式
不关心传入
参数
的数量或形式(此时该类或
函数
多作为一个
中
间件的角色,接收
参数
后只是做了一些预处理,最后将这些
参数
传递给其他类或
函数
做进一步处理,如装饰器)
二、使用方法
基本使用:
def receive_
args
(*
args
, **k
war
gs
):
print(f'
args
type is: {type(
args
)}, value is: {
args
}')
在
Python
中
,*
args
和**k
war
gs
是用于传递变长
参数
的特殊语法。
*
args
用于传递任意数量的位置
参数
,其实际上会将这些
参数
打包成一个元组(tuple)传递给
函数
。这个元组的名字可以是任意的,但通常使用
args
来表示。例如:
def foo(*
args
):
for arg in
args
:
print(arg)
foo(1, 2, 3, 4) # 输出:1 2 3 4
**k
war
gs
用于传递任意数量的关键字
参数
,其实际上会将这些
参数
打包成一个字典(dict)传递给
函数
。这个字典的名字可以是任意的,但通常使用k
war
gs
来表示。例如:
def bar(**k
war
gs
):
for key, value in k
war
gs
.items():
print(key, value)
bar(a=1, b=2, c=3) # 输出:a 1 b 2 c 3
需要注意的是,在一个
函数
中
,*
args
和**k
war
gs
可以同时使用,但是*
args
必须出现在**k
war
gs
之前。例如:
def foobar(*
args
, **k
war
gs
):
for arg in
args
:
print(arg)
for key, value in k
war
gs
.items():
print(key, value)
foobar(1, 2, 3, a=4, b=5) # 输出:1 2 3 a 4 b 5