Python の奇妙な &#else&#

Susan Sarandon
Susan Sarandonオリジナル
2025-01-03 03:32:391010ブラウズ

The Strange

条件文の Else

私たちは皆、条件文を書いたことがあり、おそらく少なくとも 1 度は完全な if-elif-else 構造を使用したことがあります。
たとえば、必要なブラウザーの Web ドライバー インスタンスを作成する場合:

browser = get_browser()
if browser == 'chrome':
    driver = Chrome()
elif browser == 'firefox':
    driver = Firefox()
else:
    raise ValueError('Browser not supported')

このスニペットは Chrome と Firefox でのテストをサポートしており、サポートされていないブラウザが提供された場合は例外を発生させます。

あまり知られていない事実ですが、Python はループと例外処理での else 句の使用をサポートしています。

それ以外の場合はループあり

単語のリストがあり、大文字で始まる限りそれらを出力したいとします。最後に、すべての単語が処理されたかどうかを確認し、処理された場合は特定のロジックを実行します。

フラグ変数 is_all_words_processed を使用し、無効な単語が見つかった場合は False に設定し、ループの外でチェックしてロジックを実行します。

seasons = ['Winter', 'Spring', 'Summer', 'Autumn']
is_all_words_processed = True
for season in seasons:
    if not season.istitle():
        is_all_words_processed = False
        break
    print(season)

if is_all_words_processed:
    print('All seasons were processed')

Python では、すべての単語が有効な場合のロジックを else 節に配置することで、追加の変数を回避できます。

seasons = ['Winter', 'Spring', 'Summer', 'Autumn']
for season in seasons:
    if not season.istitle():
        break
    print(season)
else:
    print('All seasons were processed')

else ブロックは、ループが中断せずに自然に完了した場合にのみ実行されます。ループが Break によって中断された場合、else 節は実行されません。
同じ例を while ループで書き直したものを次に示します。 while を使用すると、else 節は同じように動作します。

seasons = ['Winter', 'Spring', 'Summer', 'Autumn']
index = 0
while index < len(seasons):
    if not seasons[index].istitle():
        break
    print(seasons[index])
    index += 1
else:
    print('All seasons were processed')

例外処理のその他

else 句は例外処理でも使用できます。やっぱりブロック以外は来ないといけないですね。 else ブロック内のコードは、try ブロックで例外が発生しない場合にのみ実行されます。

たとえば、2 列の数値を含むファイルを読み取り、その商を出力してみましょう。無効なファイル名を処理する必要がありますが、その他のエラー (値を数値に変換する、ゼロによる除算など) はプログラムをクラッシュさせる必要があります (それらは処理しません)。

file_name = 'input.dat'
try:
    f = open(file_name, 'r')
except FileNotFoundError:
    print('Incorrect file name')
else:
    for line in f:
        a, b = map(int, line.split())
        print(a / b)
    f.close()

この例では、try ブロックには、キャッチされた例外を発生させる可能性のあるコードのみが含まれています。
公式ドキュメントでは、try ブロックの外側のコードによって発生した例外を意図せずにキャッチすることを避けるために、else ブロックを使用することを推奨しています。それでも、例外処理での else の使用は直感的ではないかもしれません。

Else とループおよび例外処理の組み合わせ

これは私が面接で投げかけた質問です。
find_element メソッドを持つ Driver クラスがあるとします。 find_element メソッドは、要素を返すか、ElementNotFoundException 例外を発生させます。この例では、要素をランダムに返すか、同じ確率で例外を発生させるように実装されています。

基本的な Python 構文を使用して、ステップ秒ごとに指定されたロケーターを持つ要素をチェックするメソッド Smart_wait(self, locator: str, timeout: float, step: float) を実装します。タイムアウト秒以内に要素が見つかった場合は戻ります。それ以外の場合は、ElementNotFoundException 例外が発生します。

browser = get_browser()
if browser == 'chrome':
    driver = Chrome()
elif browser == 'firefox':
    driver = Firefox()
else:
    raise ValueError('Browser not supported')

このメソッドを実装する 1 つのアプローチは次のとおりです。

  • タイムアウトが経過しない限り、要素の検索を試行します。
  • 要素が見つかった場合は、ループを終了します。
  • 要素が見つからない場合は、ステップ間隔の間待機します。
  • タイムアウトを超過した場合は、ElementNotFoundException を発生させます。 簡単な実装は次のとおりです。
seasons = ['Winter', 'Spring', 'Summer', 'Autumn']
is_all_words_processed = True
for season in seasons:
    if not season.istitle():
        is_all_words_processed = False
        break
    print(season)

if is_all_words_processed:
    print('All seasons were processed')

break の代わりに return を使用すると、ロジックを少し短縮できますが、今は i のままにしておきます。

実際、このメソッドは Selenium の WebDriverWait クラスに実装されています - メソッドまで:

seasons = ['Winter', 'Spring', 'Summer', 'Autumn']
for season in seasons:
    if not season.istitle():
        break
    print(season)
else:
    print('All seasons were processed')

次に、例外処理とループの両方に else を使用してこのメ​​ソッドを書き直してみましょう。

  1. 例外は行 self.find_element(locator) でのみ発生する可能性があります。ループからの終了は、例外が発生しなかった場合に実行する必要があります。したがって、break を else ブロックに移動できます。
  2. ブレークではなくループが終了した場合、このメソッドは例外を発生させる必要があります。したがって、例外発生をループの else 節に移動できます。
  3. 結果的に変換 1 と 2 を実行すると、現在の時刻はループ条件でのみ取得できることがわかります。

これらの変換を完了すると、例外処理とループの両方に else ステートメントを使用するメソッドが得られます。

seasons = ['Winter', 'Spring', 'Summer', 'Autumn']
index = 0
while index < len(seasons):
    if not seasons[index].istitle():
        break
    print(seasons[index])
    index += 1
else:
    print('All seasons were processed')

何と言えばよいでしょうか... これは Python のあまり知られていない機能の 1 つです。使用頻度が低いと、あらゆるシナリオで直感的に使用できなくなる可能性があり、混乱を招く可能性があります。ただし、それを理解し、必要なときに効果的に適用することには間違いなく価値があります。

明けましておめでとうございます! ???

追伸本当に怖かった?:
私は自分で記事を書いていますが、ChatGPTを使用して翻訳しています。翻訳のためにすべてのコード スニペットを削除しましたが、ChatGPT はそれらをすべて復元します ?

以上がPython の奇妙な &#else&#の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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