gpt4 book ai didi

python - 尝试在 for 循环之外使用变量会出现 SyntaxError : no binding for nonlocal 'max_' found

转载 作者:行者123 更新时间:2023-11-30 22:47:35 25 4
gpt4 key购买 nike

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

最佳答案

nonlocal只能应用于具有嵌套作用域的函数。只有当您在另一个函数内部定义函数时,您才会获得嵌套作用域。

Python 没有 block 作用域; 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中,只有函数、类定义和推导式(列表、集合和字典推导式以及生成器表达式)拥有自己的作用域,并且只有函数可以充当闭包(非局部变量)的父作用域。

您的代码中还存在一个错误;如果您传入一个列表,其中第一个值也是列表中的最大值,temp_设置为0然后永远不会改变。在这种情况下,您将永远找不到第二高的值,因为仅针对第一个 iif 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() function有效地获得这两个最大值:

from heapq import nlargest

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

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

关于python - 尝试在 for 循环之外使用变量会出现 SyntaxError : no binding for nonlocal 'max_' found,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40481972/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com