在定义函数的时候,有时候会遇到参数比较多或者不确定参数名的情况。这个时候就可以使用可变参数。


可变参数的形式有

*args  : 元组类型参数

**kwargs :字典类型参数

 args和kwargs的参数是自定义的。主要是前面的操作符不能少!


比如看一个简单的常规例子



def fun(name, age):    print(name)    print(age)if __name__ == '__main__':    fun('tom', 19)    # fun('lily')  # TypeError: fun() missing 1 required positional argument: 'age'
    print(name)
    print(age)

if __name__ == '__main__':
    fun('tom', 19)
    # fun('lily')  # TypeError: fun() missing 1 required positional argument: 'age'


定义了一个fun函数,参数有name和age。当调用fun函数时,如果只传一个参数则会报TypeError的错误。


假设我们不光有name、age 还需要传参性别、爱好、职业、电话等参数。一个个写就显得比较繁琐。不够Pythonic。


*args

这样我们就可以通过列表类型的参数进行传递。




def fun_arr(name, *args):    print(name)    print(args)if __name__ == '__main__':    fun('tom', 19)    # fun('lily')  # TypeError: fun() missing 1 required positional argument: 'age'    fun_arr('tom')  # 输出 tom 、()    # tom    # (20, 'man', '篮球', 'pythoner', '17766666666')    fun_arr('tom', 20, 'man', '篮球', 'pythoner', '17766666666')
    print(name)
    print(args)

if __name__ == '__main__':
    fun('tom', 19)
    # fun('lily')  # TypeError: fun() missing 1 required positional argument: 'age'

    fun_arr('tom')  # 输出 tom 、()
    # tom
    # (20, 'man', '篮球', 'pythoner', '17766666666')
    fun_arr('tom', 20, 'man', '篮球', 'pythoner', '17766666666')


如上,参数 name 对应的是 tom。而args 则对应的是('tom', 20, 'man', '篮球', 'pythoner', '17766666666')。


**kwargs

字典类型参数,实例如下




def fun_dict(**kwargs):    # 循环打印字典的键和值    # name tom    # age 18    # mobile 17766666666    for k, v in kwargs.items():        print(k, v)    # 也可通过get的方式取参数的值    # my name is tom i'am 18 years old, my phone number is 17766666666    print("my name is %s i'am %s years old, my phone number is %s"          % (kwargs.get('name'), kwargs.get('age'), kwargs.get('mobile')))if __name__ == '__main__':    fun_dict(name='tom', age=18, mobile='17766666666')
    # 循环打印字典的键和值
    # name tom
    # age 18
    # mobile 17766666666
    for k, v in kwargs.items():
        print(k, v)
    # 也可通过get的方式取参数的值
    # my name is tom i'am 18 years old, my phone number is 17766666666
    print("my name is %s i'am %s years old, my phone number is %s"
          % (kwargs.get('name'), kwargs.get('age'), kwargs.get('mobile')))

if __name__ == '__main__':
    fun_dict(name='tom', age=18, mobile='17766666666')


补充:


可变参数允许多个任意参数,也允许不传参数。

两个可变参数同时存在是,一定要将 *参数 放在 **参数 之前!!!否则编译错误。

通常情况下,都是将可变参数写在最后面


如果写在前面则会将后面的参数也会收集到列表中。如果将可变参数写在前面,则需要指定后面的参数名

如下




def fun_arr(*args, name):    print(name)    print(args)if __name__ == '__main__':    # 如下写法 则会报错    # TypeError: fun_arr() missing 1 required keyword-only argument: 'name'    fun_arr(20, 'man', '篮球', 'pythoner', '17766666666', 'tom')    # 正确的写法    fun_arr(20, 'man', '篮球', 'pythoner', '17766666666', name='tome')
    print(name)
    print(args)

if __name__ == '__main__':
    # 如下写法 则会报错
    # TypeError: fun_arr() missing 1 required keyword-only argument: 'name'
    fun_arr(20, 'man', '篮球', 'pythoner', '17766666666', 'tom')

    # 正确的写法
    fun_arr(20, 'man', '篮球', 'pythoner', '17766666666', name='tome')