https://www.cnblogs.com/aszeno/p/10384887.html
https://www.cnblogs.com/aszeno/p/10386149.html
链接中的文章讲的比较详细,简单概括一下:
1. 位置参数
函数调用时必须指定。 可以直接函数调用时给相应的位置赋值,或者通过关键字指定。 必须有实参。
2. 默认参数
在函数定义时已经指定了default 值。函数调用时可以不给这个参数赋值。
函数定义时所有的默认参数都必须在位置参数之后。
3. 关键字参数
这是指函数调用时指定了形参名字和实参值。即函数调用是通过argx=xxx 的形式给出。
4. 可变长度参数(参数组)
在函数定义时:
*args 表示tuple 类型参数组。 但不表示调用时的参数为tuple, 只是表示调用时的参数格式为 argx,argy
**kwargs 表示字典类型参数组。但不表示调用时的参数要为dict. 只是表示调用时参数格式为 argx=xx,argy=yy
函数调用时,
如果实参是tuple ,要将tuple 中的item 变成函数的可变参数,那么需要在tuple 前面加上*
如果实参是dict, 要将dict 中的item 变成函数的关键字参数,那么需要在dict 前面加上**
也就是说可变参数在调用时有两种方式:
可变参数既可以直接传入:func(1, 2, 3),又可以先组装list或tuple,再通过*args传入:func(*(1, 2, 3));
关键字参数既可以直接传入:func(a=1, b=2),又可以先组装dict,再通过**kw传入:func(**{'a': 1, 'b': 2})。
注意:
函数定义时,可变长度参数必须在位置参数和默认参数之后。且字典类型的参数组必须是最后一个。
5. 列表/元组/字典 可以作为函数的参数(因为他们都是对象,对象可以作为单个变量传递给函数的)
当他们作为函数参数的时候 只能表示 函数的一个参数,而不是一组参数。在函数中可以对列表和字典的值进行修改。而且这种修改会让输入变量的值永久改变。
如果要禁止函数修改列表的值:
#禁止函数修改列表 print_models(unprinted_designs[:],completed_models)