根据另一个参数的值设置一个参数的默认值
Sets the default value of a parameter based on the value of another parameter
所以我想创建一个函数,生成从 'start' 到 'end' 与 'size' 一样多的连续数字。对于迭代,它将在函数内部计算。但是我在设置参数 'end' 的默认值时遇到问题。在我进一步解释之前,这里是代码:
# Look at this -------------------------------
# ||
# \/
def consecutive_generator(size=20, start=0, end=(size+start)):
i = start
iteration = (end-start)/size
arr = []
temp_size = 0
while temp_size < size:
arr.append(i)
i += iteration
temp_size += 1
return arr
# with default end, so the 'end' parameter will be 11
c1= consecutive_generator(10, start=1)
print(c1)
# with end set
c2= consecutive_generator(10, end=20)
print(c2)
上面可以看出(关于'end'参数的默认值),我要实现的是'end'参数,默认值为'start' + 'size'参数(那么迭代次数为1)
输出肯定是错误的。那我该怎么做呢? (这是我第一次在 Whosebug 上提问,如果我弄错了请见谅)
这是一个非常标准的模式:
def consecutive_generator(size=20, start=0, end=None):
if end is None:
end = size + start
根据Python的document,
Default parameter values are evaluated from left to right when the function definition is executed.
所以参数的默认值无法从函数调用时传递的其他动态值中计算出来。
您应该使用 None
等可区分的值作为默认值。然后您可以检查它并动态评估适当的默认值。例如,
def consecutive_generator(size=20, start=0, end=None):
if end is None:
end = size + start
...
如果你需要None
作为调用方传递的有效值,你可以使用其他对象或其他东西来区分有效值。
default_end = object()
def consecutive_generator(size=20, start=0, end=default_end):
if end is default_end:
end = size + start
...
默认方式如 Samwise 所说,但有一个替代解决方案可能同样有效。
def consecutive_generator(size=20, start=0, **kwargs):
end = kwargs.get('end', size+start)
此方法允许您在 end 存在时获取它,或者在它不存在时简单地设置 end 的值。
要调用它,如果您想将其设置为默认值以外的参数,则此方法确实要求函数调用具有指定的参数 end
。
consecutive_generator(20, 0, end=50)
也许可以考虑查看 range and numpy.linspace
的文档
所以我想创建一个函数,生成从 'start' 到 'end' 与 'size' 一样多的连续数字。对于迭代,它将在函数内部计算。但是我在设置参数 'end' 的默认值时遇到问题。在我进一步解释之前,这里是代码:
# Look at this -------------------------------
# ||
# \/
def consecutive_generator(size=20, start=0, end=(size+start)):
i = start
iteration = (end-start)/size
arr = []
temp_size = 0
while temp_size < size:
arr.append(i)
i += iteration
temp_size += 1
return arr
# with default end, so the 'end' parameter will be 11
c1= consecutive_generator(10, start=1)
print(c1)
# with end set
c2= consecutive_generator(10, end=20)
print(c2)
上面可以看出(关于'end'参数的默认值),我要实现的是'end'参数,默认值为'start' + 'size'参数(那么迭代次数为1)
输出肯定是错误的。那我该怎么做呢? (这是我第一次在 Whosebug 上提问,如果我弄错了请见谅)
这是一个非常标准的模式:
def consecutive_generator(size=20, start=0, end=None):
if end is None:
end = size + start
根据Python的document,
Default parameter values are evaluated from left to right when the function definition is executed.
所以参数的默认值无法从函数调用时传递的其他动态值中计算出来。
您应该使用 None
等可区分的值作为默认值。然后您可以检查它并动态评估适当的默认值。例如,
def consecutive_generator(size=20, start=0, end=None):
if end is None:
end = size + start
...
如果你需要None
作为调用方传递的有效值,你可以使用其他对象或其他东西来区分有效值。
default_end = object()
def consecutive_generator(size=20, start=0, end=default_end):
if end is default_end:
end = size + start
...
默认方式如 Samwise 所说,但有一个替代解决方案可能同样有效。
def consecutive_generator(size=20, start=0, **kwargs):
end = kwargs.get('end', size+start)
此方法允许您在 end 存在时获取它,或者在它不存在时简单地设置 end 的值。
要调用它,如果您想将其设置为默认值以外的参数,则此方法确实要求函数调用具有指定的参数 end
。
consecutive_generator(20, 0, end=50)
也许可以考虑查看 range and numpy.linspace
的文档