在看python的代码时,经常会看见函数定义的参数中有*和 **符号来表示变长的参数。它们分别代表什么呢?具体怎么操作呢?
默认的习惯写法为args 和 **kwargs, 先来看看args。
*args
*args表示一个变长的无关键字参数列表:
def test_var_args(f_arg, *argv):
print("first normal arg:", f_arg)
for arg in argv:
print("another arg through *argv:", arg)
test_var_args('python', 'eggs', 'test','today')
输出
first normal arg: python
another arg through *argv: eggs
another arg through *argv: test
another arg through *argv: today
**kwargs
**kwargs 传入变长的带关键字命名的参数列表:
def greet_me(**kwargs):
for key, value in kwargs.items():
print("{0} = {1}".format(key, value))
greet_me(name="yasoob", age=20,gender='female')
name = yasoob
age = 20
gender = female
使用 *args 和**kwargs调用函数
定义一个带有三个参数的函数:
def test_args_kwargs(arg1, arg2, arg3):
print("arg1:", arg1)
print("arg2:", arg2)
print("arg3:", arg3)
使用*args调用函数,args需是tuple类型
args = ("two", 3, 5)
test_args_kwargs(*args)
输出:
arg1: two
arg2: 3
arg3: 5
使用**kwargs调用函数,kwargs需是字典形式
kwargs = {"arg3": 3, "arg2": "two", "arg1": 5}
test_args_kwargs(**kwargs)
输出
arg1: 5
arg2: two
arg3: 3
使用情境
*arg 和 *args 比较常用的情境为装饰器(decorator),或者猴子补丁(mokey patch)。
关于猴子补丁,可以参考:猴子补丁(monkey patch)
这个叫法起源于Zope框架,大家在修正Zope的Bug的时候经常在程序后面追加更新部分,这些被称作是“杂牌军补丁(guerilla patch)”,后来guerilla就渐渐的写成了gorllia((猩猩),再后来就写了monkey(猴子),所以猴子补丁的叫法是这么莫名其妙的得来的。
猴子补丁主要有以下几个用处:
- 在运行时替换方法、属性等
- 在不修改第三方代码的情况下增加原来不支持的功能
- 在运行时为内存中的对象增加patch而不是在磁盘的源代码中增加
作者:d咚咚呛
链接:https://www.jianshu.com/p/f1060b22aab8
来源:简书
原文连接: