python函数参数那些事,关键字参数与位置参数

在调用函数时传给 function(或 method)的值。参数分为两种:

关键字参数 :在函数调用中前面带有标识符(例如 name=)或者作为包含在前面带有 ** 的字典里的值传入。举例来说,3 和 5 在以下对 complex()的调用中均属于关键字参数:

complex(real=3, imag=5)
complex(**{'real': 3, 'imag': 5})

位置参数:不属于关键字参数的参数。位置参数可出现于参数列表的开头以及/或者作为前面带有 * 的 iterable里的元素被传入。举例来说,3 和 5 在以下调用中均属于位置参数:

complex(3, 5)
complex(*(3, 5))

规则:在函数调用中,关键字参数必须跟随在位置参数的后面。传递的所有关键字参数必须与函数接受的其中一个参数匹配,它们的顺序并不重要。这也包括非可选参数。不能对同一个参数多次赋值

以下是一些正确错误范例:

#函数定义
def test(arg1, arg2='hello', arg3='world', arg4='nice to meet you'):
    print(arg2, arg3, arg4)

#正确范例
test(1000)                                        # 1个位置参数
test(arg1=1000)                                   # 1个关键字参数
test(arg1=1000, arg2='VOOOOOM')                   # 2个关键字参数
test(arg2='VOOOOOM', arg1=1000)                   # 2个关键字参数
test('a million', 'bereft of life', 'jump')       # 3个位置参数
test('a thousand', arg2='pushing up the daisies') # 1个位置参数,1个关键字参数

#错误范例
test()                     # 缺少一个参数
test(voltage=5.0, 'dead')  # 非关键字参数在关键字参数后面
test(110, voltage=220)     # 一个参数传了多个值
test(arg5='John Cleese')   # 对不存在的参数传值

为了确保可读性和运行效率,我们可以对每个参数,使用限制允许的参数传递形式,这样开发者只需查看函数定义即可确定参数项是仅按位置、按位置也按关键字,还是仅按关键字传递。

方法就是用 / 和 * 作为分隔符,把三种传递方法的参数分隔开来。

def function(arg1, arg2, /, arg3, arg4, *, arg5, arg6):
    pass

如上的函数,arg1 和 arg2 是仅限位置参数,arg3 和 arg4 是位置或关键字参数都行,arg5 和 arg6 则是仅限关键字参数。

最后则是官方对于函数参数给出的指导:

  • 如果你希望形参名称对用户来说不可用,则使用仅限位置形参。 这适用于形参名称没有实际意义,以及当你希望强制规定调用时的参数顺序,或是需要同时收受一些位置形参和任意关键字形参等情况。

  • 形参名称有实际意义,以及显式指定形参名称可使函数定义更易理解,或者当你想要防止用户过于依赖传入参数的位置时,则使用仅限关键字形参

  • 对于 API 来说,使用仅限位置形参可以防止形参名称在未来被修改时造成破坏性的 API 变动。

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值