Agenda
• 諸注意
• Pythonの心得
• エラー処理
諸注意
• 提出前に必ず実行してください!
エラーがある場合はコメントアウト等,実行されないように
• 関数名指定にも関わらず,自分で関数名を決めている
どの問題なのか分からなくなるので,決められた名前を使ってくださ
い
• 関数をクォーテーションで囲んでいる
定義しただけでは実行されないので,クォーテーションで囲む意味は
ありません.労力の無駄です.
諸注意
• データの入力にinputやraw_inputを用いている
採点の際に非常に面倒なので,使うのをやめるか,コメントアウトし
てください
色々なパターンを試したいならば,テストケースを最初からプログラ
#1 def function(n): ... n = raw_input(‘n: ’) print function(n) #1 def function(n): ... # n = raw_input(‘n: ’) print function(5) print function(10)諸注意
• 関数は,中に必ず何かしら記述してください
中に何も記述がないと,エラーが発生します
解けない or 分からない場合は,関数自体を消すか,上記のように何
かを書いてください
#1 def function(): #2 ... #1 def function(): return #2 ... #1 def function(): pass #2 ...諸注意
• 「○○を返す関数を作成せよ」→関数内にprintを使っている
「○○を表示する関数」であればprintで構いませんが,
基本的に関数の中はreturn文を用いる
例:与えられた数の2倍を返す関数
#1 def double(n): print 2*n #1 def double(n): return 2*n諸注意
• どんな条件にも(理不尽なものは除く)対応できる解答をして
ください
例にあるものだけをクリアする解答は不正解です
4/27 No. 3「n の m 乗を返す関数 root」
例 → root(2, 2)とroot(100, 3)
mが2と3の時しか対応していない解答
5/11 No. 5「行列の掛け算を行う関数 matrix_product」
例 → 3×2の行列と2×2の行列の掛け算
それ以外の行列同士の掛け算に未対応
心得
• 組み込み関数を変数として用いない
sumやlistなどの予約語は変数に使わない
(IDLEで入力した時に色が変わる言葉)
使ってしまうと,sum関数やlist関数が使えなくなってしまいます
l = [1,2,3,4] sum = 0 for i in l: sum += i print sum print sum(l)エラー
心得
• 真偽値を活用する
小テストで「判定せよ」はTrueかFalseを返す
真偽値(True, False)は,特殊なキーワード
文字列ではなくTrue, Falseそれ自身を使うクセをつける
def func(): ... return ‘True’ def func(): ... return True心得
• PEP8にしたがってプログラムを記述する
PEP8とはPythonを記述する上での,守るべきルール
https://www.python.org/dev/peps/pep-0008/
>>>import pep8 >>>check = pep8.Checker(ファイル名) >>>check.check_all() ... 何行目にどのようなルール違反があるか教えてくれる心得
• PEP8にあるルールの例
カンマの後ろは必ず半角スペース
変数名はすべて小文字とアンダーバー
クラス名とエラー名のみ大文字を使う
l = [1, 2, 3, 4] sum_of_num = 0 class MyClass: ...エラー処理
エラー処理
よくあるエラー
• AttributeError
• ImportError
• IndexError
• KeyError
• NameError
• RuntimeError
• SyntaxError
• IndentationError
• TypeError
• ValueError
• UnboundLocalError
• ZeroDivisionError
エラー処理
• 人に聞く前に,「どういうエラーなのか」,「おかしい場所は
どこか」を理解する
エラーが発生した直前にどのような処理をしたのかが書いてある
Traceback (most recent call last):
File "<pyshell#18>", line 1, in <module> print 6 + '7'
TypeError: unsupported operand type(s) for +: 'int' and 'str'
何行目で発生したのか
AttributeError
• 属性の参照や代入のエラー(属性→クラスのスライドを参照)
変数i(整数型)はsquareという属性を持っていない
>>>i = 0
>>>i.square
Traceback (most recent call last):
File "<pyshell#20>", line 1, in <module> i.square
ImportError
• モジュールがインポートできなかったときのエラー
numpiというモジュールは存在しない
>>>import numpi
Traceback (most recent call last):
File "<pyshell#21>", line 1, in <module> import numpi
IndexError
• 配列のインデックスに関するエラー
リストlの長さを超えて,printしようとしている
>>>l = [1,2,3] >>>for i in range(5): print l[i], 1 2 3Traceback (most recent call last):
File "<pyshell#25>", line 2, in <module> print l[i],
KeyError
• 存在しないキーを指定してしまったエラー
辞書dは2というキーを持っていない
>>>d = {0: 0, 1: 1} >>>d[2]
Traceback (most recent call last):
File "<pyshell#33>", line 1, in <module> d[2]
NameError
• 名前が見つからなかったときのエラー
zという変数は存在しない(定義されていない)
>>>z
Traceback (most recent call last):
File "<pyshell#34>", line 1, in <module> z
RuntimeError
• 主に無限ループが発生した時に出るエラー
無限ループは非常に厄介なので,細心の注意を払ってください
>>>def a(): return a() >>>a()Traceback (most recent call last): File "<pyshell#41>", line 2, in a
return a()
SyntaxError
• 構文エラー
for文の終わりにコロンがない
Pythonの文法が間違っている,一番しょうもないエラー
>>>for i in range(5)
IndentationError
• 正しくないインデントに関するエラー
for文の中身のインデントが下げられていない
>>>for i in range(5): print i
File "<pyshell#45>", line 2 print i
^
TypeError
• 正しくない型に対して演算等の処理が行われたときのエラー
整数型(int)と文字列型(str)は足し算できない
>>>6 + ‘7’
Traceback (most recent call last):
File "<pyshell#18>", line 1, in <module> print 6 + '7'
TypeError
• 正しくない型に対して演算等の処理が行われたときのエラー
リスト(list)は辞書のキーとして使えない
>>> d = {(0, 1): 100, [2, 3]: 200}
Traceback (most recent call last):
File "<pyshell#47>", line 1, in <module> d = {(0, 1): 100, [2, 3]: 200}
ValueError
• 型は正しいが,適切じゃない値の処理が行われたときのエラー
int関数は文字列を引数にとれるが,‘ten’は処理できない
( int(‘10’)は可能 )
>>>int(‘ten’)
Traceback (most recent call last):
File "<pyshell#56>", line 1, in <module> int('ten')
UnboundLocalError
• 変数が定義される前に使用してしまっている時などのエラー
関数func内で,変数cが定義される前にcを使用している
>>>def func(): a = 2*c c = 100 return a >>>func()Traceback (most recent call last):
File "<pyshell#62>", line 1, in <module> func()
File "<pyshell#61>", line 2, in func a = 2*c
ZeroDivisionError
• 除法やモジュロ演算の第2引数が0のときのエラー
100を0で割ってしまっている
>>>100 / 0
Traceback (most recent call last):
File "<pyshell#63>", line 1, in <module> 100 / 0
クラス
クラス
• 大量のデータを扱う...
• たくさんの変数や関数を扱う...
• 自分だけでなく,人が使うプログラムを書く...
クラスを使うことで,理解しやすいプログラムになる
(意味がわかりやすくなる)
クラス
2人の男の子がいる
名前:Tomoki 年齢:16 国籍:JAPAN 身長:173 体重:63 テストの点数 数学:70 理科:70 英語:80 名前:Yusuke 年齢:17 国籍:CANADA 身長:168 体重:70 テストの点数 数学:50 理科:70 英語:100クラス
• 基本的な書き方
Studentクラスが作れた
クラス名は,単語の先頭を大文字で書くのが一般的
• どのように使うか
変数s1がStudentクラスのインスタンス(instance;直訳:実例)に
なる
class Student: pass s1 = Student()クラス ーメソッド
• メソッドを定義する
クラスの中に定義した関数を メソッド(method) と呼ぶ
メソッドの第1引数は
self
(コンストラクタと同じ)
「インスタンス自身を引数に入れる」という意味
Name属性に指定した名前が代入される
class Student:def set_name(self, name): self.name = name
def print_name(self):
print ‘Name: ’+self.name
self.(変数名)で表されたものを 属性あるいはインスタンス変数と呼ぶ
クラス ーメソッド
>>>s1 = Student() >>>s1.name
Traceback (most recent call last):
File "<pyshell#16>", line 1, in <module> s1.name
AttributeError: student instance has no attribute 'name'
>>>s1.set_name(‘Tomoki’) >>>s1.name ‘Tomoki’ >>>s1.print_name() ‘Name: Tomoki’ 最初はname属性は定義されてないのでエラー set_nameメソッドでname属性に名前 を入れたので,エラーは出ない
クラス ーメソッド
• テスト結果を入れる関数,平均を求める関数を作ってみる
class Student: ...
def test(self, result): self.math = result[0]
self.science = result[1] self.english = result[2] def average(self):
クラス ーメソッド
クラスの外にaverage関数を作るのと比べると,メソッドの中に引数
が必要ないので楽
>>>s1.test([70,70,80]) >>>s1.math 70 >>>s1.english 80 >>>s1.average() 73.33333333333333クラス ーコンストラクタ
• 初期値を与える
__init__
関数(コンストラクタ)を定義することで,このクラスを
作るときに
必ず
最初に行う処理を決めることができる
上の例では,Studentクラスを作るときに
必ず
name引数が必要
class Student:def __init__(self,name): self.name = name
>>>s1 = Student(‘Tomoki’) >>>s1.name
クラス ーコンストラクタ
• その他の情報も付け加えると...
名前,年齢,国籍,身長,体重を最初に入れないとインスタンスが作
れない
class Student:
def __init__(self,name,age,nation,height,weight): self.name = name
self.age = age
self.nationality = nation self.height = height
クラス ーコンストラクタ
• 実際に使ってみると
>>>s1 = Student(‘Tomoki',16,‘JAPAN',173,63) >>>s1.age 16 >>>s1.nationality ‘JAPAN’ >>>s1.height 173 >>>s1.weight 63クラス ーメソッド
• ちょっと遊んでみる
class Student: ...
def diet(self):
from random import randrange
degree = randrange(-0.2, 0.2, _int=float) self.weight += degree * self.weight
-20%~20%の間で ランダムに体重が増減
クラス ーメソッド
• ちょっと遊んでみる
>>>s2 = Student(‘Yusuke',17,‘CANADA',168,70) >>>s2.weight 70 >>>s2.diet() >>>s2.weight 79.6518923362約13%の体重増
クラス ー特殊メソッド
• コンストラクタの他にも,
特殊メソッド
がたくさん
インスタンスをprintしたときにどう表示されるかを変更
class Student: ... def __str__(self):return 'Name: {}¥nAge: {}'.format(self.name,self.age)
>>>print s1 Name: Tomoki Age: 16
クラス ー特殊メソッド
• 自分用の MyList クラスを作ってみる
リストを足し算したら,要素同士の足し算ができるようにしたい
class MyList: def __init__(self,l): self.list = ldef __add__(self,other): new_list = []
for i,j in zip(self.list, other.list): new_list.append(i+j)
return new_list
特殊メソッド__add__を使うと,