nonlocal只能应用于具有嵌套范围的函数。当你在另一个函数中定义你的函数时,你只会得到一个嵌套范围。
Python 没有块作用域;for循环不会创建新范围,因此您不需要在循环中使用nonlocal。您的变量在函数的其余部分都可用。完全放弃这些nonlocal陈述:
def min_diff(arry_):
max_ = 0
temp_ = 0
for i in arry_:
if i > max_:
temp_ = max_
max_ = i
return max_ - temp_
在 Python 中,只有函数、类定义和推导(list、set 和 dict 推导以及生成器表达式)拥有自己的作用域,并且只有函数才能充当闭包(非局部变量)的父作用域。
您的代码中还有一个错误;如果您传入一个列表,其中第一个值也是列表中的最大值,temp_则设置为0然后永远不会更改。在这种情况下,您永远不会找到第二高的值,因为只有第一个i才是if i > max_:正确的。您还需要测试是否i大于temp_这种情况:
def min_diff(arry_):
max_ = 0
temp_ = 0
for i in arry_:
if i > max_:
temp_ = max_
max_ = i
elif i > temp_:
temp_ = i
return max_ - temp_
附带说明:您不需要在局部变量中使用尾随下划线。在所有使用的本地名称中,仅max_可能会隐藏内置max()函数,但由于您根本不使用该函数,因此在函数中使用max_而max不是实际上并不是必需的。我个人会_从函数中的所有名称中删除所有尾随下划线。我也会使用不同的名称;也许highest和secondhighest。
最后但并非最不重要的一点是,您可以使用该heapq.nlargest()函数有效地获取这两个最大值:
from heapq import nlargest
def min_diff(values):
highest, secondhighest = nlargest(2, values)
return highest - secondhighest
你可能想在那里添加一些长度检查;如果len(values) < 2是真的,应该发生什么?