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 では、関数、クラス定義、および内包表記 (リスト、セット、辞書内包表記、およびジェネレーター式) のみが独自のスコープを取得し、クロージャー (非ローカル変数) の親スコープとして機能できるのは関数のみです。
コードにもバグがあります。最初の値がリストの最大値でもあるリストを渡すと、にtemp_
設定され、変更され0
ません。その場合、2 番目に高い値を見つけることはできません。これは、最初の値のみが true に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()
関数を使用してこれら 2 つの最大値を効率的に取得できます。
from heapq import nlargest
def min_diff(values):
highest, secondhighest = nlargest(2, values)
return highest - secondhighest
そこに長さのチェックを追加したい場合があります。len(values) < 2
真の場合、代わりに何が起こるべきですか?