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

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

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

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

解決済

3回答

959閲覧

Classを用いたときにエラーがでる

退会済みユーザー

退会済みユーザー

総合スコア0

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

0グッド

0クリップ

投稿2018/06/07 09:01

編集2018/06/07 09:09

生徒番号、名前、テストの点数が書かれたテキストファイルを引数として読み込んで、ある書式で出力するというコードを書いています。

テキストファイルは以下のような例です。

123 山田 10 456 高橋 20 789 鈴木 0 321 田中 30

Python

1#coding:utf-8 2 3import sys 4file = open(sys.argv[1], "r") 5 6class Record(): 7 def __init__(self, num:int, name:str, score:int): 8 self.num = num 9 self.name = name 10 self.score = score 11 12data = [Record(num,name,score)] 13 14def printdata(): 15 for r in data[0:]: 16 print("{:4d},{:16s},{:3d}".format(r.num, r.name, r.score)) 17 18printdata() 19

これで実行した場合、

Traceback (most recent call last): File "ex07-1.py", line 12, in <module> data = [Record(num,name,score)] NameError: name 'num' is not defined

以上のようなエラーが出ていまいち対処法がわかりません。
定義されていないということはどういうことでしょうか。

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

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

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

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

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

LouiS0616

2018/06/07 09:03

『テキストファイルからデータを読み込む』とは、何を意味しているのでしょうか。詳しく追記して下さい。
退会済みユーザー

退会済みユーザー

2018/06/07 09:04

字足らずで申し訳ございません。修正いたします。
guest

回答3

0

numが定期されているであろうRecordクラスの__init__のスコープから抜けているので、もう触れません、という話なのですが・・・(だからって中に入れようとか思わないでくださいね)。
他にもいろいろ懸念が生じてしまうコードだったので、ツッコミ入れます。

python

1#coding:utf-8 2 3import sys 4file = open(sys.argv[1], "r") # せっかくopenしたのに以下で一回も使ってない(あとcloseもしてください) 5 6class Record(): # そもそもこれだけの処理にクラス作る意味って。この使い方なら精々tupleかdictで十分なのでは 7 def __init__(self, num:int, name:str, score:int): 8 self.num = num 9 self.name = name 10 self.score = score 11 12data = [Record(num,name,score)] # 本来はファイルを読み込む処理などが入るであろう場所、せめてリスト内包表記か何かであってほしかったのに要素数1のリストって・・・(numの件にはもう触れません) 13 14def printdata(): 15 for r in data[0:]: # [0:]とか要ります? 16 print("{:4d},{:16s},{:3d}".format(r.num, r.name, r.score)) 17 18printdata()

投稿2018/06/07 10:23

hayataka2049

総合スコア30933

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

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

退会済みユーザー

退会済みユーザー

2018/06/07 10:27

ご回答誠にありがとうございました。
guest

0

ファイル読込処理はおいといて。
クラス定義部分でのnumとメインの処理部分でのnumは別物です。
よって提示エラー(定義されていません)が発生しています。

Python

1# これはクラスの定義 2class Record(): 3 def __init__(self, num:int, name:str, score:int): 4 self.num = num 5 self.name = name 6 self.score = score 7 8# ここからがメインの処理 9 10# 以下で使われる変数を用意(define)する 11num = 123 12name = '山田' 13score = 10 14 15data = [Record(num,name,score)] # 変数が定義されているのでOK 16 17# Recordに実値を渡すほうが分かりやすい 18data.append(Record(456,'高橋',20)) 19 20# これは関数の定義 21def printdata(): 22 for r in data[0:]: 23 print("{:4d},{:16s},{:3d}".format(r.num, r.name, r.score)) 24 25# これもメインの処理 26printdata()

投稿2018/06/07 09:31

can110

総合スコア38262

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

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

退会済みユーザー

退会済みユーザー

2018/06/07 10:28

クラス部分とメイン部分の違い理解できました。。 ご回答有り難うございました。
guest

0

ベストアンサー

なんというか、いろいろとツッコミどころがあります。

  • 逆に、なぜnumなどが既に定義されていると仮定できるのか?
  • テキストファイルの数字がなぜ全角?
  • printdataを関数として定義する意義がいまいちわからない

たぶん

こういうコードを書きたかったのかと推測します。

Python

1#coding:utf-8 2 3import sys 4 5file = open(sys.argv[1], "r") 6 7class Record(): 8 def __init__(self, num:int, name:str, score:int): 9 self.num = num 10 self.name = name 11 self.score = score 12 13data = [] 14for row in file: 15 num, name, score = row.split() 16 num = int(num) 17 score = int(score) 18 data.append(Record(num, name, score)) 19 20file.close() 21 22 23def printdata(): 24 for r in data[0:]: 25 print("{:4d},{:16s},{:3d}".format(r.num, r.name, r.score)) 26 27printdata()

実行結果 Wandbox

123,山田 , 10 456,高橋 , 20 789,鈴木 , 0 321,田中 , 30

比べやすくするために、変更は最小限にしています。
どこが変なのか見比べてみてください。


なお、私ならこんな風に書きます。Wandbox

投稿2018/06/07 09:27

編集2018/06/07 09:52
LouiS0616

総合スコア35660

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

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

退会済みユーザー

退会済みユーザー

2018/06/07 10:25

遅くなってしまい申し訳ありませんでした。 ご回答ご指摘誠にありがとうございました。
退会済みユーザー

退会済みユーザー

2018/06/07 10:25

遅くなってしまい申し訳ありませんでした。 ご回答ご指摘誠にありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問