Python 中的 *args 和 **kwargs

在阅读 Python 代码的过程中,不时会看到 *args 和 **kwargs ,它们究竟表示什么?又该如何使用呢?

首先要明确,这里的 * 并不是乘法运算符也不是序列重复操作符,**也不是指数运算符也不是幂运算符。

  • * 出现在列表变量前时,表示将列表元素解包,可将列表元素分配给多个变量;
  • ** 出现在字典变量前时,表示将字典解包,可将字典中的键值对生成以键名称为变量名称的变量值对;

它们的名称中都包含字符 "args",表示它们都与函数参数传递相关。

我们先来看一下 Python 函数参数传递方法。

在定义 Python 函数时,通常情况下参数数量和参数类型和名称都是确定的。参数可分为位置参数命名参数

位置参数:参数的含义和参数的位置密切相关。比如在下面的网络连接函数定义中,第一个参数表示要连接的目标主机名称,第二个参数表示目标端口,第三个参数表示用户名称,第四个参数表示用户密码。

def net_connect(host, port, user, pass):

用户在调用上面的函数时,必须按照上面定义的顺序传入相应的参数,否则就会导致错误。

 net_connect('login.example.com', 8888, 'guest', 'guest')

命名参数:参数有名称,传递参数值时需要指定参数的名称。

将上面示例中的函数按命名参数,可重新定义如下:

def net_connect(host='localhost', port=8888, user='guest', pass='guest') 

通过命名参数,可以设定参数的默认值,即在调用函数时,如果没有显式指定参数,则使用默认值。 下面的调用方式都是等价的。

net_connect()

net_connect(host='localhost')

net_connect(port=8888)

net_connect(user='guest')

net_connect(pass='guest')

使用命名参数后,参数位置可以互换。下面的调用方式都是等价的。

net_connect(port=80, pass='guest', user='guest', host='localhost')

net_connect(pass='guest', user='guest', host='localhost', port=80)

net_connect(user='guest', pass='guest', host='localhost', port=80)

net_connect(user='guest', host='localhost', pass='guest', port=80)

位置参数和命名参数可以同时出现,但位置参数必须在所有命名参数左侧。

上面的示例函数改写如下:

def net_connect(host, port, user='guest', pass='guest')

讲了这么多,那 *args 和 **kwargs 又该如何使用呢?

在调用函数时,可以通过对列表解包和字典解包来传递参数。

target = ['localhost', 8888]

credential  = {'user':'guest', 'pass':guest'}

net_connect(*target, **credentail)

特别是参数数量会根据实际情况变动时,我们可以根据条件构造字典项,然后在调用函数时将字典解包即可,这样就可以避免复杂的条件判断给函数传递不同的参数。

在对已有函数进行封装时,通常利用 *args 和 **kwargs 向目标函数传递参数。

def target_func(....):

...

def my_func(arg1, arg2, arg3, *args, **kwargs) :

      ...

      target_func(*args, **kwargs)

如果函数定义时使用了列表解包或字典解包,我们可以分别通过 list 和 dict 来遍历参数。

def func_name(*args, **kwargs):

      for item in args:

          ...

      for k, v in kwargs.items():

          ...

Python ,`*args` 和 `**kwargs` 是常用的参数传递方式,用于将不定数量的参数传递给函数。 `*args` 是一个特殊的语法,用于在函数定义接受任意数量的位置参数。当我们在函数定义使用 `*args` 参数时,Python 会将传递给函数的所有位置参数打包成一个元组,并将该元组赋值给 `args` 变量。这样,我们就可以在函数使用 `args` 变量来访问所有位置参数。 下面是一个简单的例子,演示如何使用 `*args` 参数接受任意数量的位置参数: ``` def print_args(*args): for arg in args: print(arg) # 调用函数 print_args(1, 2, 3) print_args("hello", "world") ``` 在上面的代码,我们定义了一个 `print_args` 函数,它接受任意数量的位置参数。在函数,我们使用 `for` 循环遍历 `args` 元组,并打印每个参数的值。当我们调用 `print_args` 函数时,Python 会将传递给函数的所有位置参数打包成一个元组,并将该元组赋值给 `args` 变量。 `**kwargs` 是另一个特殊的语法,用于在函数定义接受任意数量的关键字参数。当我们在函数定义使用 `**kwargs` 参数时,Python 会将传递给函数的所有关键字参数打包成一个字典,并将该字典赋值给 `kwargs` 变量。这样,我们就可以在函数使用 `kwargs` 变量来访问所有关键字参数。 下面是一个简单的例子,演示如何使用 `**kwargs` 参数接受任意数量的关键字参数: ``` def print_kwargs(**kwargs): for key, value in kwargs.items(): print(f"{key} = {value}") # 调用函数 print_kwargs(a=1, b=2, c=3) print_kwargs(name="Alice", age=25) ``` 在上面的代码,我们定义了一个 `print_kwargs` 函数,它接受任意数量的关键字参数。在函数,我们使用 `for` 循环遍历 `kwargs` 字典,并打印每个参数的键值对。当我们调用 `print_kwargs` 函数时,Python 会将传递给函数的所有关键字参数打包成一个字典,并将该字典赋值给 `kwargs` 变量。 需要注意的是,`*args` 和 `**kwargs` 可以同时在函数定义使用,以接受任意数量的位置参数和关键字参数。在这种情况下,`*args` 必须放在 `**kwargs` 之前。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值