Python 默认参数分配列表长度
Python default parameter assigning length of list
我收到一条错误消息,指出 p2 的 arr 未定义。如果我将 p2 = len(arr) - 1 表达式移动到函数内部,错误就会消失。为什么会出现此错误以及如何使此默认参数表达式起作用?
def sumZero_refactor(arr, p1 = 0, p2 = len(arr) -1):
NameError: name 'arr' is not defined
def sumZero_refactor(arr, p1 = 0, p2 = len(arr) -1):
while p1 < p2:
if arr[p1] + arr[p2] == 0:
return [arr[p1], arr[p2]]
elif arr[p1] + arr[p2] < 0:
p1 += 1
else:
p2 -= 1
print(sumZero_refactor([-3, -2, -1, 0, 1, 2, 3]))
print(sumZero_refactor([-2, 0, 1, 3]))
print(sumZero_refactor([1, 2, 3]))
print(sumZero_refactor([-8, -7, -5, -2, 0, 1, 2, 3, 4, 5, 6]))
某些语言,例如 Ruby,允许参数列表引用以前命名的参数。不幸的是,Python 没有。
您必须在函数体内添加 p2 = len(arr) - 1
。
您不能使用参数 arr 然后将 arr 作为 p2 变量,因为 arr 尚未完全定义。
更正后的代码:
def sumZero_refactor(arr, p1 = 0, p2 = None):
if p2 is None:
p2 = len(arr) - 1
while p1 < p2:
if arr[p1] + arr[p2] == 0:
return [arr[p1], arr[p2]]
elif arr[p1] + arr[p2] < 0:
p1 += 1
else:
p2 -= 1
你可以这样做:
def sumZero_refactor(arr, p1 = 0, p2 = None):
if p2 == None:
p2 = len(arr) - 1
while p1 < p2:
if arr[p1] + arr[p2] == 0:
return [arr[p1], arr[p2]]
elif arr[p1] + arr[p2] < 0:
p1 += 1
else:
p2 -= 1
print(sumZero_refactor([-3, -2, -1, 0, 1, 2, 3]))
print(sumZero_refactor([-2, 0, 1, 3]))
print(sumZero_refactor([1, 2, 3]))
print(sumZero_refactor([-8, -7, -5, -2, 0, 1, 2, 3, 4, 5, 6]))
这是因为 arr
尚未定义。但是,在函数代码内部定义了 arr
。
您必须在真正问题所在的参数列表之外定义 arr。您可以将 arr 的长度作为参数传递,而不是在参数列表中查找 arr 的长度。
当仅定义函数且每次调用使用相同的“预计算”值时,默认参数从左到右执行。
即使你在没有长度函数的情况下传递“arr”,你也会看到错误,因为 arr 是
函数定义时未定义。
def sumZero_refactor(arr, p1 = 0, p2 = arr):
pass
您可以使用“None”并显式测试该值是否作为参数传递。
def sumZero_refactor(arr, p1 = 0,p2 = None):
if p2 is None:
p2 = len(arr) - 1
while p1 < p2:
if arr[p1] + arr[p2] == 0:
return [arr[p1], arr[p2]]
elif arr[p1] + arr[p2] < 0:
p1 += 1
else:
p2 -= 1
Python 参考 - https://docs.python.org/3/reference/compound_stmts.html#function-definitions
我收到一条错误消息,指出 p2 的 arr 未定义。如果我将 p2 = len(arr) - 1 表达式移动到函数内部,错误就会消失。为什么会出现此错误以及如何使此默认参数表达式起作用?
def sumZero_refactor(arr, p1 = 0, p2 = len(arr) -1):
NameError: name 'arr' is not defined
def sumZero_refactor(arr, p1 = 0, p2 = len(arr) -1):
while p1 < p2:
if arr[p1] + arr[p2] == 0:
return [arr[p1], arr[p2]]
elif arr[p1] + arr[p2] < 0:
p1 += 1
else:
p2 -= 1
print(sumZero_refactor([-3, -2, -1, 0, 1, 2, 3]))
print(sumZero_refactor([-2, 0, 1, 3]))
print(sumZero_refactor([1, 2, 3]))
print(sumZero_refactor([-8, -7, -5, -2, 0, 1, 2, 3, 4, 5, 6]))
某些语言,例如 Ruby,允许参数列表引用以前命名的参数。不幸的是,Python 没有。
您必须在函数体内添加 p2 = len(arr) - 1
。
您不能使用参数 arr 然后将 arr 作为 p2 变量,因为 arr 尚未完全定义。
更正后的代码:
def sumZero_refactor(arr, p1 = 0, p2 = None):
if p2 is None:
p2 = len(arr) - 1
while p1 < p2:
if arr[p1] + arr[p2] == 0:
return [arr[p1], arr[p2]]
elif arr[p1] + arr[p2] < 0:
p1 += 1
else:
p2 -= 1
你可以这样做:
def sumZero_refactor(arr, p1 = 0, p2 = None):
if p2 == None:
p2 = len(arr) - 1
while p1 < p2:
if arr[p1] + arr[p2] == 0:
return [arr[p1], arr[p2]]
elif arr[p1] + arr[p2] < 0:
p1 += 1
else:
p2 -= 1
print(sumZero_refactor([-3, -2, -1, 0, 1, 2, 3]))
print(sumZero_refactor([-2, 0, 1, 3]))
print(sumZero_refactor([1, 2, 3]))
print(sumZero_refactor([-8, -7, -5, -2, 0, 1, 2, 3, 4, 5, 6]))
这是因为 arr
尚未定义。但是,在函数代码内部定义了 arr
。
您必须在真正问题所在的参数列表之外定义 arr。您可以将 arr 的长度作为参数传递,而不是在参数列表中查找 arr 的长度。
当仅定义函数且每次调用使用相同的“预计算”值时,默认参数从左到右执行。
即使你在没有长度函数的情况下传递“arr”,你也会看到错误,因为 arr 是 函数定义时未定义。
def sumZero_refactor(arr, p1 = 0, p2 = arr):
pass
您可以使用“None”并显式测试该值是否作为参数传递。
def sumZero_refactor(arr, p1 = 0,p2 = None):
if p2 is None:
p2 = len(arr) - 1
while p1 < p2:
if arr[p1] + arr[p2] == 0:
return [arr[p1], arr[p2]]
elif arr[p1] + arr[p2] < 0:
p1 += 1
else:
p2 -= 1
Python 参考 - https://docs.python.org/3/reference/compound_stmts.html#function-definitions