我们知道函数是 Python 代码编程的基础。它可以接受零个或多个参数并返回值。函数参数传递非常灵活。 *args 和 **kwargs 可以处理参数变得更容易、更简洁。
*args 和 **kwargs 虽然功能强大,但能真正掌握的同学其实并不多。在这篇文章中,我将分享十个示例,让你轻松掌握!
示例1
如下函数是计算两个数字的和
def addition(a, b):
return a + b
print(addition(3,4))
此函数只需要输入两个数字。如果我们想要一个计算三个或四个数字的函数呢?我们甚至可能不希望对传递到函数的参数数设置约束。
在这种情况下,我们可以使用 *args 作为参数。
def addition(*args):
result = 0
for i in args:
result += i
return result
传递给加法函数的参数存储在元组中。我们可以在 args 变量上迭代。
示例2
在第二个示例之前,先解释位置参数和关键词参数的区别。
- 位置参数仅由名称声明。
- 关键字参数由名称和默认值声明。
调用函数时,必须给出位置参数的值。否则,我们将得到一个错误。如果我们不指定关键字参数的值,则它采用默认值。
def addition(a, b=2): #a is positional, b is keyword argument
return a + b
print(addition(1))
3
def addition(a, b): #a and b are positional arguments
return a + b
print(addition(1))
TypeError: addition() missing 1 required positional argument: 'b'
我们现在可以做第二个例子了。
def arg_printer(a, b, *args):
print(f'a is {a}')
print(f'b is {b}')
print(f'args are {args}')
arg_printer(3, 4, 5, 8, 3)
a is 3
b is 4
args are (5, 8, 3)
前两个值被赋予 a 和 b。其余值存储在 args 元组中。
示例3
如果我们在位置参数之后放置关键字参数。在调用函数时,我们看以下示例:
arg_printer(a=4, 2, 4, 5)
SyntaxError: positional argument follows keyword argument
将值分配给通常为位置参数的 ,则它将成为关键字参数。由于后跟位置参数,因此我们得到一个语法错误。
示例4
在下面的函数中,option 是关键字参数(它有一个默认值)
def addition(a, b, *args, option=True):
result = 0
if option:
for i in args:
result += i
return a + b + result
else:
return result
由于option 默认值为 True,因此函数返回参数的总和,除非选项参数声明为 False。
print(addition(1,4,5,6,7))
23
print(addition(1,4,5,6,7, option=False))
0
示例5
**kwargs 收集未显式定义的所有关键字参数。因此,它执行与 *args 相同的操作,但用于关键字参数。
默认情况下,**kwargs 是一个空字典。每个未定义的关键字参数都存储为 **kwargs 字典中的键值对。
def arg_printer(a, b, option=True, **kwargs):
print(a, b)
print(option)
print(kwargs)
arg_printer(3, 4, param1=5, param2=6)
3 4
True
{'param1': 5, 'param2': 6}
示例6
我们在函数中可以同时使用 *args 和 **kwargs,但 *args 必须放在 **kwargs 之前。
def arg_printer(a, b, *args, option=True, **kwargs):
print(a, b)
print(args)
print(option)
print(kwargs)
arg_printer(1, 4, 6, 5, param1=5, param2=6)
1 4
(6, 5)
True
{'param1': 5, 'param2': 6}
示例7
我们可以使用 *args 和 **kwargs 打包和解包变量。
def arg_printer(*args):
print(args)
如果我们将列表传递给上面的函数,它将作为单个元素存储在 args 元组中。
lst = [1,4,5]
arg_printer(lst)
([1, 4, 5],)
如果我们在 lst 之前放一个星号,列表中的值将解压缩并单独存储在 args 元组中。
lst = [1,4,5]
arg_printer(*lst)
(1, 4, 5)
示例8
我们可以通过多个可操作项与单个元素一起解包。所有值都将存储在 args 元组中,这一招有时非常有用的。
lst = [1,4,5]
tpl = ('a','b',4)
arg_printer(*lst, *tpl, 5, 6)
(1, 4, 5, 'a', 'b', 4, 5, 6)
示例9
我们也可以使用关键字参数进行打包和解包。
def arg_printer(**kwargs):
print(kwargs)
但作为关键字参数传递的可执行参数必须是映射(如字典)
dct = {'param1':5, 'param2':8}
arg_printer(**dct)
{'param1': 5, 'param2': 8}
示例10
如果我们还将其他关键字参数与字典一起传递,将它们组合并存储在 kwargs 字典中。
dct = {'param1':5, 'param2':8}
arg_printer(param3=9, **dct)
{'param3': 9, 'param1': 5, 'param2': 8}
总结
通过上述 10 个示例的讲解,相信大家对*args 和 **kwargs 有了一定程度的理解。喜欢欢迎收藏、分享。
技术交流
欢迎转载、收藏本文,码字不易,有所收获点赞支持一下!
为方便进行学习交流,本号开通了技术交流群,添加方式如下:
直接添加小助手微信号:pythoner666,备注:CSDN+python,或者按照如下方式添加均可!