[解決済み] なぜpythonはforやwhileループの後に'else'を使うのですか?
2022-03-02 03:43:37
質問
この構成がどのように機能するかは理解しています。
for i in range(10):
print(i)
if i == 9:
print("Too big - I'm giving up!")
break
else:
print("Completed successfully")
しかし、なぜ
else
がキーワードとして使われているのは、問題のコードが
for
ブロックが完了しないと、その逆になってしまうのです どう考えても、私の脳みそでは
for
ステートメントから
else
ブロックを作成します。私にとっては
continue
または
continuewith
の方が筋が通っていると思います(そう読めるように訓練中です)。
Pythonのコーダーはこの構成をどのように頭の中で(あるいは声に出して)読んでいるのか気になるところです。もしかしたら、私はこのようなコードブロックをもっと簡単に解読できるような何かを見逃しているのでしょうか?
どのように解決するのですか?
Pythonのベテランコーダーにとっても、これは不思議な構造です。forループと一緒に使うと、基本的には "イテラブルの中のある項目を見つけ、何も見つからなかったら..."を意味します。というような意味です。
found_obj = None
for obj in objects:
if obj.key == search_key:
found_obj = obj
break
else:
print('No object found.')
しかし、この構成を見る限り、より良い代替案は、検索を関数にカプセル化することです。
def find_obj(search_key):
for obj in objects:
if obj.key == search_key:
return obj
またはリスト内包を使用する。
matching_objs = [o for o in objects if o.key == search_key]
if matching_objs:
print('Found {}'.format(matching_objs[0]))
else:
print('No object found.')
他の2つのバージョンと意味的に同等ではありませんが、リスト全体を反復処理するかどうかが重要でないパフォーマンスクリティカルでないコードでは十分に機能します。他の人はそう思わないかもしれませんが、私自身はプロダクションコードでfor-elseやwhile-elseブロックを使うのは絶対に避けたいと思っています。
関連
-
風力制御におけるKS原理を深く理解するためのpythonアルゴリズム
-
Python Pillow Image.save jpg画像圧縮問題
-
[解決済み] 割り当て後にリストが予期せず変更されました。その理由と防止策を教えてください。
-
[解決済み] パラメータに**(ダブルスター/アスタリスク)、*(スター/アスタリスク)がありますが、これはどういう意味ですか?
-
[解決済み] Pythonの変数名や関数名の命名規則について教えてください。
-
[解決済み] なぜPythonのコードは関数の中でより速く実行されるのですか?
-
[解決済み] Pythonの__future__は何に使うのか、いつ、どのように使うのか、その仕組みについて
-
[解決済み] Pythonの上達の道 - 見習いから第一人者へ
-
[解決済み】RubyにあってPythonにないもの、またその逆は何ですか?
-
[解決済み】Pythonでtry-except-elseを使用するのは良い習慣ですか?
最新
-
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 カメの描画コマンドとその例
-
Python interpreted model libraryによる機械学習モデル出力の可視化 Shap
-
Evidentlyを用いたPythonデータマイニングによる機械学習モデルダッシュボードの作成
-
[解決済み】ilocが「IndexError: single positional indexer is out-of-bounds」を出す。
-
[解決済み】TypeError: re.findall()でバイトのようなオブジェクトに文字列パターンを使用することはできません。)
-
[解決済み】 AttributeError: モジュール 'matplotlib' には属性 'plot' がない。
-
[解決済み】syntaxError: 'continue' がループ内で適切に使用されていない
-
[解決済み】SyntaxError: デフォルト以外の引数がデフォルトの引数に続く
-
[解決済み】ValueError: xとyは同じサイズでなければならない
-
[解決済み】django インポートエラー - core.managementという名前のモジュールがない