1
def min_diff(arry_):
   max_ =0
   temp_ =0
   for i in arry_:
     nonlocal max_
     nonlocal temp_
     if i > max_:
        nonlocal max_
        nonlocal temp_
        temp_ = max_
        max_ =i
   return max_-temp_

我想在循环外使用max_,但出现错误temp_

SyntaxError: no binding for nonlocal 'max_' found
4

1 回答 1

3

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不是实际上并不是必需的。我个人会_从函数中的所有名称中删除所有尾随下划线。我也会使用不同的名称;也许highestsecondhighest

最后但并非最不重要的一点是,您可以使用该heapq.nlargest()函数有效地获取这两个最大值:

from heapq import nlargest

def min_diff(values):
    highest, secondhighest = nlargest(2, values)
    return highest - secondhighest

你可能想在那里添加一些长度检查;如果len(values) < 2是真的,应该发生什么?

于 2016-11-08T08:20:27.140 回答