for elseの特殊機能を学ぶpythonの入門編
どのプログラミング言語でも "if-else" は書きますが、"for-else" はどうでしょう?
cやc++、Javaなど多くの言語では、ループの後に"else"を使うことは完全に間違っています。しかし、エレガントな言語であるPythonは、この奇妙だが便利な機能を備えている。正しく使えば、私たちのコードはもっとすっきりするはずです。
For-Else機能の基礎知識
Pythonの開発者が初めて"for-else"機能に出会ったとき、それは奇妙で理解しがたいものに見えます。しかし、実際にはその使い方は驚くほど簡単です。ループにブレークがないときだけ" else"ブロックが実行される、という一文で十分説明できます。
嘘のように簡単?例題で検証してみよう。
leaders = ["Elon", "Tim", "Warren"]
for i in leaders:
if i == "Yang":
print("Yang is a leader!")
break
else:
print("Not found Yang!")
# Not found Yang!
上で見たように、リストリーダーには "Yang" が含まれていないため、for ループにブレークがありません。したがって、"else"ブロックが実行され、メッセージが表示されます。
もし、Leadersに"Yang"が含まれていたら、どうなりますか?
leaders = ["Yang", "Elon", "Tim", "Warren"]
for i in leaders:
if i == "Yang":
print("Yang is a leader!")
break
else:
print("Not found Yang!")
# Yang is a leader!
上記のように、"Yang"がリーダーリストにあるため、forループは壊れており、"else"ブロックは実行されていません。
つまり、for-else機能は、理解するのは難しくないが、正しく上手に使うのは簡単ではないということだ。
For-Else機能を使用する3つのシナリオ
Pythonのプログラムでは、必ずしもfor-else機能を使用する必要はありません。正直なところ、使わなくても同じことができるのですが、使うことでコードがよりエレガントになります。
1. フラグ変数のない項目を反復して探す
特定の項目を見つけるためにリストを反復することは、ループを使用するための基本的な解決策です。通常、項目が見つかったら、反復を続けるのは意味がないので、ループを解除する必要があります。問題は、項目が見つかったかどうかをどのようにして知るかです。
従来の解決策は、"flag" 変数を定義して、特定の項目が見つかったときに True に設定することです。
leaders = ["Yang", "Elon", "Tim", "Warren"]
have_yang = False
for i in leaders:
if i == "Yang":
have_yang = True
# Do something
break
if have_yang == False: # no yang
... # Do others
この方法でも十分なのですが、Pythonをフルに活用したい場合。for-elseの機能を使うのも一つの手です。
leaders = ["Yang", "Elon", "Tim", "Warren"]
for i in leaders:
if i == "Yang":
have_yang = True
# Do something
break
else: # no yang
... # Do others
そのほうが簡単で便利でしょう?
2. ネストしたループの解除を支援
for-else機能は、ネストしたループがある場合にも有効です。
for i in range(5):
for j in range(5):
if j == 2 and i == 0:
break
if not (j == 2 and i == 0):
continue
break
上で見たように、ネストしたループを壊すのは少し難しいです。なぜなら、内側のループが壊れているかどうかを知る必要があるからです。
上のコードは、内側のループが壊れているかどうかを判断するための不器用な解決策を示したものです。確かに機能するが、for-elseの機能を使えばもっとすっきりさせることができる。
# use the for-else syntax
for i in range(5):
for j in range(5):
if j == 2 and i == 0:
break
else: # only execute when it's no break in the inner loop
continue
break
3. 例外処理に関するヘルプ
例外処理はプログラミングをする上で非常に重要で、for-else機能を正しく使えば、役に立つことがある。例えば
nums = [1, 3, 0, 5]
for denominator in nums:
try:
20/denominator
except ZeroDivisionError:
break
else: # no found ZeroDivisionError
... # Do others
上記のように、forループでZeroDivisionErrorが発生しなければ、"else"ブロックで対応するアクションを実行することが可能です。
まとめ
Pythonのfor-else機能は、最初、奇妙に思えるかもしれません。しかし、理解するのは難しくありませんし、場合によってはとても便利な機能です。結局のところ、1文のルールを覚えておけばいいのです:"else"ブロックはループに切れ目がないときだけ実行されます。
以上、pythonのfor elseの特殊な機能について詳しく説明しました。pythonのfor elseの特殊な機能については、Scripting Houseの他の関連記事も参考にしてください
関連
-
[解決済み】BeautifulSoupを使ってHTMLの文字列を検索する
-
[解決済み】「tqdm」という名前のモジュールがない
-
PythonでRuntimeWarning: invalid value encountered in double_scalars問題を解決する方法
-
[Python] TypeError: ハッシュ化できない型: 'numpy.ndarray'
-
[解決済み] 文字列の先頭と末尾のゼロを削除するには?Python
-
[解決済み] Pythonでバックスラッシュ文字を空文字列に置換する方法
-
[解決済み] sqlite3.OperationalError: 認識できないトークン:"01T00" Python datestamp
-
[解決済み] Matlabのset関数に相当するPythonの関数
-
デバイスに不適切な ioctl がある (解決予定)
-
Pythonのnumpy.append()
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
Pythonショートビデオクローラーチュートリアル
-
[解決済み】なぜ「LinAlgError: Grangercausalitytestsから「Singular matrix」と表示されるのはなぜですか?
-
[解決済み】np.unravel_indexの直感的な説明とは?
-
[解決済み] AttributeError: モジュール 'matplotlib' には属性 'plot' がありません。
-
[解決済み] TypeError: タプルにしか連結できない("str "ではない) Error
-
[解決済み] S3からspark dataframe Pythonにparquetデータを読み込むには?
-
[解決済み] 正規表現で重複するマッチを見つけるには?
-
[解決済み] プロットリー ローソク足チャートにボリュームを追加する方法
-
[解決済み] pythonでurllib.urlencodeをURLとして扱えない
-
[解決済み] Pythonで複数の図表を1つのPDFファイルに保存する。