ホームページ >バックエンド開発 >Python チュートリアル >Python の奇妙な 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 の使用は直感的ではないかもしれません。
これは私が面接で投げかけた質問です。
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 つのアプローチは次のとおりです。
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 を使用してこのメソッドを書き直してみましょう。
これらの変換を完了すると、例外処理とループの両方に 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 サイトの他の関連記事を参照してください。