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

Python 为什么我们需要在函数中的第二个参数之后初始化参数?,python,arguments,optional,Python,Arguments,Optional,我正在做关于代码战争的初学者Kata,我对我们使用函数的方式感到困惑 它有3个论点;a、 b和保证金。事实证明,我们必须将margin初始化为0,否则Python无法找到它。但是为什么我们不必初始化a或b呢 函数是close\u margin(a,b,margin=0): 为什么不关闭页边空白(a=0,b=0,页边空白=0): 完整代码如下: def close_compare(a, b, margin): if margin == '': margin = 0

我正在做关于代码战争的初学者Kata,我对我们使用函数的方式感到困惑

它有3个论点;a、 b和保证金。事实证明,我们必须将margin初始化为0,否则Python无法找到它。但是为什么我们不必初始化a或b呢

函数是
close\u margin(a,b,margin=0):
为什么不关闭页边空白(a=0,b=0,页边空白=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
def close_比较(a、b、边距):
如果边距=“”:
保证金=0
如果ab:
返回1
差=a-b
如果保证金>差额或保证金==差额:
返回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'
回溯(最近一次呼叫最后一次):
文件“main.py”,第4行,在
test.assert_equals(close_compare(4,5),-1)
TypeError:close_compare()缺少1个必需的位置参数:“边距”

参数的主要用途是在调用函数时接受参数。但是,在定义函数时,可以使用默认值“初始化”参数。如果在调用时未提供参数,则将使用默认值,就像您显式提供了它一样

给出了这样的定义

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)

如果不想初始化,则不必初始化任何参数。可以简单到
关闭\u边距(a、b、边距)
。但我猜在这种情况下,函数希望使用
0
作为
margin
的默认值。这真的取决于你的函数在做什么。请提供实际的代码和错误信息。这个问题应该可以消除正常参数和关键字参数之间的差异:非常感谢可能重复。这很有帮助:)