学习python有点生疏,常言道,温故而知新。
一句话表示参数从左至右的依次顺序:位置形参 默认形参 *args 命名关键字参数 **kwargs
由于命名关键字参数的应用场景很少没所以没有示例。
但是我们很少会将上述的顺序全部使用到,所以这里所列了几种常见的函数搭配的顺序。
01 位置形参与默认形参混用 ==> 位置形参在左,默认形参在右
def tell(a, b, c, d=1, e=2, f=3): """这里面, a、b、c时位置形参, d、e、f是默认形参, 它们各自的内部都是调换顺序的. 譬如位置形参也可以写成b, a, c等等(但是它们都一定位于任一一个默认形参的左侧), 同理默认实参内部也是可以随意调换顺序的(这取决于你的需要), 但是也一定位于任意一个 位置形参的左侧。既不能出现d=1, a, b, c, e=2, f=3这种默认形参在左而位置形参在右侧 的情况。 """ print('位置形参:', a, b, c) print('默认形参', d, e, f) tell('位置实参a', '位置实参b', '位置实参c', e=222) """注意, 调用函数传参时也需要注意顺序, 位置传参必须在关键字传参的左侧或者说前面"""
输出展示:
另外多说一下, 默认形参的值在函数定义阶段就被赋值了,准确一点说应该是被赋予了值的内存地址。(推荐默认参数的值应该是不可变类型)
01 可变长度的位置形参*args 和可变长度的关键字形参**kwargs的混用 ==> *args在左, **kwargs在右
这种参数我使用比较多的都是二者结合使用,并且我比较多用于装饰器。
def tell(*args, **kwargs): """args用于接收溢出的位置实参, (元组形式) kwargs用于接收溢出的关键字实参, (字典形式)""" print('可变长度的位置形参:', args) print('可变长度的关键字形参:', kwargs) tell(1, 2, 3, '你好', '再见', name='hour', age=19, girlfriend=None)
输出展示:
03 位置形参-默认形参-可变长度的位置形参和关键字形参
顺序即上面所写的从左至右顺序一样。
def tell(a1, a2, b1='me', b2='you', *args, **kwargs): """ 上述a1、a2均为位置形参,必须要在默认形参的前面。 b1 """ print('位置形参:', a1, a2) print('默认形参:', b1, b2) print('可变长度的位置形参:', args) # 用于接收多出来的位置实参 print('可变长度的关键字形参:', kwargs) # 用于接收多出来的关键字实参 tell('位置实参a1', '位置实参a2', '默认实参b1', '默认实参b2', '可变长度的位置形参1', '可变长度的位置形参2', '可变长度的位置形参3' , name='hour', age=19) """这里也有需要说明的, 进行传参时位置传参需要在关键字传参的前面, 不可以出现 <b1='默认实参1','无关键字实参3'>这种相反的情况 否则报错"""
输出展示:
如果需要加上命名关键字形参,那么其应该位于*args,**kwargs之间,而且*不需要添加,因为前面的*args中已经出现过*了。
至于其他的形参组合顺序类似的可以推出,总之按从左至右的顺序为:
位置形参 默认形参 *args 命名关键字参数 **kwargs