Python中的*args和**kwargs

众所周知,在Python语言中,比较常见的写法是将参数传递给函数以执行特定的任务。而我们定义的函数被定义的时候,其参数通常限制在特定的数量上。为了更好的理解这段话,下面我们直接看一个代码示例,它定义了一个带有两个位置参数的函数来执行简单的加法操作。

示例代码如下所示:


def demo(a, b):
    sum = a + b
    return sum

上面定义的函数需要接收两个参数,我们接下来,给demo传递两个参数过去,看看最后的输出结果。代码如下所示:


def demo(a, b):
    sum = a + b
    return sum


if __name__ == '__main__':
    data = demo(2, 6)
    print(data)

成功运行之后,它会输出两个参数之间的和。

重点来了!如果说,我们要传递给它的参数多于或少于两个,它会抛出一个错误,这是函数在编程中的正常工作方式。这很简单,但是如果说,我们现在需要定义一个包含不固定数量参数的函数该怎么做呢?

1.使用*args

也就是说,当我们需要定义一个函数,该函数接受的位置参数数量不固定,而且要必须足够灵活,可以接受任意数量的参数时,这个时候就可以用到*args来解决。

要知道,在Python中,*args通常作为一个元组数据结构,当函数被调用时,它能够容纳传递给它的多个参数。为什么这么说,直接看下面的代码示例:


def demo(*args):
    sum = 0
    for num in args:
        sum += num
    return sum


if __name__ == '__main__':
    result = demo(1, 2, 3, 4, 5)
    print(result)

成功运行上述代码之后,传递给demo的参数会依次进行相加,并返回一个最终的计算结果。通过上面的写法,是不是突然间觉得*args的调子起来了呢?

总而言之,使用*args简洁明了,拒绝繁琐操作。

2.使用**kwargs

说完了*args,接下来我们再看看**kwargs。

在Python中,**kwargs是一种数据结构,用于在函数定义中表示接受任意数量的关键字参数。这里的**是一个特殊语法,用于将传入的关键字参数打包成一个字典。换言之,它主要用于在函数调用时保存多个关键字参数。

接下来,我们直接使用一个代码示例来解释上面说到的关键字参数。示例如下所示:


def demo(*args, **kwargs):
    sum = 0
    for num in args:
        sum += num
    # 是否以百分比形式输出
    if kwargs.get("percent") is True:
        sum = sum * 100
    return sum


if __name__ == '__main__':
    result = demo(1, 2, 3, 4, 5, percent=True)
    print(result)

在上面的代码中,我们添加了一个percent条件,用来指定是否以百分比形式输出。成功运行上述代码,你会看到所有的参数在相互叠加的情况下,再进行*100的操作。

当你在函数定义中使用**kwargs时,你可以传递任意数量的关键字参数到该函数中,这些参数在函数内部被收集到一个名为kwargs的字典中。这使得函数能够处理可变数量的参数,增强了函数的灵活性。

我们再举个简单的例子,如下所示:


def greet(**kwargs):  
    for key, value in kwargs.items():  
        print(f"{key}: {value}")  
  
# 调用greet函数并传递关键字参数  
greet(name="Alice", age=25, country="USA"

# 成功运行之后,结果输出如下
# name: Alice  
# age: 25  
# country: USA

在上面的示例中,greet函数使用**kwargs来收集所有传入的关键字参数。然后,它遍历kwargs字典,并打印出每个关键字参数的名称和值。需要注意的是,**kwargs通常与其他参数一起使用,并且应该放在参数列表的最后。这是因为关键字参数的传递是通过名称匹配的,而位置参数则是按照它们在参数列表中的位置来传递的。如果在**kwargs之前有位置参数,Python解释器会首先解析位置参数,然后将剩余的关键字参数传递给**kwargs。

比如说,我们下面再举一个更复杂的示例,展示了如何在函数定义中结合使用位置参数、默认参数和**kwargs:


def complex_function(arg1, arg2, default_arg=None, **kwargs):  
    print(f"arg1: {arg1}")  
    print(f"arg2: {arg2}")  
    print(f"default_arg: {default_arg}")  
    for key, value in kwargs.items():  
        print(f"{key}: {value}")  
  
# 调用complex_function函数并传递各种参数  
complex_function(1, 2, default_arg="default", extra1="value1", extra2="value2")

成功运行之后,结果输出如下所示:


arg1: 1  
arg2: 2  
default_arg: default  
extra1: value1  
extra2: value2

在上面的示例中,complex_function函数接受两个位置参数arg1和arg2,一个默认参数default_arg,以及任意数量的关键字参数**kwargs。调用该函数时,可以传递相应的参数,并在函数内部进行处理。

综上所述,*args是元组数据结构,它使得函数在调用时,能够接受任意数量的位置参数。而**kwargs,它确保使用它自己定义的函数能够接收多个键值对作为参数,如果要传递字典作为参数,则需要使用两个前置的星号**进行解包。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值