def f(pos1, pos2, /, pos_or_kwd, *, kwd1, kwd2):
pos1 和pos2只能以位置的形式传参,而不能以关键字的形式传参。
pos_or_kwd可以以位置和关键字的形式传参
kwd1和kwd2只能以关键字的形式传参
(1)关键字参数只能用于实参,为什么在上面的定义函数的形参里的kward1,kward2却是关键字参数?
(2)请问是有了“/” 和“*”来分隔位置和关键字,位置和关键字设置的个数就没有限制吗?
(3)位置参数和关键字参数的设置具体有哪些限制?
该回答引用GPTᴼᴾᴱᴺᴬᴵ
对于非关键字参数,确实只能通过位置传递值。如果尝试使用关键字语法传递非关键字参数,将会触发一个语法错误。
参数的个数没有特定的限制,但是对于每个函数,非关键字参数必须在关键字参数之前,所以可以使用“/”来表示非关键字参数的结尾,使用“*”来表示关键字参数的开始。
在使用“/”和“*”语法之后,其前面的参数都将是位置参数,其后面的参数都将是关键字参数。除此之外,还需要注意以下几点:
以下是一个示例函数,说明了如何使用“/”和“*”来定义参数:
def foo(a, b, /, c, d=0, *, e, f=1):
print(a, b, c, d, e, f)
在这个例子中,参数“a”和“b”是位置参数,参数“c”是既可以作为位置参数,也可以作为关键字参数使用的参数,“d”是关键字参数,并有一个默认值,而“e”是关键字参数,必须在函数调用时指定。最后,“f”也是关键字参数,并有一个默认值。
参考GPT和自己的思路:
对于非关键字参数,可以通过位置传递实参,也可以通过默认值指定形参的默认值。但是在调用函数时,非关键字参数只能以实参的形式传递,不能以关键字的形式传递。
有了“/”和“”来分隔位置和关键字之后,并不是说位置和关键字的设置就没有限制了。在这个例子中,pos1和pos2只能以位置的形式传参,pos_or_kwd可以以位置和关键字的形式传参,而kwd1和kwd2只能以关键字的形式传参。这些限制是由函数定义时的参数列表决定的,而不是由“/”和“”决定的。
通常来说,函数定义时的参数列表中可以包含如下类型的参数:
在定义函数时,位置参数必须在默认参数之前,可变位置参数和关键字参数之间必须有“/”分隔符,可变关键字参数必须在关键字参数之后。使用这些规则能够限制参数的设置,避免出现冲突。
def func(args, *args, **kwargs): -> None
args: 实参
*args:可变参数
**kwagrs:字典类型的参数
说了半天其实都是同一个问题
就是你根本没明白什么叫位置参数,什么叫名称参数
你自己写段代码执行一下就知道到底有什么区别了,不要总纸上谈兵