一、*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")
程序执行结果: