在Python的一些API中,我们可能会见到一些这样的操作符:
def func(pos1, pos2, /, pos_or_kwd, *, kwd1, kwd2): ...
其中的/
、*
和...
分别是什么含义呢?
从python3.8
开始,函数参数中允许出现/
和*
符号,/
用来指明某些函数形参必须使用位置参数而非关键字参数的形式,*
出现在函数参数中第一种含义可以表示为可变参数,一般写作*args
;对于单独出现在参数中的*
参数,则表示*
后面的参数必须为关键字参数的形式,接下来详细解释一下该用法
按照Python3.8
官网描述:
def func(pos1, pos2, /, pos_or_kwd, *, kwd1, kwd2): ...
----------- ----------- ----------
| | |
| Positional or keyword |
| Keyword only
Positional only
官方的解释是这样的:
/
和*
是可选的/
和*
之间的是位置或关键字参数(Positional-or-Keyword Parameter),即参数可以通过位置参数的形式参入函数,也可以通过关键字的形式传入函数*
后面的参数是仅关键字参数(Keyword-Only Parameter),即只能通过关键字传入参数总结就是:
/
符号之前的所有参数,都必须以位置参数穿参,不能使用关键字参数传参*
符号之后的所有参数,都必须以关键字方式传参,不能使用位置参数传参/
与*
符号之间的所有参数,既能使用关键字方式传参,也能使用位置参数传参示例如下:
def f1(p1, p2, /, pk, *, k1, k2):
print(p1 + p2 + pk + k1 + k2)
f1(2, 3, pk=1, k1=5, k2=4) # 15
f1(2, 3, 1, k1=5, k2=4) # 15
那这样写呢?
def f2(p1, p2, *, pk, /, k1, k2):
print(p1 + p2 + pk + k1 + k2)
值得注意的是,Python不支持该写法(*在/前
),虽然方法本身不会报错,但函数还没调用就会执行报错:SyntaxError: invalid syntax
*
操作的本质是对可迭代对象的解包
什么是Python打包与解包呢?
# 打包
scores = 80, 90, 900, 120
# 解包:被解包的序列中的元素数量必须与赋值符号=左边元素的数量完全一样
a, *b, c = scores
print(a, b, c) # 80 [90, 900] 120
# 打包
scores = [80, 90]
# 解包:不能将*操作符用于表达式的右边
x, y = scores # 80 90
print(x, y)
打包其实就是多个对象的可迭代集合
解包即就是将可迭代集合拆分成多个对象,并保证拆分前后的数量
例如,我们常见的函数可变参数:*args
和**kwargs
:
*args
将多个参数打包成一个元组**kwargs
将多个K-V参数打包成一个字典操作符...
表示函数没有实现任何代码,跟pass作用类似
def m(): ...
# 等价于
def n(): pass