Python函数中的操作符:/、*、...



1、背景


在Python的一些API中,我们可能会见到一些这样的操作符:

def func(pos1, pos2, /, pos_or_kwd, *, kwd1, kwd2): ...

其中的/*...分别是什么含义呢?

2、Python新操作符:/与*


从python3.8开始,函数参数中允许出现/*符号,/用来指明某些函数形参必须使用位置参数而非关键字参数的形式,*出现在函数参数中第一种含义可以表示为可变参数,一般写作*args;对于单独出现在参数中的*参数,则表示*后面的参数必须为关键字参数的形式,接下来详细解释一下该用法

按照Python3.8官网描述:

def func(pos1, pos2, /, pos_or_kwd, *, kwd1, kwd2): ...
         -----------   -----------     ----------
           |                |               |
           |       Positional or keyword    |
           |                                Keyword only
           Positional only

官方的解释是这样的:

  • /*是可选的
  • /前面的参数都是仅位置参数(Positional-Only Parameter),即参数只能通过位置参数的形式传入函数,不能通过关键字的形式传入函数
  • /*之间的是位置或关键字参数(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

扫描二维码关注公众号,回复: 17247134 查看本文章

3、Python操作符:*(打包与解包)


*操作的本质是对可迭代对象的解包

什么是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参数打包成一个字典

4、Python新操作符:…


操作符...表示函数没有实现任何代码,跟pass作用类似

def m(): ...
# 等价于
def n(): pass

猜你喜欢

转载自blog.csdn.net/weixin_55629186/article/details/134737076