PythonのSyntaxError: invalid syntaxとは?原因と直し方を初心者向けに解説

Pythonのコードを実行したとき、次のようなエラーが表示されることがあります。

SyntaxError: invalid syntax

「SyntaxError」は、Pythonの文法に合わないコードが書かれていることを示すエラーです。「invalid syntax」は、日本語では「無効な構文」という意味になります。

主な原因は、コロンや括弧の不足、記号の書き間違いなどです。

この記事では、「SyntaxError: invalid syntax」が発生する代表的な原因と直し方を、初心者向けに分かりやすく解説します。

この記事の内容

SyntaxErrorとは

「SyntaxError」は、Pythonがコードの意味を読み取れないときに発生します。

日本語の文章でも、句読点や語順が大きく崩れると、何を伝えたいのか分からなくなることがあります。プログラムにも文法があり、その規則から外れると処理を開始できません。

例えば、次のコードでは「if文」の末尾にコロンがありません。

score = 80

# 行末のコロンがないためエラーになる
if score >= 70
    print("合格です")

実行すると、「SyntaxError」が表示されます。

正しくは、条件の後ろにコロンを付けます。

score = 80

# 条件の末尾にコロンを付ける
if score >= 70:
    print("合格です")

「SyntaxError」は、プログラムの処理中ではなく、実行前にコードを読み込む段階で見つかるエラーです。

エラーメッセージの見方

SyntaxErrorが発生すると、問題のあるファイル名や行番号が表示されます。

File "main.py", line 3
    if score >= 70
                  ^
SyntaxError: expected ':'

このメッセージから、次の情報を確認できます。

  • エラーが見つかったファイル:「main.py」
  • Pythonが問題に気づいた行:「3行目」
  • 問題があると判断された位置:「^」の位置
  • エラーの内容:「コロンが必要」

最初に「line 3」のような行番号を確認し、次に「^」が示している周辺を見ましょう。

ただし、「^が示す場所が必ず間違いの原因とは限らない」点には注意が必要です。

Pythonがその位置まで読み進めて、初めて文法の不一致に気づくことがあるためです。原因が見つからない場合は、表示された行だけでなく、その一つ前の行も確認しましょう。

if文のコロンが抜けている

「if」「elif」「else」の末尾にはコロンが必要です。

temperature = 28

# コロンがないためエラーになる
if temperature >= 25
    print("暑い日です")

正しくは次のように書きます。

temperature = 28

# 条件の末尾にコロンを付ける
if temperature >= 25:
    print("暑い日です")

コロンは、「ここから条件が成立したときの処理が始まる」ことをPythonへ伝える記号です。

「if」以外にも、次のような文の末尾にはコロンを付けます。

  • 「for」
  • 「while」
  • 「def」
  • 「class」
  • 「try」
  • 「except」

末尾にコロンを付けたら、次の行をインデントすることも忘れないようにしましょう。

for文や関数のコロンが抜けている

「for文」のコロンが抜けた場合も、SyntaxErrorになります。

fruits = ["りんご", "みかん", "バナナ"]

# for文の末尾にコロンがない
for fruit in fruits
    print(fruit)

正しくは次のとおりです。

fruits = ["りんご", "みかん", "バナナ"]

# for文の末尾にコロンを付ける
for fruit in fruits:
    print(fruit)

関数を定義する「def」の末尾にもコロンが必要です。

# 関数名の後ろにコロンを付ける
def greet():
    print("こんにちは")

greet()

「処理のまとまりが次の行から始まる文にはコロンが必要」と考えると覚えやすくなります。

括弧が閉じられていない

開いた丸括弧を閉じ忘れると、SyntaxErrorになります。

name = "モトヤ"

# 閉じ括弧が不足している
print("こんにちは、" + name

Pythonのバージョンによっては、次のようなメッセージが表示されます。

SyntaxError: '(' was never closed

開いた括弧に対応する閉じ括弧を追加すると修正できます。

name = "モトヤ"

# 開き括弧と閉じ括弧をそろえる
print("こんにちは、" + name)

丸括弧だけでなく、リストの角括弧や辞書の波括弧も、開いたら閉じる必要があります。

# 括弧を正しく閉じる
numbers = [10, 20, 30]
user = {"name": "モトヤ", "age": 32}

print(numbers)
print(user)

コードが長い場合は、括弧の数を目で数えるよりも、対応する括弧を強調表示してくれるコードエディターを利用すると見つけやすくなります。

引用符が閉じられていない

文字列を囲む引用符が閉じられていない場合も、SyntaxErrorが発生します。

# 末尾のダブルクォーテーションがない
message = "Pythonを学習します

print(message)

正しくは、文字列の両側を同じ引用符で囲みます。

# 文字列の両側を引用符で囲む
message = "Pythonを学習します"

print(message)

文字列の中で同じ引用符を使う場合にも注意が必要です。

# 外側と内側で異なる引用符を使う
message = '先生が「Pythonを始めよう」と言いました'

print(message)

引用符を閉じ忘れると、Pythonが次の行まで文字列の続きとして読もうとする場合があります。

エラーが次の行に表示されていても、その前の行の引用符を確認しましょう。

=と==を間違えている

「=」は変数へ値を代入する記号です。「==」は、左右の値が等しいか比較する記号です。

条件式で「=」を使うと、SyntaxErrorになります。

score = 80

# 比較で=を使っているためエラーになる
if score = 80:
    print("80点です")

値を比較する場合は、「==」を使います。

score = 80

# 左右の値が等しいか比較
if score == 80:
    print("80点です")

2つの記号は役割が異なります。

  • 値を変数に入れる:「=」
  • 左右が等しいか調べる:「==」

条件式でSyntaxErrorが発生した場合は、比較演算子が正しいか確認しましょう。

カンマが抜けている

関数へ複数の値を渡すときや、リストの要素を並べるときは、値の間にカンマを入れます。

# 2つの変数を用意
name = "モトヤ"
age = 32

# 引数の間にカンマがないためエラーになる
print(name age)

正しくは次のように書きます。

name = "モトヤ"
age = 32

# 引数をカンマで区切る
print(name, age)

SyntaxErrorが発生した位置の直前に、変数や数値が続けて書かれている場合は、カンマや演算子が抜けていないか確認しましょう。

全角記号が混ざっている

日本語入力中にコードを書くと、全角の記号が混ざることがあります。

# 全角の括弧を使っているためエラーになる
print("こんにちは")

見た目は似ていますが、Pythonの記号には半角文字を使います。

# 半角の括弧を使用
print("こんにちは")

特に間違えやすい記号は次のとおりです。

  • 全角の「()」と半角の「()」
  • 全角の「:」と半角の「:」
  • 全角の「,」と半角の「,」
  • 全角の空白と半角の空白
  • 日本語用の引用符と半角の引用符

日本語入力を使った直後にエラーが発生した場合は、記号が半角になっているか確認しましょう。

予約語を変数名に使っている

Pythonで特別な意味を持つ単語を「予約語」と呼びます。

予約語は変数名として使用できません。

# classは予約語なので変数名にできない
class = "初心者向け講座"

print(class)

「class」はクラスを定義するときに使う予約語です。別の変数名へ変更しましょう。

# 予約語ではない変数名を使う
course_name = "初心者向け講座"

print(course_name)

代表的な予約語には、次のようなものがあります。

if
else
for
while
def
class
return
import
True
False
None

変数名を変更した直後にSyntaxErrorが出た場合は、その名前がPythonの予約語ではないか確認しましょう。

直前の行に原因がある場合

次のコードでは、Pythonが「print()」の行でエラーに気づく場合があります。

numbers = [10, 20, 30

# エラーの原因は一つ前の行にある
print(numbers)

問題は「print()」ではなく、その前の行でリストの閉じ括弧が抜けていることです。

# リストの閉じ括弧を追加
numbers = [10, 20, 30]

print(numbers)

SyntaxErrorが発生した行を何度見ても原因が分からないときは、次の順番で確認します。

  1. 「^」が示す位置を見る
  2. エラー行の先頭から末尾まで確認する
  3. 一つ前の行の括弧や引用符を見る
  4. さらに上の行で処理が閉じているか確認する

「エラーが表示された場所」と「間違いを書いた場所」は同じとは限りません。

Pythonは、文章を左から読んで意味が通らなくなった人のように、「これ以上は解釈できない」と判断した場所を示します。この考え方を知っていると、エラー行だけにこだわらず原因を探せます。

Pythonのバージョンが原因になる場合

使用しているPythonのバージョンでは対応していない書き方を使うと、SyntaxErrorが発生する場合があります。

例えば、「match文」はPython 3.10以降で利用できます。

status = 1

# Python 3.10以降で利用できる書き方
match status:
    case 1:
        print("処理中です")
    case 2:
        print("完了しました")

古いPythonで実行すると、この書き方を文法として認識できません。

使用中のPythonのバージョンは、次のコマンドで確認できます。

python --version

環境によっては、次のコマンドを使用します。

python3 --version

Webサイトや書籍のコードが正しく見えるのにSyntaxErrorが発生する場合は、対応するPythonのバージョンも確認しましょう。

SyntaxErrorとIndentationErrorの違い

「SyntaxError」と似たエラーに「IndentationError」があります。

  • 文法や記号に問題がある:「SyntaxError」
  • 行頭のインデントに問題がある:「IndentationError」

例えば、「if文」のコロンがない場合はSyntaxErrorです。

score = 80

# コロンがないためSyntaxErrorになる
if score >= 70
    print("合格です")

コロンはあるものの、次の行がインデントされていない場合はIndentationErrorです。

score = 80

if score >= 70:
# 字下げがないためIndentationErrorになる
print("合格です")

どちらもコードの実行前に見つかりますが、確認する場所が異なります。

SyntaxErrorでは記号や書き方を確認し、IndentationErrorでは行頭の空白を確認しましょう。

SyntaxErrorを直す順番

SyntaxErrorが発生したときは、次の順番で確認すると原因を見つけやすくなります。

  1. エラーメッセージの行番号を確認する
  2. 「^」が示す位置を見る
  3. コロンやカンマが抜けていないか確認する
  4. 括弧や引用符が閉じているか確認する
  5. 一つ前の行を確認する
  6. 全角記号が混ざっていないか確認する
  7. 予約語を変数名に使っていないか確認する
  8. Pythonのバージョンを確認する

一度にコード全体を書き直す必要はありません。

「エラーが示す行」「直前の行」「記号の組み合わせ」の順に狭い範囲から調べると、修正箇所を見失いにくくなります。

SyntaxErrorを防ぐ方法

SyntaxErrorを完全になくすことは難しいですが、次の方法で減らせます。

  • Visual Studio Codeなどのコードエディターを使う
  • 括弧や引用符は開いた直後に閉じる
  • コロンを書いたら改行してインデントする
  • 日本語入力から半角入力へ戻してから記号を書く
  • 一度に長いコードを書かず、少しずつ実行する
  • エディターの構文チェックや自動補完を利用する
  • サンプルコードの一部分だけをコピーしない

特に有効なのは、「少し書いたら実行する」ことです。

50行をまとめて書いてから実行すると、原因を50行の中から探すことになります。5行ずつ実行していれば、問題がある範囲を小さくできます。

SyntaxErrorは、知識不足だけで起きるエラーではありません。経験者でも括弧やコロンを打ち忘れることがあります。

エラーを出さないことより、「原因を狭い範囲から探せる書き方」を身につけることが大切です。

まとめ

「SyntaxError: invalid syntax」は、Pythonの文法として解釈できないコードがある場合に発生します。

主な原因は次のとおりです。

  • コロンが抜けている
  • 括弧が閉じられていない
  • 引用符が閉じられていない
  • 「=」と「==」を間違えている
  • カンマが抜けている
  • 全角記号が混ざっている
  • 予約語を変数名に使っている
  • Pythonのバージョンに対応していない

正しい「if文」の基本形は次のとおりです。

score = 80

# 条件の末尾にコロンを付ける
if score >= 70:
    print("合格です")
else:
    print("不合格です")

エラーが表示されたら、まず行番号と「^」の位置を確認します。そこで原因が見つからない場合は、一つ前の行にある括弧や引用符も調べましょう。

SyntaxErrorは、Pythonが「この書き方では意味を判断できない」と教えてくれている状態です。

エラーメッセージを失敗の通知として見るのではなく、「確認する範囲を示す手がかり」として利用すると、落ち着いて修正できるようになります。

この記事が役に立ったらシェア
  • URLをコピーしました!
この記事の内容