为什么我们需要在函数中的第二个参数之后初始化参数参数?
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)
我在 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)