前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Python魔法变量*args 和 **kwargs

Python魔法变量*args 和 **kwargs

作者头像
菲宇
发布2022-05-06 13:21:03
7970
发布2022-05-06 13:21:03
举报
文章被收录于专栏:菲宇菲宇

多个实参,放到一个元组里面,以*开头,可以传多个参数;**是形参中按照关键字传值把多余的传值以字典的方式呈现 *args 和**kwargs只是一个通俗的命名约定,只有变量前面的 *(星号)才是必须的,也可写成*var 和**vars。 *args 和 **kwargs 主要用于函数定义。 可以将不定数量的参数传递给一个函数。主:不定的意思是预先并不知道, 函数使用者会传递多少个参数给你, 所以在这个场景下使用这两个关键字。 *args:(表示的就是将实参中按照位置传值,多出来的值都给args,且以元祖的方式呈现)

示例:

代码语言:javascript
复制
def foo(x,*args):
    print(x)
    print(args)

foo(1,2,3,4,5)#其中的2,3,4,5都给了args

执行结果是:

代码语言:javascript
复制
1
(2, 3, 4, 5)

当args与位置参数和默认参数混用的情况下:(注意三者的顺序)

示例一、(三者顺序是:位置参数、默认参数、*args)

代码语言:javascript
复制
def foo(x,y=1,*args):
    print(x)
    print(y)
    print(args)

foo(1,2,3,4,5)#其中的x为1,y=1的值被2重置了,3,4,5都给了args

执行结果是:

代码语言:javascript
复制
1
2
(3, 4, 5)

 示例二、(三者顺序是:位置参数、*args、默认参数)

代码语言:javascript
复制
def foo(x,*args,y=1):
    print(x)
    print(args)
    print(y)

foo(1,2,3,4,5)#其中的x为1,2,3,4,5都给了args,y按照默认参数依旧为1

执行结果是:

代码语言:javascript
复制
1
(2, 3, 4, 5)
1

其中关于*,可以从2个角度来看(需要拆分来看):

1、从形参的角度来看:

示例:

1 2 3

def foo(*args):#其实这一操作相当于def foo(a,b,c,d,e):     print(args) foo(1,2,3,4,5)#其中的1,2,3,4,5都按照位置传值分别传给了a,b,c,d,e

执行结果是:

1

(1, 2, 3, 4, 5)

2、从实参的角度来看:

示例:

1 2 3 4 5 6

def foo(x,y,z):     print(x)     print(y)     print(z)       foo(*(1,2,3))#其中的*(1,2,3)拆开来看就是:foo(1,2,3),都按照位置传值分别传给了x,y,z

执行结果是:

代码语言:javascript
复制
1
2
3

**kwargs:(表示的就是形参中按照关键字传值把多余的传值以字典的方式呈现)

示例:

代码语言:javascript
复制
def foo(x,**kwargs):
    print(x)
    print(kwargs)
foo(1,y=1,a=2,b=3,c=4)#将y=1,a=2,b=3,c=4以字典的方式给了kwargs

执行结果是:

代码语言:javascript
复制
1
{'y': 1, 'a': 2, 'b': 3, 'c': 4}

关于**kwargs与位置参数、*args、默认参数混着用的问题:(注意顺序)

位置参数、*args、**kwargs三者的顺序必须是位置参数、*args、**kwargs,不然就会报错:

示例:

1 2 3 4 5

def foo(x,*args,**kwargs):     print(x)     print(args)     print(kwargs) foo(1,2,3,4,y=1,a=2,b=3,c=4)#将1传给了x,将2,3,4以元组方式传给了args,y=1,a=2,b=3,c=4以字典的方式给了kwargs

执行结果是:

1 2 3

1 (2, 3, 4) {'y': 1, 'a': 2, 'b': 3, 'c': 4}

错误示例:(由于顺序错误)

1 2 3 4 5

def foo(x,**kwargs,*args):     print(x)     print(args)     print(kwargs) foo(1,y=1,a=2,b=3,c=4,2,3,4)

执行结果就会报错:

1

SyntaxError: invalid syntax

位置参数、默认参数、**kwargs三者的顺序必须是位置参数、默认参数、**kwargs,不然就会报错:

示例:

1 2 3 4 5

def foo(x,y=1,**kwargs):     print(x)     print(y)     print(kwargs) foo(1,a=2,b=3,c=4)#将1按照位置传值给x,y按照默认参数为1,a=2,b=3,c=4以字典的方式给了kwargs

执行结果是:

1 2 3

1 1 {'a': 2, 'b': 3, 'c': 4}

其中关于**,可以从2个角度来看(需要拆分来看):

1、从形参的角度来看:

示例:

1 2 3

def foo(**kwargs):#其实就是相当于def foo(y,a,b,c)     print(kwargs) foo(y=1,a=2,b=3,c=4)

执行结果是:

1

{'y': 1, 'a': 2, 'b': 3, 'c': 4}

2、从实参的角度来看:

示例一:

1 2 3 4 5 6

def foo(a,b,c,d):     print(a)     print(b)     print(c)     print(d) foo(**{"a":2,"b":3,"c":4,"d":5})#**{"a":2,"b":3,"c":4,"d":5}是将字典里的每个值按照关键字传值的方式传给a,b,c,d

执行结果是:

1 2 3 4

2 3 4 5

示例二:

1 2 3 4 5 6

def foo(a,b,c,d=1):     print(a)     print(b)     print(c)     print(d) foo(**{"a":2,"b":3,"c":4})#**{"a":2,"b":3,"c":4}是将字典里的每个值按照关键字传值的方式传给a,b,c;d依旧按照默认参数

执行结果是:

1 2 3 4

2 3 4 1

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

例子:

代码语言:javascript
复制
def test_var_args(f_arg, *argv):
    print("first normal arg:", f_arg)
    for arg in argv:
        print("another arg through *argv:", arg)

test_var_args('yasoob', 'python', 'eggs', 'test')

输出:

代码语言:javascript
复制
first normal arg: yasoob
another arg through *argv: python
another arg through *argv: eggs
another arg through *argv: test

**kwargs 允许你将不定长度的键值对, 作为参数传递给一个函数。 如果你想要在一个函数里处理带名字的参数, 你应该使用**kwargs

例子:

代码语言:javascript
复制
def greet_me(**kwargs):
    for key, value in kwargs.items():
        print("{0} == {1}".format(key, value))


>>> greet_me(name="yasoob")
name == yasoob

现在你可以看出怎样在一个函数里处理了一个键值对参数了。这就是**kwargs的基础, 而且你可以看出它有多么管用。

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

 假设,你有这样一个小函数:

代码语言:javascript
复制
def test_args_kwargs(arg1, arg2, arg3):
    print("arg1:", arg1)
    print("arg2:", arg2)
    print("arg3:", arg3)

你可以使用*args**kwargs来给这个小函数传递参数。 下面是怎样做:

代码语言:javascript
复制
# 首先使用 *args
>>> args = ("two", 3, 5)
>>> test_args_kwargs(*args)
arg1: two
arg2: 3
arg3: 5

# 现在使用 **kwargs:
>>> kwargs = {"arg3": 3, "arg2": "two", "arg1": 5}
>>> test_args_kwargs(**kwargs)
arg1: 5
arg2: two
arg3: 3

最常见的用例是在写函数装饰器的时候使用这两个魔法函数。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2018-12-29,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 使用 *args 和 **kwargs 来调用函数
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档