質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

87.59%

Pythonの「invalid syntax」エラーの原因がわかりません。

解決済

回答 2

投稿

  • 評価
  • クリップ 0
  • VIEW 4,306

score 14

前提・実現したいこと

「独学プログラマーPython」で勉強しているものです。p172の下記のコードを打ったのですが、「SyntaxError: invalid syntax」という構文エラーが出てしまいました。空白やタイプミスなどを念入りに調べたのですが、一向に解決しないのでお力をお貸しいただきたいです。

発生している問題・エラーメッセージ

class Rectangle:
    recs = []

    def __init__(self, w, l):
        self.width = w
        self.len = l
        self.recs.append((self.width, self.len))

    def print_size(self):
        print("""{} by {}""".format(self.width, self.len))


r1 = Rectangle(10, 24)
r2 = Rectangle(20, 40)
r3 = Rectangle(100, 200)

print(Rectangle.recs)
SyntaxError: invalid syntax

該当のソースコード

ソースコード

試したこと

空白やタイプミスをしっかり探し、教科書通りになるようにしました。エラーが出る時にr1のところが赤くなりますが、ネットでいろいろ調べてもその原因が何なのかわかりませんでした。何が悪かったのか、また、どうすればよいのか教えていただけると幸いです。

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • ridyoshi

    2019/03/19 14:27

    追記です。
    Windows10にて、IDLE(Python 3.7 32-bit)を使用しています。エラーが出ている行は、「r1 = Rectangle(10, 24)」です。「print("""{} by {}"""」は著者が同頁の参考としてネットにあげているものを引用しましたが、一つだけの場合でも全く同じ行でエラーが起きます。なぜ三つなのかは、すいません、私自身まだ勉強不足で分かっておりません。

    キャンセル

  • quickquip

    2019/03/19 14:28

    質問に追記してください と書いたはずですが。

    キャンセル

  • tiitoi

    2019/03/19 14:32

    IDLE は数行のちょっとしたコードを実行するだけならいいですが、クラス作ったりと少し長めのコードを書くなら、やめたほうがいいと思いますが。

    キャンセル

回答 2

checkベストアンサー

+2

質問者さんはIDLEのREPLをお使いなのでしょう。tiitoiさんが質問コメントされているようにIDLEのREPLは「複数行のPythonのプログラムを入力する」のには向いていません。

理由は

  • (A) 手で打ち込む際に前の行に戻って編集できない
    編集が可能なのはENTERを押す以前の入力中の行のみです。

  • (B) 手で打ち込む際の自動インデントが「4つの空白文字でなく、1つのタブ文字」
    見た目のカラム位置と論理的な「字下げ位置」の違いが非常にわかりにくいです。見た目ではなく「論理的な字下げがどうなっているか」を正確に把握しないと正しくコード入力することはできません。

  • (C) クラス定義など途中に空行があるものをそのままの形では手入力できない
    空行のままENTERを打鍵するとそこで「文の終わり」とみなされclass定義が途中で終わってしまいます。そのため不必要な空行は「省く」という配慮が必要です。文法について知識が曖昧な段階の初心者の方には「非常にわかりにくい」だろうと思います。

  • (D) コピー&ペーストで複数行をペーストすれば(C)は回避できるが「ペーストできるのはあくまで単一の文の範囲」

質問者さんはご質問にあるコード全体をコピー&ペーストでREPL上へペーストしてしまい(D)の制限にひっかかってしまったのだろうと思います。

>>> class Rectangle:
    recs = []

    def __init__(self, w, l):
        self.width = w
        self.len = l
        self.recs.append((self.width, self.len))

    def print_size(self):
        print("""{} by {}""".format(self.width, self.len))


r1 = Rectangle(10, 24)
SyntaxError: invalid syntax
>>> 


IDLEのREPLには(D)の制約があるため「複数の文で構成されたプログラムをそのまま入力する」には向かないということがおわかりでしょうか?どうしても入力するというのであれば元のプログラムを「文単位にコピー&ペースト」しないといけません。本件の例ですと5個の文があります。

・class定義文
・r1への代入文
・r2への代入文
・r3への代入文
・print関数の呼び出し式(単一の式は単一の文とみなされます)

上記5つをそれぞれ別々にコピー&ペーストすれば次のような結果が得られます。

>>> class Rectangle:
    recs = []

    def __init__(self, w, l):
        self.width = w
        self.len = l
        self.recs.append((self.width, self.len))

    def print_size(self):
        print("""{} by {}""".format(self.width, self.len))


>>> r1 = Rectangle(10, 24)
>>> r2 = Rectangle(20, 40)
>>> r3 = Rectangle(100, 200)
>>> print(Rectangle.recs)
[(10, 24), (20, 40), (100, 200)]


しかしPythonに慣れた人であってもこの入力方法は「大変鬱陶しく、あまりやりたくない」作業です。

IDLEのREPLは何のために使うかといえば「せいぜい数行程度の単純な関数を定義」したり「単一の式」を入力してその結果の値を見るといった「単純な確認」が目的です。プログラムは複数の文で構成されているのが普通ですのでREPLにはちょっと荷が重いのです。

対処:

プログラムを入力するのであれば「REPL」ではなくエディターを使いましょう。IDLEでもエディターが使えます。REPLのウィンドウ(IDLEを起動したときに最初に表示される"Python 3.7.0 Shell"のようなタイトルのウィンドウ)のメニューから

File > New File
or
File > Open...
or
File > Recent Files > 最近編集したファイルを一つ選択

などとすればエディターウィンドウが表示されますので、そこでプログラムを編集しましょう。
そこでプログラムを一通り入力し終わったらエディターウィンドウにあるメニューで

Run > Run Module

を選ぶと「実行」できます。実行結果が期待どおりでなければエディター画面上でコードを修正しセーブしてから上記メニューで何度でも実行しなおせます。まずはIDLEのそういう使い方を覚えるのがよいでしょう。


IDLEはPythonを始める際に最初に使うツールだと思います。エディターと簡単なデバッガーの機能があり機能は非常に単純ですがそれだけに使い方を覚えるのにそれほど苦労はしないでしょう。しかしある程度慣れてきて大き目のプログラム(数十行とか数百行)を動かそうとするなら他のもっと強力な開発ツールを使ってみることもよいでしょう。個人的にはPyCharm(無料版のCommunity Editionでかまわない)がお勧めです。機能が豊富なだけにインストールや使い方を覚えるのに若干苦労するかも知れませんが...

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

質問のプログラムを保存して実行したところ正常に動作しました。
プログラムに問題はないように思えるので、KSwordOfHaste さんの解答の通り、エディタ等を
お使いになるとよろしいかと思います。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 87.59%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る