为什么我们需要在函数中的第二个参数之后初始化参数参数?

Why do we need to initialise argument parameters after the second one in a function?

我在 codewars 上做初学者套路,我对我们使用函数的方式感到困惑。

它有3个参数; a、b 和保证金。结果我们必须将 margin 初始化为 0 否则 Python 找不到它。但为什么我们不必初始化 a 或 b?

函数是close_margin(a, b, margin = 0): 为什么不close_margin(a = 0, b = 0, margin = 0):

完整代码如下:

def close_compare(a, b, margin):

    if margin == '':

        margin = 0

    if a < b:

        return -1

    if a > b:

        return 1

    difference = a - b

    if margin > difference or margin == difference:

        return 0

产生的错误代码是:

Traceback (most recent call last):
File "main.py", line 4, in <module>
test.assert_equals(close_compare(4, 5), -1)
TypeError: close_compare() missing 1 required positional argument: 'margin'

参数的主要用途是在调用函数时接受参数。但是,您可以在定义函数时 "initialize" 具有 default 值的参数。如果在调用时未提供参数,则将使用默认值,就好像您已明确提供它一样。

给出这样的定义

def foo(a, b, margin=0):
    ...

以下调用是相同的:

foo(3, 5)  # Use the default value of 0 for the third parameter
foo(3, 5, 0)  # Provide a value of 0 for the third parameter

但是,一个不相关的功能是提供 关键字 参数的能力,它允许您按名称而不是位置指定值。非关键字参数首先出现,并按照参数在定义中出现的顺序分配给参数。关键字参数可以以任何顺序出现。以下所有都是等价的:

# All positional arguments
foo(3, 5, 0)
# Two positional, one keyword
foo(3, 5, margin=0)
# One positional, two keyword
foo(3, b=5, margin=0)
foo(3, margin=0, b=5)
# No positional, all keyword
foo(a=3, b=5, margin=0)
foo(b=5, margin=0, a=3)
foo(a=3, margin=0, b=5)
foo(b=5, a=3, margin=0)
foo(margin=0, a=3, b=5)
foo(margin=0, b=5, a=3)