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は、内部でこんな風に解釈しています。
- 右辺の処理:
b, aは、(b, a)という「タプル」を作ります。タプルは、複数の値をカンマで区切ってまとめた、リストに似たものです。(この場合、(20, 10)というタプルが一時的に作られます) - 左辺の処理:
a, b = (20, 10)という代入が行われます。 - アンパッキング: 左辺にカンマ区切りで変数が並んでいると、Pythonは右辺のタプル(やリスト)を「アンパック(荷解き)」して、各変数に順番に代入します。
aに(20, 10)の1番目である20が入る。bに(20, 10)の2番目である10が入る。
結果、tmp を使わずに一瞬で値が入れ替わったように見えるのです!
例えるなら、右手に持っている「ミカン(b)」と左手に持っている「リンゴ(a)」を、空中に同時に放り投げてキャッチしたら入れ替わってた!みたいな(ちょっと無理やりですが)素早いイメージですね。
まとめと今後の学習指針
いかがでしたか?
今回は、Pythonの面白い特徴として、
breakされなかったときに動く「ループのelse節」- ループを1行で書ける「リスト内包表記」
- 一時変数いらずの「タプル・アンパッキング(スワップ)」
の3つをご紹介しました。
これらは、Pythonの世界では「Pythonic(パイソニック)」、つまり「とてもPythonらしい書き方」と呼ばれています。
最初は「何これ、読みにくい…」と感じるかもしれません。
でも、これらの書き方が「なぜ」存在するのか(=コードをスッキリさせるため、効率的にするため)を理解し、その文法に慣れていくと、Pythonでコードを書くのがもっともっと楽しく、速くなるはずです!
大切なのは、丸暗記ではなく「どういう仕組みで動いているのかな?」と興味を持つことです。
ぜひ、ご自身の環境で import this と入力してみてください。
そこには、Pythonの設計思想(The Zen of Python)が詩として書かれています。
そこに書かれている「Simple is better than complex.(複雑よりシンプルな方が良い)」といった言葉を胸に、これからもPythonの学習を楽しんでいきましょう!
セイ・コンサルティング・グループの新人エンジニア研修のメニューへのリンク
投稿者プロフィール
- 代表取締役
-
セイ・コンサルティング・グループ株式会社代表取締役。
岐阜県出身。
2000年創業、2004年会社設立。
IT企業向け人材育成研修歴業界歴20年以上。
すべての無駄を省いた費用対効果の高い「筋肉質」な研修を提供します!
この記事に間違い等ありましたらぜひお知らせください。
最新の投稿
山崎講師2025年11月2日Pythonの「なるほど!」と思えるユニークな機能④
山崎講師2025年11月2日Pythonの「なるほど!」と思えるユニークな機能③
山崎講師2025年11月2日Pythonの「なるほど!」と思えるユニークな機能②
山崎講師2025年11月2日Pythonの「なるほど!」と思えるユニークな機能①