elseステートメントの他のユースケース

ifキーワードでelseキーワードを使用する方法はよく知っています。



if x > 0: print 'positive' elif x < 0: print 'negative' else: print 'zero'
      
      







ただし、Pythonには、他のアプリケーション、ほとんどのプログラマーには未知のその他のアプリケーションがいくつかあります。





〜のために



forの直後に他に設定できることを知らないのは間違いないでしょう。 なぜですか? シーケンスの要素が使い果たされると、制御はelseブロックにあるコードに渡されます。 「そして、これらの要素が使い果たされないのはいつですか?」-ブレーク条件によってサイクルを予定より早く終了したとき。



この場合にelseを使用するのは理不尽に思えるかもしれません。なぜなら、elseは何が起こっているのかを正確に説明していないためです コンピューターとユーザーのリストがあり、それぞれがコンピューターを使用するようにしたいとします(そのうちの1人がそれを破るまで)。 サイクルの終わりに、コンピューターが壊れているかどうかを確認したいと思います。 通常、次のように記述します。



 broken = False for person in people: person.use(computer) if computer.is_broken: broken = True break if not broken: print 'The computer is fine!'
      
      







for..elseを使用して、このコードをより読みやすい形式にすることができます。



 for person in people: person.use(computer) if computer.is_broken: break else: print 'The computer is fine!'
      
      







一方...



ここでのセマンティクスは、前のケースとまったく同じです。 whileループの本体は、特定の条件が真である限り実行されます-あなたはすでにそれを知っています。 ある時点で条件が真でなくなった場合、実行はelseブランチに進みます。 breakステートメントは、条件に達すると、while..elseループ全体の実行を中断するため、elseブランチは実行されません。 簡単に言うと、while..elseの動作のロジックはfor..elseとまったく同じです。



 while usage < 10 and person.want_to_play: person.use(computer) if computer.broken: break else: print 'The computer is fine!'
      
      







試してください...を除いて...他



tryブロックにいくつかのコードが含まれています。 特定の例外をキャッチして処理したいのですが、実行中に例外がスローされなかった場合はどうでしょうか? else節が助けになります。 例外がスローされていない場合にのみ、finallyブロックの前に実行されます(確実に存在する場合)。 elseブロックで前の例外構造によって発生した例外は処理されないことに注意してください。



  def get_person(people): try: person = people[3] except IndexError: person = None else: person.do_work() return person
      
      







IndexError例外がスローされていない場合、制御はelseブランチに到達します。 なぜこれが役立つのでしょうか? person.do_work()をtryブロックに追加できますが、操作中にdo_work()がIndexError例外をスローするとどうなりますか? この場合、例外ブロックによってキャッチされ、その結果は壊滅的なものになる可能性があります(もちろん、事前に準備していない限り-この場合、get_person(person関数)で発生するように、do_work()によって生成されたIndexErrorがさらにスローされます))。



おわりに



正直なところ、ifリンクの外でelseステートメントを使用しても、あまりメリットはありませんでした。 結果の構成体は直感的ではないので、ほとんどの場合、ループ演算子と一緒に使用しないでください(ただし、短くて読みやすいコードにつながる状況では「青信号」を与えることができます)。 一方、tryでelseを使用する方がはるかに直感的であり、さらにスローする必要のある例外をキャッチするか、tryブロックの操作中に例外がスローされたかどうかを知らせるフラグ変数を使用するより優れた代替手段になる可能性があります。を除いて。



All Articles