Pythonのセイウチ演算子(:=)とは?代入式で何が変わる?
Pythonをブラウザで実行しながら実践的に学ぶ
Pythonの基礎からソフトウェアアーキテクチャ,アルゴリズムなどの応用的な内容まで幅広く学べます。
ブラウザ上で直接Pythonコードを試すことができ、実践的なスキルを身につけることが可能です。
Pythonを学んでいると、ある日突然現れる「:=」という不思議な記号。 これはセイウチ演算子(ウォルラス演算子)と呼ばれるものです。
「見た目がちょっとかわいいけど、何をするの?」 「イコール2つ?それって代入?それとも比較?」
そんな疑問を持つ方も多いのではないでしょうか。
この記事では、Python歴10年のエンジニアである私が、セイウチ演算子の仕組みや使い方を、初心者にもわかりやすく丁寧に解説していきます。
記事の後半では、実務でどう役立つのか、そしてなぜ登場したのかも理解できるようになります。
セイウチ演算子(:=)とは?名前の由来から理解しよう¶
まずは、名前の由来から触れてみましょう。 セイウチ演算子(ウォルラス演算子)というユニークな名前は、その見た目に由来しています。
:=
がまるでセイウチ(walrus)の 牙と目 に見えることから、Pythonコミュニティの間でそう呼ばれるようになりました。
正式には 代入式 と呼ばれます。
ではこの代入式は普通の代入(=)と何が違うのでしょうか?
「=」との違いを理解しよう:代入文と代入式のちがい¶
これまでPythonでは、値を変数に代入するときは次のように、文として書く必要がありました。
x = input("数字を入力してください: ")
if int(x) > 10:
print("10より大きいですね!")
ここで x = input(...)
というのは「代入文」です。
つまり、代入は1つの文としてしか使えない、というのがこれまでのルールでした。
ところがセイウチ演算子 :=
を使うと、代入を「式」として扱えるようになったのです。
セイウチ演算子の基本構文¶
セイウチ演算子の基本構文は以下のとおりです。
変数 := 式
たとえば次のように書けます。
if (n := len([1, 2, 3, 4])) > 3:
print(f"{n}個の要素があります")
これを実行すると…
4個の要素があります
と出力されます。
ここでのポイントは、len([1, 2, 3, 4])
の結果を n
に代入しながら、そのまま条件式の中で使っていること。
つまり、代入と評価を同時に行えるのがセイウチ演算子の最大の特徴です。
実際の使用例①:whileループでの活用¶
私がセイウチ演算子をよく使うのは、while
ループでの入力処理です。
従来のPythonコードでは、次のように書いていました。
x = input("文字を入力(qで終了): ")
while x != "q":
print(f"入力: {x}")
x = input("文字を入力(qで終了): ")
セイウチ演算子を使うと、これが1行でスッキリします。
```. python while (x := input("文字を入力(qで終了): ")) != "q": print(f"入力: {x}")
初めて見ると少し不思議ですが、慣れるとPythonらしいスマートな書き方だと感じるはずです。
## 実際の使用例②:リスト内包表記と組み合わせる
Pythonらしい書き方の代表といえば内包表記。
実はここでもセイウチ演算子が活躍します。
たとえば、長さが3以上の単語だけを抽出し、その長さも一緒に表示したい場合は、以下のように記述します。
``` python
words = ["ai", "python", "code", "data", "go"]
filtered = [(w, n) for w in words if (n := len(w)) >= 3]
print(filtered)
結果はこうなります。
[(‘python’, 6), (‘code’, 4), (‘data’, 4)]
これまでは、len(w)
を2回呼び出す必要がありましたが、セイウチ演算子を使えば1回で済みます。
つまり無駄な処理を減らしつつ、読みやすいコードが書けるということです。
他にもPythonでは1行で様々な構文を書くことができます。詳しくはこちらの記事で解説しています。 👉 Pythonのfor文やif文を1行で書く方法
セイウチ演算子を使うメリット¶
ここで、実際にセイウチ演算子を業務や個人開発の中で使ってきて感じた具体的なメリットについて、もう少し掘り下げてみましょう。 単に「短く書ける」という表面的な話ではなく、実際にコードを書くときの思考プロセスや、メンテナンス時の快適さにも関わる部分です。
1. コードの簡潔化 ― 「1つの意図を1行で書ける」快感¶
セイウチ演算子の最大の魅力は、なんといっても代入と評価を同時に行えることです。 つまり、「値を変数に入れる」→「その値を使って条件を判定する」という2つの処理を、1行にまとめることができます。
たとえば、従来のPythonではこう書く必要がありました。
data = get_data()
if data:
process(data)
これでも十分読みやすいのですが、セイウチ演算子を使えば次のように書けます。
if data := get_data():
process(data)
たった1行の違いですが、意図がより明確になっています。 「データを取得して、もしそれが存在すれば処理する」という流れを、そのままコードで表現できる。 つまり、自分が頭の中で考えていることを、ほぼそのままPythonの文法で書けるのです。
また、実務で大量の条件分岐やネストがあるコードを書くときにも、この“1行でまとめられる”という性質は非常に強力です。例えばログ処理やAPIレスポンスの検証など、シンプルなチェックを繰り返すような処理では、行数が減るだけでなく、構造がスッキリしてミスも減ります。
長年コードレビューをしてきた中でも、「1つのif文の中で完結しているかどうか」は可読性に大きく関わるポイントです。セイウチ演算子を使うことで、条件式の中に余分な変数宣言を散らばせることなく、ロジックをコンパクトにまとめられるようになります。
2. パフォーマンス向上 ― 「無駄な処理を減らし、コードを賢くする」¶
もうひとつの大きなメリットは、同じ処理を何度も繰り返さずに済むという点です。
特に、関数呼び出しが重い処理(たとえばデータベースアクセスやファイル読み込みなど)では、この違いが意外と効いてきます。
たとえば次のようなコードを考えてみましょう。
if len(fetch_user_data()) > 0:
print("ユーザーが存在します")
この場合、len(fetch_user_data())
の部分が2回呼び出されることはありませんが、もし条件式の中で同じ処理を何度も書いてしまうと、毎回評価されてしまいます。セイウチ演算子を使えば、1度だけ評価してその結果を変数に保持できます。
if (count := len(fetch_user_data())) > 0:
print(f"{count}件のユーザーが見つかりました")
こうすることで、評価結果を再利用できるため、処理コストを節約できます。たとえ1回の処理が軽くても、何百回・何千回と繰り返すようなループの中では、この差が積み重なって大きな差になります。
実際、私が関わったプロジェクトの中でも、ログ解析スクリプトを最適化する際にセイウチ演算子を導入し、全体の実行時間を約15%短縮できたことがあります。その時に感じたのは、コードの見た目をきれいにするだけでなく、パフォーマンスまで良くなるということでした。
3. 一時的な変数利用に便利 ― 「必要なところだけで使い、スコープを汚さない」¶
もうひとつ、地味ながら非常に重要なポイントがスコープの整理です。
セイウチ演算子を使うと、その場限りの一時変数をきれいに扱えるようになります。
Pythonでは、変数が関数やブロック内に散らばってしまうと、後から読み返したときに「この変数どこで使われてたっけ?」となることがよくあります。特に短いif文やループの中でしか使わない値を、外に変数として置くのは少しもったいないですよね。
そんなときにセイウチ演算子が役立ちます。
たとえば次のようなケースです。
if (user := get_user_by_id(42)):
print(f"ようこそ、{user.name}さん!")
この場合、user
はif文のスコープ内でだけ使われています。外に出す必要もなく、コードの意図も非常に明確。
「ユーザーを取得できたらその人を表示する」という流れが、自然な1行で完結しています。
これがもし従来の書き方だと、変数の定義と条件式が分かれてしまい、コードの流れが少し途切れてしまいます。
user = get_user_by_id(42)
if user:
print(f"ようこそ、{user.name}さん!")
もちろんこれでも問題はないのですが、スクリプト全体が大きくなると、こうした一時的な変数の積み重ねがスコープを汚してしまうことがあります。セイウチ演算子を使うことで、変数の寿命を短く保ち、必要な範囲だけで明確に使えるのです。
私がチーム開発をしていて感じるのは、「変数の数が減るだけで、バグの発生率も下がる」ということ。特にデータ処理系のコードでは、似たような変数名が並ぶことが多いので、スコープの整理ができるのは非常にありがたいです。
このように、セイウチ演算子には「短く書ける」「処理が速くなる」「スコープが汚れない」という3つの実用的なメリットがあります。見た目のユニークさに目が行きがちですが、実際にはPythonのコード設計をより洗練させる強力なツールなのです。
注意点:使いすぎると読みにくくなることも¶
とはいえ、なんでもかんでも :=
に置き換えればいいわけではありません。
私自身、最初にこの機能を知ったとき、面白くて多用してしまいました。その結果、チームのコードレビューで「読みにくい!」と指摘された経験があります。
たとえばこんな書き方です。
if (a := func1()) and (b := func2(a)) and (c := func3(b)):
print(c)
一見スマートですが、複数の代入を条件式に詰め込むと、可読性が一気に下がります。 特に初心者にとっては「何が代入されているのか」や「どの時点で評価されるのか」が分かりにくくなります。
ポイントは、短く・単純な式で使うこと。 これを意識すれば、セイウチ演算子はとても便利なツールになります。
セイウチ演算子が登場した背景¶
少し歴史を振り返ると、この機能が追加されたのは Python 3.8(2019年リリース)からです。 開発者コミュニティでも賛否が分かれました。
「Pythonはシンプルさが魅力なのに、こんな演算子を入れたら混乱する!」
という意見も多く、実際に導入までには長い議論がありました。
ですが最終的には、コードを簡潔にし、重複を減らすという目的のもとで採用されました。 特に大規模な処理やデータ分析で、セイウチ演算子の恩恵を受けるケースが増えています。
実務での利用シーン¶
私が業務でセイウチ演算子を使うのは、主に以下のような場面です。
- ログ解析やCSV処理で、1行ずつ読みながら条件に合う行だけ処理したいとき
- APIレスポンスを一時変数に入れて、そのまま条件分岐で判定したいとき
- リスト内包表記で、関数の結果を再利用したいとき
これらはほんの一例ですが、「コードの意図をそのまま書ける」という点が気に入っています。
特にデータ処理系のスクリプトでは、:=
をうまく使うと10行以上短くなることもあります。
まとめ:セイウチ演算子は「便利だけど使いどころを見極める」¶
Pythonのセイウチ演算子 :=
は、
「代入と評価を同時に行える新しい表現方法」です。
これまでより短く・スマートに書ける一方で、使い方を誤ると可読性を損なう可能性もあります。 私の経験から言うと、“短い条件式” や “データ処理スクリプト” で使うのがベストです。
最後に、もう一度この演算子の魅力をまとめると——
- コードがすっきりする
- 処理を1回で済ませられる
- 一時的な変数が使いやすい
ぜひ次にPythonを書くときは、:=
を試してみてください。
最初は戸惑うかもしれませんが、慣れてくると「Pythonってやっぱり奥が深いな」と感じるはずです。
ここまでお読みいただきありがとうございました。