一、*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)

程序执行结果:

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

示例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)

程序执行结果:

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

二、**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()

程序执行结果:

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

示例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)

 程序执行结果:

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

三、*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')

程序执行结果:

Python 中的 *args 和 **kwargs 原理与用法介绍(实例可直接运行)_开发语言_05

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

程序执行结果:

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

示例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)

程序执行结果:

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

示例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")

程序执行结果:

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