Python の else の詳細な紹介

高洛峰
高洛峰オリジナル
2017-03-04 16:05:282265ブラウズ

Python での else の基本的な使用法は、条件制御ステートメントでの if...elif...else... であることは誰もが知っていますが、else には他にも 2 つの用途があります。1 つはループの終わりで、もう 1 つは Itエラー処理の try で使用されます。これはもともと Python の標準構文でしたが、他のほとんどのプログラミング言語の習慣とは異なるため、人々は意図的または非意図的にこれらの使用法を無視してきました。さらに、これらの使用法が 0×00 The Zen of Python の原則と一致しているかどうか、また広く使用されるべきかどうかについては多くの論争があります。たとえば、私が見た 2 冊の本 (Effective Python VS Write Idiomatic Python) では、2 人の著者がそれに対してまったく異なる態度をとっていました。

ループ内のelse

ループに続くelseステートメントは、ループ内にブレークがない場合、つまり通常のループが完了した場合にのみ実行されます。まず、挿入ソートの例を見てみましょう:

from random import randrange
def insertion_sort(seq):
  if len(seq) 1:
    return seq
  _sorted = seq[:1]
  for i in seq[1:]:
    inserted = False
    for j in range(len(_sorted)):
      if i _sorted[j]:
        _sorted = [*_sorted[:j], i, *_sorted[j:]]
        inserted = True
        break
    if not inserted:
      _sorted.append(i)
  return _sorted
 
print(insertion_sort([randrange(1, 100) for i in range(10)]))

[8, 12, 12, 34, 38, 68, 72, 78, 84, 90]

この例では、ソートされた _sorted 要素が 1 つずつ i と比較され、i がソートされたすべての要素より大きい場合、最後にのみ比較されます。ソートされたリスト。現時点では、トラバーサル ループが完了したか途中で中断したかをマークするために追加の状態変数を挿入する必要があります。この場合、この状態変数を else に置き換えることができます。これは非常に素晴らしいアプローチだと思います。 !ただし、break は後続の else ステートメントをトリガーできることに加えて、ループがない場合にも発生することに注意してください。 ...finally process 制御構文は、発生する可能性のある例外をキャッチし、それに応じて処理するために使用されます。 Except は、エラーが発生しない状況を処理するために使用されます。 try ステートメントは、関係なく実行されます。これは簡単な例で説明できます:

def insertion_sort(seq):
  if len(seq) 1:
    return seq
  _sorted = seq[:1]
  for i in seq[1:]:
    for j in range(len(_sorted)):
      if i _sorted[j]:
        _sorted = [*_sorted[:j], i, *_sorted[j:]]
        break
    else:
      _sorted.append(i)
  return _sorted
print(insertion_sort([randrange(1, 100) for i in range(10)]))

[1, 10, 27, 32, 32, 43, 50, 55, 80, 94]

while False:
  print("Will never print!")
else:
  print("Loop failed!")


Loop failed!

もちろん、状態変数を使用して else を置き換えることもできます:

def pide(x, y):
  try:
    result = x / y
  except ZeropisionError:
    print("pision by 0!")
  else:
    print("result = {}".format(result))
  finally:
    print("pide finished!")
pide(5,2)
print("*"*20)
pide(5,0)


りー

まとめ

これらの else の使用法は直観に反しているか、明示的ではなく暗黙的であり、推奨する価値がないと考える人もいます。ただし、この「判断」は特定のアプリケーションのシナリオと Python の理解に依存すると思います。明示的であるために必ずしも初心者に優しい構文である必要はありません。もちろん、この構文をどこでも使用することはお勧めできません。for/while...else の最大の欠点は、else を for/file と一致させる必要があることです。複数のレベルのネストまたはループがある場合、非常に不快になります。ボディが長すぎるので、他のものを使用するのが適切です(ノギスの話を思い出してください:P)。いくつかの短いループ制御ステートメントでのみ、else を使用していくつかの面倒な状態変数を削除します。これは最も Python らしいアプリケーション シナリオです。

Python の else の詳細な紹介と関連記事については、PHP 中国語 Web サイトに注目してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。