Pythonの「else」はif文だけじゃない!?知れば広がる、Pythonの面白い特徴3選!

こんにちは。ゆうせいです。

先日は「Truthy」と「Falsy」について学びましたね!

if my_list: と書くだけで「リストに中身があるか」を判定できるなんて、Pythonは賢くて、ちょっと面白いヤツだと思いませんか?

実はPythonには、こうした「え、そんな書き方ができるの!?」と驚くような、ユニークで便利な特徴がまだまだ隠されているんです。

今回は、知れば知るほどPythonが好きになる(かもしれない)、新人エンジニアの皆さんにぜひ知っておいてほしい「面白いPythonの特徴」を3つ、厳選してご紹介しますね!


特徴1: for文やwhile文にくっつく「else」

皆さん、「else」と聞いたら、どんな場面を思い浮かべますか?

もちろん、if文とセットで使う「もし〜でなければ」という条件分岐ですよね。

if の相棒は else!」

そう思っている方がほとんどでしょう。

ところが、Pythonさんは、なんとfor文やwhile文といった「ループ(繰り返し処理)」にも else をくっつけることができるんです!

for i in range(3):
    print(f"{i} を処理しました")
else:
    print("ループがすべて完了しました!")

こんなコードを実行すると、どうなると思いますか?

予想してみてください。

0 を処理しました
1 を処理しました
2 を処理しました
ループがすべて完了しました!

このように、for文が最後まで(この場合は range(3) の0, 1, 2をすべて)実行された後に、else の中身が実行されます。

「え、それなら for文 の直後に普通に print を書くのと変わらなくない?」

素晴らしい指摘です!

実は、この else節 が本当に輝くのは、ループ処理と break文(ループを途中で中断する命令)を組み合わせたときなんです。

専門用語解説: ループの else

Pythonにおけるループの else節 は、「ループが break で中断されずに、正常に最後まで完了したとき」にだけ実行される、という特別なルールがあります。

ピンと来ませんか?

では、宝探しの例えで考えてみましょう!

あなたは今、[1, 5, 8, 10, 13] という5つの宝箱のリストを順番に調べています。

目的は「10より大きい数字(お宝)を最初に見つけること」です。

break で中断される(お宝発見!)パターン:

chests = [1, 5, 8, 10, 13]
for item in chests:
    print(f"{item} を調査...")
    if item > 10:
        print(f"お宝({item})発見! 探索を中断します。")
        break # ループを中断!
else:
    print("残念...お宝は見つかりませんでした。")

実行結果:

1 を調査...
5 を調査...
8 を調査...
10 を調査...
13 を調査...
お宝(13)発見! 探索を中断します。

13 を見つけた時点で if item > 10: がTrueになり、break が実行されました。

ループが途中で中断されたため、最後の else節 は実行されませんでしたね!

break されない(お宝なし...)パターン:

chests = [1, 5, 8, 10, 3] # お宝(10より大きい数)がないリスト
for item in chests:
    print(f"{item} を調査...")
    if item > 10:
        print(f"お宝({item})発見! 探索を中断します。")
        break
else:
    print("残念...お宝は見つかりませんでした。")

実行結果:

1 を調査...
5 を調査...
8 を調査...
10 を調査...
3 を調査...
残念...お宝は見つかりませんでした。

今度は、最後までループを回りましたが、break は一度も実行されませんでした。

ループが「正常に完走した」ため、最後に else節 が実行され、「見つかりませんでした」と表示されました。

この else節 を使えば、「見つかったかどうか」を管理するためだけの変数(フラグ変数、found = False みたいなもの)を用意する必要がなくなり、コードがとてもスッキリするんです!


特徴2: まるで呪文?「リスト内包表記」

あなたは今、0から9までの数字を2倍した新しいリストを作りたいと思いました。

どう書きますか?

きっと、こんな風に for ループを使いますよね。

new_list = []
for i in range(10):
    new_list.append(i * 2)

print(new_list)
# [0, 2, 4, 6, 8, 10, 12, 14, 16, 18]

4行もかかってしまいました。

これが、Pythonの「リスト内包表記」を使うと、たった1行で書けてしまいます。

new_list = [i * 2 for i in range(10)]

print(new_list)
# [0, 2, 4, 6, 8, 10, 12, 14, 16, 18]

な、なんだこの呪文は!?

驚かないでください。これがPythonの得意技の一つです。

専門用語解説: リスト内包表記 (List Comprehension)

リスト内包表記は、「既存のリスト(やイテラブル)から新しいリストを効率的に作る」ための、Python独特の書き方です。

基本的な構造はこうなっています。

[ (最終的にリストに入れる値) for (要素を入れる変数) in (元のリストやrangeなど) ]

先ほどの [i * 2 for i in range(10)] に当てはめてみましょう。

  • (最終的にリストに入れる値)i * 2
  • (要素を入れる変数)i
  • (元のリストやrangeなど)range(10)

まるで、for ループの処理 new_list.append(i * 2)for i in range(10): が合体して、[] の中に引っ越してきたみたいですね!

例えるなら、「リスト製造工場の設計図」です。

「range(10) という材料をベルトコンベア(for)で流し、i * 2 という加工(処理)をして、新しいリスト製品 [] に詰め込め!」

という指示を、この1行で表現しているんです。

慣れるまでは少し読みにくいかもしれませんが、読めるようになると「あ、これはリストを作ってるんだな」と一目で分かり、とても便利ですよ。

(ただし、if文を加えたりして複雑にしすぎると、逆に読みにくくなるので注意しましょう!)


特徴3: 2つの変数を一瞬で入れ替える「スワップ」

最後の特徴です。

突然ですが、クイズです!

変数 a に 10、変数 b に 20 が入っています。

この a と b の中身を入れ替えて、a を 20、b を 10 にするには、どう書けばいいでしょうか?

多くのプログラミング言語では、こう書くのが一般的です。

a = 10
b = 20

# 一時的な置き場所(tmp)を使う
tmp = a  # tmp に 10 を避難
a = b    # a に 20 を上書き
b = tmp  # b に避難させていた 10 を入れる

print(f"aは {a}, bは {b}")
# aは 20, bは 10

tmp (temporary = 一時的な) という名前の変数を「空き箱」のように使って、値を一時的に避難させる必要がありました。

しかし、Pythonなら、こう書けます。

a = 10
b = 20

# これだけ!
a, b = b, a

print(f"aは {a}, bは {b}")
# aは 20, bは 10

tmp どこ行った!?

まるでマジックのようですが、これもPythonの立派な文法です。

専門用語解説: タプル・アンパッキング (Tuple Unpacking)

これは「タプル」という機能と「アンパッキング(荷解き)」という機能が組み合わさって実現されています。

a, b = b, a

このコードをPythonは、内部でこんな風に解釈しています。

  1. 右辺の処理: b, a は、(b, a) という「タプル」を作ります。タプルは、複数の値をカンマで区切ってまとめた、リストに似たものです。(この場合、(20, 10) というタプルが一時的に作られます)
  2. 左辺の処理: a, b = (20, 10) という代入が行われます。
  3. アンパッキング: 左辺にカンマ区切りで変数が並んでいると、Pythonは右辺のタプル(やリスト)を「アンパック(荷解き)」して、各変数に順番に代入します。
    • a(20, 10) の1番目である 20 が入る。
    • b(20, 10) の2番目である 10 が入る。

結果、tmp を使わずに一瞬で値が入れ替わったように見えるのです!

例えるなら、右手に持っている「ミカン(b)」と左手に持っている「リンゴ(a)」を、空中に同時に放り投げてキャッチしたら入れ替わってた!みたいな(ちょっと無理やりですが)素早いイメージですね。


まとめと今後の学習指針

いかがでしたか?

今回は、Pythonの面白い特徴として、

  1. break されなかったときに動く「ループの else節」
  2. ループを1行で書ける「リスト内包表記」
  3. 一時変数いらずの「タプル・アンパッキング(スワップ)」

の3つをご紹介しました。

これらは、Pythonの世界では「Pythonic(パイソニック)」、つまり「とてもPythonらしい書き方」と呼ばれています。

最初は「何これ、読みにくい…」と感じるかもしれません。

でも、これらの書き方が「なぜ」存在するのか(=コードをスッキリさせるため、効率的にするため)を理解し、その文法に慣れていくと、Pythonでコードを書くのがもっともっと楽しく、速くなるはずです!

大切なのは、丸暗記ではなく「どういう仕組みで動いているのかな?」と興味を持つことです。

ぜひ、ご自身の環境で import this と入力してみてください。

そこには、Pythonの設計思想(The Zen of Python)が詩として書かれています。

そこに書かれている「Simple is better than complex.(複雑よりシンプルな方が良い)」といった言葉を胸に、これからもPythonの学習を楽しんでいきましょう!

セイ・コンサルティング・グループの新人エンジニア研修のメニューへのリンク

投稿者プロフィール

山崎講師
山崎講師代表取締役
セイ・コンサルティング・グループ株式会社代表取締役。
岐阜県出身。
2000年創業、2004年会社設立。
IT企業向け人材育成研修歴業界歴20年以上。
すべての無駄を省いた費用対効果の高い「筋肉質」な研修を提供します!
この記事に間違い等ありましたらぜひお知らせください。