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

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

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

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

Q&A

解決済

3回答

1301閲覧

Python Class 構文のエラー内容と見つけ方を教えてください。

mannah

総合スコア5

Python

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

0グッド

0クリップ

投稿2020/08/17 13:09

class Student: def __init__(self, name): self.name = name def calculate_avg(self, data): sum = 0 for num in data: sum += num avg =sum/len(data) return avg def judge(self, avg): if(avg >= 60): result = "passed" else: result = "failed" return result a001 = Student("sato") data = [70,65,50,90,30] avg = a001.calculate_avg(data) judge_result = a001.judge print(avg) print(a001.name + judge_result)

visual studio code (windows 10)利用しています。
下記教えてください。

(1)
avg =sum/len(data)
の箇所で下記構文エラーが起きております。
”unindent does not match any outer indentation level (<unknown>, line 12)”

構文見直してもインデントなどに問題ないように感じますが、
原因おしえていただけますでしょうか。

別質問でクラスの理解についても進めているので、
この原因解決をしてから学習を進める予定です。確認お願いします。

(2)今回の構文エラーに気付くためのソースコードの追い方(確認方法)を教えてください。

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

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

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

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

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

guest

回答3

0

avg =sum/len(data)
return avg
この2行だけ、インデントが少し浅くみえます。
tabでなくspaceとかで調整されてないでしょうか。

投稿2020/08/17 13:31

jeanbiego

総合スコア3966

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

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

mannah

2020/08/18 11:30

ありがとうございました!インデント直したらいけました。
guest

0

ベストアンサー

”unindent does not match any outer indentation level (<unknown>, line 12)”
こちらはインデントがずれている場合に排出されるエラーです。
12,13行目の文頭のインデント半角スペース1つ分ずれていました。
インデントは半角スペース4つ分のTABを使用しましょう。

次に、再びスクリプトを実行すると27行目のavgは正しく出力できているが、28行目で再びエラーが生じるかと思います。
TypeError: can only concatenate str (not "method") to str

一つずつprint()を使用して紐解いて行きましょう。
まずはprint(a001.name)
→こちらは正しくsatoと出力されるはずです。

次にprint(judge_result)
<bound method Student.judge of <__main__.Student object at 0x000001956EC92BB0>>と出力され、そもそもjudge_resultが正常に代入できていなかったことがわかります。

そうなると25行目で行った代入の構文にエラーが有るということになります。
25行目では、Studentクラス内で定義したjudge関数を用いており、judge関数では引数にavgを受け取る様に構成されていますが、実際に25行目では引数を与えず関数を実行してしまっています。
エラーの原因の大元はここにあります。

python

1judge_result = a001.judge(avg)

と正しく引数を与えてあげることで、正常にコードは実行されます。

投稿2020/08/17 13:30

nto

総合スコア1438

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

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

mannah

2020/08/18 11:31

大変わかりやすかったです。ありがとうございました!
guest

0

以下のエラーが起きている箇所とその下の行ですが、1マスだけ左にずれています

python

1avg =sum/len(data) 2return avg

また、これを修正しても以下のエラーが発生します

bash

1Traceback (most recent call last): 2 File ".\test.py", line 27, in <module> 3 print(a001.name + judge_result) 4TypeError: can only concatenate str (not "method") to str

これは24行目で

python

1judge_result = a001.judge

として、judge_resultに関数そのものを格納しているため、結果として27行目で文字列と関数を足している為発生しています

本来であれば

python

1judge_result = a001.judge(avg)

とし、app1.judgeには引数を与えた上で関数の実行結果を変数に格納すべきです

一応、エラーなく動くことの確認できたソースを記載しておきます

python

1class Student: 2 3 def __init__(self, name): 4 self.name = name 5 6 def calculate_avg(self, data): 7 sum = 0 8 9 for num in data: 10 sum += num 11 avg =sum/len(data) 12 return avg 13 14 def judge(self, avg): 15 if(avg >= 60): 16 result = "passed" 17 else: 18 result = "failed" 19 return result 20 21a001 = Student("sato") 22data=[70,65,50,90,30] 23avg = a001.calculate_avg(data) 24judge_result = a001.judge(avg) 25 26print(avg) 27print(a001.name + judge_result)

追記
書き忘れましたが、エラーの見つけ方についてです
まず、PCは嘘はつかないので、インデントがおかしいと言われたら、あっているように見えても注意深く探しましょう
また、vscodeではそういった些細なミスを見つけやすくするツールがたくさんあるので導入するのもおすすめです
インデントを色わけして見やすく教えてくれるindent-rainbowや
タイポを検知してくれるspellcheckerなどです
また、prettierなど、自動でソースを整形してくれるlintツールも導入するとより実践的です

投稿2020/08/17 13:30

編集2020/08/17 13:34
pen_ari

総合スコア50

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

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

mannah

2020/08/18 11:32

indent-rainbow、spellchecker入れます! 回答もありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問