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

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

新規登録して質問してみよう
ただいま回答率
85.48%
Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

2回答

10518閲覧

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

ridyoshi

総合スコア15

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2019/03/19 04:26

前提・実現したいこと

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

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

Python3

1class Rectangle: 2 recs = [] 3 4 def __init__(self, w, l): 5 self.width = w 6 self.len = l 7 self.recs.append((self.width, self.len)) 8 9 def print_size(self): 10 print("""{} by {}""".format(self.width, self.len)) 11 12 13r1 = Rectangle(10, 24) 14r2 = Rectangle(20, 40) 15r3 = Rectangle(100, 200) 16 17print(Rectangle.recs)
SyntaxError: invalid syntax

該当のソースコード

ソースコード

試したこと

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

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

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

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

quickquip

2019/03/19 04:28

IDLEをお使いなのでは? (どう実行しているかを質問に追記してください)
y_waiwai

2019/03/19 04:42

どの行でそのエラーが出ているんでしょうか
tiitoi

2019/03/19 04:54

特に構文エラーがあるようには見受けられないですね オンラインの実行環境でもコピペで動いています https://onlinegdb.com/Sk2yUlCvE
t_obara

2019/03/19 05:10

print("""{} by {}""" これは実際のこの通りにしているのでしょうか? なぜ3つ重ねているのでしょう?
ridyoshi

2019/03/19 05:27

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

2019/03/19 05:28

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

2019/03/19 05:32

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

回答2

0

ベストアンサー

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

理由は

  • (A) 手で打ち込む際に前の行に戻って編集できない

編集が可能なのはENTERを押す以前の入力中の行のみです。

  • (B) 手で打ち込む際の自動インデントが「4つの空白文字でなく、1つのタブ文字」

見た目のカラム位置と論理的な「字下げ位置」の違いが非常にわかりにくいです。見た目ではなく「論理的な字下げがどうなっているか」を正確に把握しないと正しくコード入力することはできません。

  • (C) クラス定義など途中に空行があるものをそのままの形では手入力できない

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

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

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

REPL

1>>> class Rectangle: 2 recs = [] 3 4 def __init__(self, w, l): 5 self.width = w 6 self.len = l 7 self.recs.append((self.width, self.len)) 8 9 def print_size(self): 10 print("""{} by {}""".format(self.width, self.len)) 11 12 13r1 = Rectangle(10, 24) 14SyntaxError: invalid syntax 15>>>

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

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

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

REPL

1>>> class Rectangle: 2 recs = [] 3 4 def __init__(self, w, l): 5 self.width = w 6 self.len = l 7 self.recs.append((self.width, self.len)) 8 9 def print_size(self): 10 print("""{} by {}""".format(self.width, self.len)) 11 12 13>>> r1 = Rectangle(10, 24) 14>>> r2 = Rectangle(20, 40) 15>>> r3 = Rectangle(100, 200) 16>>> print(Rectangle.recs) 17[(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でかまわない)がお勧めです。機能が豊富なだけにインストールや使い方を覚えるのに若干苦労するかも知れませんが...

投稿2019/03/20 02:18

編集2019/03/20 02:20
KSwordOfHaste

総合スコア18394

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

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

投稿2019/03/20 05:10

YakumoSaki

総合スコア2027

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問