4年前我还在思否写博客的时候,用的Python3.6,当时问了这问题:
Python函数参数中的\
是什么意思?
https://segmentfault.com/q/1010000016198888
岁月是把杀猪刀啊,上次遇到这个问题还是4年前,哇哇哇
几天遇到这个问题,函数参数中的 * 是什么意思:
知乎上看到的一篇,写的很清楚
接下来全文转载自:
https://zhuanlan.zhihu.com/p/132521381
在python3.8之后函数参数中允许出现
/
和*
号,/
用来指明某些函数形参必须使用位置参数而非关键字参数的形式,*
出现在函数参数中第一种含义可以表示为可变参数,一般写作*args
;第二种含义可以表示关键字参数,一般写作**kwargs
;最为特殊的是单独出现在参数中的*
,它则表示,*
后面的参数必须为关键字参数的形式,接下来详细说下该用法。
1 /
参数的用法
如果你想要函数的调用者在某个参数位置只能使用位置参数而不能使用关键字参数传参,那么你只需要在所需位置后面放置一个/
。
def f1(a, b, /):
return a + b
对于上面这个函数而言,调用f1时参数a,b只能是特定的值,而不能以关键字传参,即f1(2, 3)
执行正确,而f1(a=2, 3)
和f1(2, b=3)
都将执行错误。
2 *
参数的用法
对于*
的第一种和第二种用法比较常见,这里不再详述,这里主要详细解释*
的第三种用法。如果你希望强迫调用者使用某些参数,且必须以关键字参数的形式传参,那么你只需要在所需位置的前一个位置放置一个*
。
def f1(a, *, b, c):
return a + b + c
对于上面这个函数而言,调用时参数a
可以任意值, 但b,c
参数一定要以关键字参数的形式传参,如f1(1, b=4, c=5)
,否则将会报错。
def f2(a, *, b, c=5):
return a + b + c
如果是这种情况下调用函数,参数a可以任意值,但参数b一定要以关键字参数的形式传参,如f2(2, b=3)
,但是如果想传入c
参数,那么c
参数的要求和b
参数一样都为关键字参数形式,如f2(2,b=3,c=4)
。
3 /
和*
都出现在函数参数中
比如我们定义一个函数f
def f(a, b, /, c, *, d, e):
print(a, b, c, d, e)
当我们调用函数f时,a,b
参数可以为任意型python所支持的值,就是不能以关键字形式传参;c
可以为任意型python所支持的值,d,e
只能以关键字参数传参。以下调用方式均会抛出异常
f(a=1, 2, c=3, d=4, e=5) # a不能以关键字参数传参
f(1, 2, 3, 4, e=5) # d只能以关键字参数传参
4 总结
如果你希望调用者使用函数时一定不能使用关键字参数传参,那么只需要把这些参数放在/
前即可;如果你希望调用者使用函数时一定要使用某些参数,那么只需要把这些参数放在*
后面即可。