Python 中的 *args 和 **kwargs 原理与用法介绍(实例可直接运行)

一、*args 介绍 

知识点 

  • *args 在 Python 中是用来处理在函数定义时不确定数量的位置参数,它允许函数接收任意数量的参数,这些参数被存储在一个元组中。
  • 使用 *args 可以让你的函数接受任意数量的参数,增加了函数的灵活性。

示例1:基本用法

'''
*args在Python中是用来处理在函数定义时不确定数量的位置参数。
它允许函数接收任意数量的参数,这些参数被存储在一个元组中。
'''
def args_sample_func(*args):
    for arg in args:
        print(arg)

if __name__ == '__main__':
    args_sample_func("David", 28, ['apple', 'banana', 'orange'], 0.001)

程序执行结果:

示例2:动态参数传递

# 定义一个加法函数
def add(*nums):
    return sum(nums)

# 定义一个乘法函数
def mult(*nums):
    res = 1
    for num in nums:
        res *= num
    return res

# 定义一个减法函数
def sub(*nums):
    res = nums[0]
    for num in nums[1:]:
        res -= num
    return res

# 定义一个函数 caller,可根据传入的方法名和方法对应的参数,返回方法的执行结果
def caller(func, *nums):
    return func(*nums)

if __name__ == '__main__':
    # 通过动态地改变 caller 函数的第一个参数值,就可以改变其实现的功能
    res1 = caller(add, 1, 2, 3, 4, 5)  # 若干数求和
    res2 = caller(mult, 2, 3, 5)  # 求若干个数的相乘结果
    res3 = caller(sub, 11, 7, 2, 5, 9)  # 用第一个数减去后面所有的数
    print(res1)
    print(res2)
    print(res3)

程序执行结果:

二、**kwargs 介绍

知识点 

  • **kwargs 允许在函数中处理函数定义时未被明确指定的关键字参数,这些参数被打包进一个字典中,使得函数能够以更灵活的方式接收数据。
  • 在定义函数时,**kwargs 可以与位置参数、默认参数以及 *args 结合使用来创建更加灵活的函数接口。

示例1:基本用法

def hi(**kwargs):
    if 'name' in kwargs:
        print(f"Hello {kwargs['name']}!")
    else:
        print("Hello there!")

if __name__ == '__main__':
    hi(name="David")
    hi()

程序执行结果:

示例2:动态配置参数

def person_info(**kwargs):
    name = kwargs.get('name', 'David')  # 如果name未赋值,则其值默认为David
    age = kwargs.get('age', 28)
    email = kwargs.get('email', 'xxx@qq.com')
    phone = kwargs.get('phone', '13566666667')
    print(name, age, email, phone)


if __name__ == '__main__':
    person_info(name='Sophia')
    person_info(name='Sophia', email='sophia@qq.com')
    person_info(name='Sophia', email='sophia@qq.com', age=22)

 程序执行结果:

三、*args 和 **kwargs 组合使用

注意点

  • 需避免参数覆盖问题
  • 避免过度使用,导致代码可读性下降 

示例1

def combined_func(first, *args, **kwargs):
    print(f"第一个参数:{first}")
    print(f"位置参数:{args}")
    print(f"关键字参数:{kwargs}")


if __name__ == '__main__':
    combined_func('David', 28, ['apple', 'banana', 'orange'], email='xxx@qq.com', phone='135666666667')

程序执行结果:

示例2

def combined_func(*args, **kwargs):
    print(f"位置参数:{args}")
    print(f"关键字参数:{kwargs}")


if __name__ == '__main__':
    combined_func('David', 28, ['apple', 'banana', 'orange'], email='xxx@qq.com', phone='135666666667')

程序执行结果:

示例3:动态函数调用

def dynamic_call(func, *args, **kwargs):
    return func(*args, **kwargs)

def sample_func(a, b, c=None):
    return f"a: {a}, b: {b}, c: {c}"

if __name__ == '__main__':
    result = dynamic_call(sample_func, 1, 2, c=3)
    print(result)

程序执行结果:

示例4:在装饰器中的运用

'''
装饰器是 Python 中一个强大的功能,它允许你在不修改原有函数代码的前提下,增加函数的功能。
使用 *args 和 **kwargs 可以创建通用装饰器,适用于任意参数签名的函数。
'''
def my_decorator(func):
    def wrapper(*args, **kwargs):
        print("在函数调用前执行一系列命令")
        result = func(*args, **kwargs)
        print("在函数调用后执行一系列命令")
        return result

    return wrapper


@my_decorator
def hi(name):
    print(f"你好, {name}!")


if __name__ == '__main__':
    hi("David")

程序执行结果:

  • 23
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

我有明珠一颗

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值