* 和 **

参数列表中 *args 和 **kwargs 表示可变长的参数,前者是一个元组,后者是一个词典

# 输出:
# <class 'tuple'>
# <class 'dict'>

def func(*args, **kwargs):
    print(type(args))
    print(type(kwargs))
    
if __name__ == '__main__':
    func()

使用

就像使用元组和词典一样去使用

# 输出:
# foo
# 100
# ('age', '18')
# ('name', 'Tim')

def func(*args, **kwargs):
    for item in args:
        print(item)
    for item in kwargs.items():
        print(item)
        
if __name__ == '__main__':
    func('foo', 100, name='Tim', age='18')

传参规则

  • 定义参数时要遵循这种顺序:(normal, default=d, *args, **kwargs)
  • 传递参数时:
    1. 在未指定名字的参数前,python从左到右匹配,覆盖默认值,多出来的值放在args中
    2. 一旦一个参数指定了名字,那么从这个参数之后的各个参数python不做顺序假设,因此它们都要加上名字——多出来的放在kwargs中,参数个数少了且没有默认值就发生调用错误
    3. 从第2个规则可知,args必须出现在有指定名字的参数前,但这又是矛盾的(指定名字的参数会发生多个值的错误),因此args和指定名字的参数是不容的

实际上把函数参数控制在2个以内(越少越好)是最好的编程习惯,规则主要为了理解别人写的函数




Zhu

有问题欢迎发邮件交流