【初心者向け】PythonのSyntaxErrorは怖くない!よくある原因と解決策を徹底解説
プログラミングを始めたばかりの頃、ターミナルに表示される真っ赤なエラーメッセージ...。特に「SyntaxError」という文字を見ると、「うわ、何かやらかした…」と心が折れそうになりますよね。すごく分かります。
でも、安心してください!実は SyntaxErrorは、プログラミングエラーの中では最も「親切なエラー」なんです。
こんにちは!ほんの数ヶ月前まで皆さんと同じプログラミング知識ゼロの初心者だった筆者です。AIの助けを借りながら試行錯誤を繰り返し、なんとか1ヶ月半で2つのWebサイト(buyonjapan.com, copicode.com)を自力で立ち上げました。
この記事では、そんな私が実際に何度もつまづいた「SyntaxError」について、「なぜエラーが起きるのか」「どうやって直せばいいのか」を、専門用語を極力使わずに、同じ初心者目線で徹底的に解説します。この記事を読み終える頃には、あなたもSyntaxErrorを自力で解決できる自信がついているはずです!
そもそもSyntaxErrorって何? - Pythonからの「書き方、ちょっと違うかも?」のサイン
SyntaxErrorを日本語に訳すと「構文エラー」です。…と言われてもピンとこないですよね。もっと簡単に言うと、「Python語の文法や書き方のルールを、ほんの少し間違えちゃったよ」というPythonからの優しいお知らせです。
例えば、私たちが日本語で「私は、りんごを食べます」と書くところを、「私は、りんごを食べます。」と句点「。」を忘れても、意味はなんとなく通じます。でも、Pythonは非常に厳格なので、少しでもルールと違う書き方をされると「ごめん、これどういう意味か分からない!」とエラーを出して処理を止めてしまうのです。
重要なのは、SyntaxErrorはあなたの書いたコードの「ロジック(処理の流れ)」が間違っているのではなく、単純な「書き方のミス」であるケースがほとんどだということです。だから、怖がる必要は全くありません。むしろ、「あ、タイプミスしちゃったか」くらいの軽い気持ちで向き合いましょう。
【実例で学ぶ】初心者が必ずハマる!SyntaxErrorよくある原因7選
ここからは、私が実際に「うわー!」と頭を抱えた、初心者が陥りがちなSyntaxErrorの具体的な原因と、コピペで動く修正コードを紹介していきます。「私もここでハマった!」「AIにはこうやって聞いたら解決した!」という体験談も交えて解説するので、ぜひ参考にしてください。
1. 括弧の閉じ忘れ: `()` `{}` `[]`
体験談: これは本当に一番やりました…。特に括弧が何重にもなっていると、どれを閉じてどれを閉じていないのか分からなくなり、たった一つの閉じ忘れで大量のエラーが出てパニックになったことがあります。
原因: Pythonでは、括弧は「ここからここまでがひとまとまりだよ」という範囲を示す役割があります。開き括弧 `(` があるのに、対応する閉じ括弧 `)` がないと、Pythonはどこまでがまとまりなのか判断できず、「あれ?範囲が終わらないんだけど…?」と混乱してしまいます。
❌ 間違ったコード (NG例)
print("こんにちは、世界!" のように、最後の `)` が抜けています。
# print関数の最後の括弧を忘れている
print("こんにちは、世界!"
これを実行すると、SyntaxError: unexpected EOF while parsing (解析中に予期せずファイルが終わってしまいました) というエラーが出ます。
✅ 正しいコード (OK例)
ちゃんと `()` で囲ってあげることで、正しく実行されます。
# 括弧を正しく閉じる
print("こんにちは、世界!")
🤖 AI活用術: エラーメッセージをそのままコピーして、「このPythonエラー `SyntaxError: unexpected EOF while parsing` はどういう意味ですか?初心者に分かりやすく教えてください」のように質問すると、原因が括弧の閉じ忘れである可能性が高いことを教えてくれます。
2. 引用符(クォーテーション)の閉じ忘れ: `''` `""`
体験談: コードエディタ(VSCodeなど)を使っていると、文字列が緑色などで表示されますよね。引用符を閉じ忘れると、その後のコードまで全部緑色になってしまい、「なんだこれ!?」と焦った経験があります。色の変化はエディタからの重要なサインです。
原因: 引用符は、Pythonに「ここからここまでが『文字列』というデータの塊だよ」と教えるための記号です。これを閉じ忘れると、Pythonはどこまでが文字列なのか分からず、後続のコードまで文字列の一部だと勘違いしてしまいます。
❌ 間違ったコード (NG例)
'今日の天気は晴れ のように、最後の ' が抜けています。
# シングルクォーテーションを閉じ忘れている
weather = '今日の天気は晴れ
print(weather)
これを実行すると、SyntaxError: EOL while scanning string literal (文字列を読んでいる最中に行が終わってしまいました) というエラーが出ます。
✅ 正しいコード (OK例)
文字列の前後を同じ種類の引用符でしっかり囲みましょう。
# シングルクォーテーションを正しく閉じる
weather = '今日の天気は晴れ'
print(weather)
🤖 AI活用術: 「Pythonで文字列を囲むシングルクォーテーションとダブルクォーテーションの違いと、使い分け方を教えてください」と聞いてみましょう。基本的な違いはないことや、どのような時に使い分けると便利かを学べます。
3. コロン (`:`) のつけ忘れ
体験談: if文やfor文、def文など、特定の構文の最後に付けるコロン。これを忘れただけで、なぜか次の行がエラーになってしまい、「なんでこっちがエラーなの!?」と見当違いの場所をずっと修正していた苦い記憶があります。
原因: Pythonでは、コロンは「ここから、一連の処理ブロック(インデントされたコードの塊)が始まりますよ!」という合図の役割を果たします。この合図がないと、Pythonは次に何が来るのか予測できず、文法エラーとなってしまいます。
❌ 間違ったコード (NG例)
if age >= 20 の最後にコロン : がありません。
age = 25
# if文の最後にコロンを忘れている
if age >= 20
print("あなたは大人です。")
これを実行すると、SyntaxError: invalid syntax (不正な構文です) という、ちょっと漠然としたエラーが出ます。エラーが出ている行の「前」の行を確認する癖をつけると、このミスは見つけやすくなります。
✅ 正しいコード (OK例)
条件式の最後にコロン : を忘れずにつけましょう。
age = 25
# if文の最後にコロンを正しくつける
if age >= 20:
print("あなたは大人です。")
🤖 AI活用術: 「Pythonのif文やfor文の最後にコロンが必要な理由を、小学生にも分かるような例え話で教えてください」と頼んでみてください。「これからお話をはじめますよ、という『:』マークなんだよ」のような、記憶に残りやすい説明をしてくれます。
4. インデント (字下げ) の間違い (`IndentationError`)
体験談: これはSyntaxErrorの親戚のようなエラーですが、初心者を最も苦しめる壁の一つです。「見た目は合ってるのに、なぜかエラーが出る…」その原因は、目に見えない「全角スペース」が混じっていたり、「スペース」と「タブ」が混在していたりすることでした。エディタの設定で、スペースやタブを可視化するようにしてからは、このエラーは激減しました。
原因: 他の多くのプログラミング言語が{}などの記号でコードの範囲を示すのに対し、Pythonはインデント(行頭のスペース)の深さでコードのグループ(ブロック)を判断します。このインデントがズレていると、Pythonはコードの構造を正しく理解できません。これはPythonの最大の特徴であり、コードを読みやすくするための重要なルールです。
Pythonの公式ドキュメントでも、インデントがコードブロックを示す唯一の方法であることが明記されています。
参考: Python 3 ドキュメント - 字下げ
❌ 間違ったコード (NG例)
if文の後のprint文がインデント(字下げ)されていません。
if True:
# 本来インデントが必要な場所でインデントされていない
print("インデントされていません")
これを実行すると、IndentationError: expected an indented block (インデントされたブロックが必要です) という、そのものズバリなエラーが出ます。
✅ 正しいコード (OK例)
一般的に、半角スペース4つでインデントするのが推奨されています。ほとんどのコードエディタでは、Tabキーを押すと自動で半角スペース4つが入力されるように設定できます。
if True:
# 半角スペース4つで正しくインデントする
print("正しくインデントされています")
🤖 AI活用術: 「VSCodeでPythonのインデントを半角スペース4つに自動で設定する方法と、スペースやタブを可視化する方法を教えてください」のように、具体的なエディタの名前を入れて質問すると、すぐに使える設定方法を教えてくれます。
5. 代入の `=` と比較の `==` の使い間違い
体験談: 条件分岐で「もしAとBが等しいなら」と書きたいのに、うっかり代入の`=`を一つだけ書いてしまい、SyntaxErrorに...。数学の「=」の感覚でいると、ついやってしまうミスです。
原因: Pythonでは、記号の意味が厳密に決まっています。
=(イコール1つ): 右の値を左の変数に入れる(代入) という意味。例:score = 100==(イコール2つ): 左と右が等しいか?を調べる(比較) という意味。例:if score == 100:
if文のような比較をすべき場所で代入の=を使うと、文法的に正しくないと判断されてエラーになります。
❌ 間違ったコード (NG例)
if文の中で、比較の==ではなく代入の=を使っています。
score = 90
# 比較演算子 `==` ではなく、代入演算子 `=` を使ってしまっている
if score = 100:
print("満点です!")
これを実行すると、SyntaxError: invalid syntax が出ます。(Pythonのバージョンによっては `SyntaxError: invalid syntax. Maybe you meant '==' or ':=' instead?` と親切に教えてくれることもあります)
✅ 正しいコード (OK例)
比較をする場所では、必ず `==` を使いましょう。
score = 100
# 正しく比較演算子 `==` を使う
if score == 100:
print("満点です!")
🤖 AI活用術: 「Pythonの比較演算子(==, !=, <, > など)と代入演算子(=)の違いを、具体的なコード例を交えて表形式でまとめてください」とお願いすると、知識をスッキリ整理できます。
6. 予約語(キーワード)を変数名に使ってしまう
体験談: 印刷する、という意味で `print` という変数を作ろうとしたり、クラスを定義したくて `class` という変数名にしようとしたり...。Pythonにあらかじめ特別な意味として予約されている単語があることを知らず、エラーになって「なぜこの単語だけダメなんだ?」と悩んだことがありました。
原因: Pythonには、if, for, def, class, print のように、文法のためにあらかじめ確保されている特別な単語があります。これらを「予約語」または「キーワード」と呼びます。これらの単語は、変数名や関数名として使うことができません。
❌ 間違ったコード (NG例)
for はループ処理で使う予約語なので、変数名には使えません。
# 予約語である `for` を変数名として使おうとしている
for = "予約語"
print(for)
これを実行すると、SyntaxError: invalid syntax となります。
✅ 正しいコード (OK例)
予約語を避けた、分かりやすい変数名を使いましょう。my_for や for_text のように、少し変えるだけでOKです。
# 予約語を避けた変数名にする
for_string = "予約語じゃないよ"
print(for_string)
💡 予約語の一覧を確認する方法
どんな単語が予約語なのかは、以下のコードでいつでも確認できます。
import keyword
print(keyword.kwlist)
🤖 AI活用術: 「Pythonの予約語の一覧と、それぞれのキーワードがどんな役割を持っているのかを簡単な言葉で説明してください」と質問すれば、一覧だけでなく、その意味まで学ぶことができます。
7. f-string の書き間違い
体験談: 変数と文字列を連結するのに超便利なf-string!でも、先頭の`f`を付け忘れたり、波括弧`{}`を全角で書いてしまったりと、細かいミスを連発しました。`f"こんにちは、{name}さん"`と書いたつもりが、画面には「こんにちは、{name}さん」とそのまま表示されてしまい、「あれー!?」となったのは一度や二度ではありません。
原因: f-stringは、文字列の引用符の直前に`f`を置き、文字列中の`{}`で囲んだ部分に変数や式を埋め込むことができる機能です。この `f` がないと、ただの普通の文字列として扱われます。また、`{}`が全角だったり、閉じ括弧を忘れたりすると、もちろんSyntaxErrorになります。
❌ 間違ったコード (NG例)
文字列の前の `f` を忘れているため、{name} がそのまま表示されてしまいます。
name = "山田"
# f-stringなのに、先頭の 'f' を忘れている
message = "私の名前は{name}です。"
print(message) # 出力: 私の名前は{name}です。
また、波括弧を間違えるとエラーになります。
name = "鈴木"
# 波括弧の閉じを忘れている
# message = f"私の名前は{nameです。" # これはSyntaxErrorになる
✅ 正しいコード (OK例)
引用符の前に`f`をつけ、変数を半角の`{}`で正しく囲みましょう。
name = "佐藤"
# 正しいf-stringの書き方
message = f"私の名前は{name}です。"
print(message) # 出力: 私の名前は佐藤です。
🤖 AI活用術: 「Pythonのf-stringで、数値のフォーマット(例: 3桁区切り、小数点以下の桁数指定)や日付のフォーマットをする方法を教えてください」のように、一歩進んだ使い方を聞いてみると、f-stringの便利さをさらに実感できます。
SyntaxErrorを未然に防ぐための3つの良い習慣
エラーを解決する力も大事ですが、そもそもエラーを出さないようにすることも同じくらい重要です。私が実践して効果があった3つの習慣を紹介します。
- 高機能なコードエディタを頼る
VSCode、PyCharmなどの現代的なコードエディタには、コードを書きながら間違いを指摘してくれる機能(リンター)や、色分けで文法ミスを教えてくれる機能(シンタックスハイライト)が備わっています。これらを活用しない手はありません。閉じ括弧を自動で補完してくれたり、インデントを自動で揃えてくれたりするだけでも、ミスは劇的に減ります。 - こまめに書く、こまめに実行する
一度に100行のコードを書いてから実行すると、どこでエラーが起きたのか探すのがとても大変です。そうではなく、「関数を1つ書いたら実行」「ループを1つ書いたら実行」のように、小さな単位でこまめに動作確認する癖をつけましょう。これにより、エラーが出ても「今書いた数行のどこかに原因がある」と、問題の範囲をぐっと狭めることができます。 - エラーメッセージを恐れず、まず読んでみる
赤い文字を見ると、つい目をそむけたくなりますが、ぐっとこらえて読んでみましょう。エラーメッセージには、「どのファイルの何行目で」「どんな種類のエラーが」発生したのかという、解決のための最大のヒントが書かれています。最初は意味が分からなくても大丈夫。「`IndentationError`」や「`unexpected EOF`」といったキーワードだけでも読み取り、それをそのままGoogleやAIアシスタントにコピペして検索するだけで、多くの場合は解決の糸口が見つかります。
まとめ:エラーはあなたの最高の先生!
今回は、Python初心者が遭遇しがちな`SyntaxError`の原因と解決策を、私の実体験を交えてご紹介しました。
- SyntaxErrorは文法の書き間違い。怖がらず、Pythonからのヒントだと捉えよう。
- 括弧、引用符、コロンのつけ忘れ・閉じ忘れは超あるある。
- インデントはPythonの命。スペースとタブの混在に注意。
- `=`は代入、`==`は比較。この違いを意識しよう。
- エラーが出たら、メッセージを読んで、コピペして調べるのが上達への近道。
プログラミング学習において、エラーは避けて通れません。しかし、一つ一つのエラーを乗り越えるたびに、あなたの知識と経験は確実に増えていきます。エラーはあなたを困らせる敵ではなく、あなたのコードをより良くしてくれる「最高の先生」です。
この記事が、あなたの`SyntaxError`に対する苦手意識を少しでも和らげる助けになれば、とても嬉しいです。楽しんで、コーディングを続けてください!
次のステップへ
構文エラーの次は、変数の名前に関するエラー「NameError」でつまずく人が多いです。次の記事では、このNameErrorの原因と解決策を詳しく解説しています。合わせて読んで、エラー解決能力をさらにアップさせましょう!
➡️ NameError(変数が未定義)エラーの原因とは?