*args 和 **kwargs的用法

本文详细解释了Python中*args和**kwargs的作用与用法,包括如何在函数定义中接收不定数量的位置参数和关键字参数,以及如何在调用函数时使用这两个特性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

大部分新的Python程序员都需要花上大量时间理解清楚 *args 和**kwargs这两个魔法变量。那么它们到底是什么?

首先让我告诉你, 其实并不是必须写成*args 和**kwargs。 只有变量前面的 *(星号)才是必须的. 你也可以写成*var 和**vars. 而写成*args 和**kwargs只是一个通俗的命名约定。 那就让我们先看一下*args吧。

1.*args 的用法

*args 和 **kwargs 主要用于函数定义。 你可以将不定数量的参数传递给一个函数。

这里的不定的意思是:预先并不知道, 函数使用者会传递多少个参数给你, 所以在这个场景下使用这两个关键字。 *args 是用来发送一个非键值对的可变数量的参数列表给一个函数.

这里有个例子帮你理解这个概念:

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')

这会产生如下输出:

first normal arg: yasoob
another arg through *argv: python
another arg through *argv: eggs
another arg through *argv: test

我希望这解决了你所有的困惑. 那接下来让我们谈谈 **kwargs

2.**kwargs 的用法

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

这里有个让你上手的例子:

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来调用一个参数为列表或者字典的函数。

3.使用 *args 和 **kwargs 来调用函数

那现在我们将看到怎样使用*args**kwargs 来调用一个函数。 假设,你有这样一个小函数:

def test_args_kwargs(arg1, arg2, arg3):
    print("arg1:", arg1)
    print("arg2:", arg2)
    print("arg3:", arg3)

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

# 首先使用 *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

标准参数与*args、**kwargs在使用时的顺序

那么如果你想在函数里同时使用所有这三种参数, 顺序是这样的:

some_func(fargs, *args, **kwargs)

4.什么时候使用它们?

这还真的要看你的需求而定。

最常见的用例是在写函数装饰器的时候。

此外它也可以用来做猴子补丁(monkey patching)。猴子补丁的意思是在程序运行时(runtime)修改某些代码。 打个比方,你有一个类,里面有个叫get_info的函数会调用一个API并返回相应的数据。如果我们想测试它,可以把API调用替换成一些测试数据。例如:

import someclass

def get_info(self, *args):
    return "Test data"

someclass.get_info = get_info




### Python*args **kwargs 的具体用法Python 编程中,`*args` `**kwargs` 是用于函数定义的强大工具,允许函数接受可变数量的参数。以下是它们的具体含义使用场景: #### 1. 使用 `*args` 接受任意数量的位置参数 `*args` 允许函数接收不定数量的位置参数,并将其作为元组传递给函数内部[^3]。 ```python def example_function(*args): print(type(args)) # 输出:<class 'tuple'> for arg in args: print(arg) example_function(1, "string", [1, 2, 3]) ``` 上述代码展示了如何通过 `*args` 将多个位置参数打包成一个元组并逐一处理。 --- #### 2. 使用 `**kwargs` 接受关键字参数 `**kwargs` 则允许函数接收不定数量的关键字参数,并将其存储在一个字典中[^4]。 ```python def example_kwargs(**kwargs): print(type(kwargs)) # 输出:<class 'dict'> for key, value in kwargs.items(): print(f"{key}: {value}") example_kwargs(name="Alice", age=25, city="New York") ``` 此示例说明了如何利用 `**kwargs` 来捕获键值对形式的关键字参数。 --- #### 3. 同时使用 `*args` `**kwargs` 可以同时在函数定义中使用两者,此时需注意顺序:`*args` 应位于 `**kwargs` 前面[^5]。 ```python def combined_example(*args, **kwargs): print("Positional arguments:", args) print("Keyword arguments:", kwargs) combined_example(10, 20, name="Bob", job="Engineer") ``` 运行结果将是: ``` Positional arguments: (10, 20) Keyword arguments: {'name': 'Bob', 'job': 'Engineer'} ``` --- #### 4. 解包操作 除了收集参数外,`*` `**` 还可用于解包已有的列表/元组或字典[^6]。 ```python numbers = [1, 2, 3] my_dict = {"a": 4, "b": 5} def unpacked_function(x, y, z, a, b): print(x, y, z, a, b) unpacked_function(*numbers, **my_dict) ``` 在此例子中,列表被解包为单独的位置参数,而字典则解包为关键字参数。 --- ### 总结 - `*args`: 收集额外的位置参数到一个元组中。 - `**kwargs`: 收集多余的关键字参数至一个字典里。 - 它们增强了函数灵活性,适用于需要动态输入的情况。 相关问题
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值