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
是真的,应该发生什么?