オープンコースウエア 大学名:MIT
講座名:6.00 Introduction to Computer Science and Programming
講義日:2008年10月28日(火曜日) ― 第9週・1回目
担当教授:Prof. Grimson
全講義数:24コマ
各講義時間:60分
配信開始日:2009年8月19日
講義ビデオソース:Youtube
講義ビデオ収録時間:50分38秒
サブタイトル:有
ジャンル: オブジェクト指向プログラミング、クラステンプレート、クラスメソッド、オペレータオーバーローディング
ビデオ画像品質5段階評価:4
(解像度が480pあり、コンピュータ画面に表示されたソースコードを比較的はっきりと読み取ることができます。)
ビデオ音声品質5段階評価:5 グリムソン教授の発声、とてもめりはりがついているため、YoutubeのCC機能(キャプションソフトウエア機能)を
オンにしてサブタイトルを表示すると、ほぼ正確に話した言葉が表示されています。
講義コメント:
第15回目の講義は、前回および前々回で学習したオブジェクト指向プログラミングの、内容的には山場となっています。
グリムソン教授再登場で、グターグ教授とはまた一味違ったアプローチで、オブジェクト指向プログラミングの理論的側面を捉えつつ、
基本的なクラスやメソッドをPythonでプログラムを組んで教えています。
主なクラスメソッド
__init__ - Create instance
__str__ - string (printed representation)
__cmp__ - compare
__eq__ - same
プログラミングのスタイルとして、
class cPoint:
def __init__(self,x,y):
self.x = x
self.y = y
self.radius = math.sqrt(self.x*self.x + self.y*self.y)
self.angle = math.atan2(self.y,self.x)
や、
class pPoint:
def __init__(self,r,a):
self.radius = r
self.angle = a
self.x = r * math.cos(a)
self.y = r * math.sin(a)
のように、クラス定義の最初に Create instanceのクラスメソッドを入れるやり方です。これは、入れておかないとプログラムが動かないというわけではないが、
プログラミングの実践として身につけておいたほうが良い。
注意事項としてOperator overloading
直交座標と極座標どちらの座標システムを用いても、平面上の点Pを扱えるプログラムを、
Pythonプログラムの例としてオブジェクト指向で実装して、講義内で詳しく説明している。
この、「直交座標と極座標どちらの座標システムを用いても、平面上の点Pを扱えるプログラム」の例はリーディングアサイメントHow to Think Like a Computer ScientistのChapter12からChapter16と連動している。
講義のペースがとても速いのは、講義に出てくる前に予習として、How to Think Like a Computer ScientistのChapter12からChapter16をしっかりと読み込んできていることが前提となっているようだ。
-------------------------------------------------
Lecture 15 Hand out 補助教材 ダウンロード
Lecture 15 ホームワーク ダウンロード
MIT 6.00 講座のプログラムも含んだ資料のダウンロード
-------------------------------------------------
-------------------------------------------------
講義で取り上げたPythonコードの例
例-1
import math
## points as lists
def addPoints(p1,p2):
r = []
r.append(p1[0]+p2[0])
r.append(p1[1]+p2[1])
return r
p = [1,2]
q = [3,1]
r = addPoints(p,q)
print r
## points as classes
class cartesianPoint:
pass
cp1 = cartesianPoint()
cp2 = cartesianPoint()
cp1.x = 1.0
cp1.y = 2.0
cp2.x = 1.0
cp2.y = 3.0
def samePoint(p1,p2):
return (p1.x == p2.x) and (p1.y == p2.y)
def printPoint(p):
print '(' + str(p.x) + ', ' + str(p.y) + ')'
class polarPoint:
pass
pp1 = polarPoint()
pp2 = polarPoint()
pp1.radius = 1.0
pp1.angle = 0
pp2.radius = 2.0
pp2.angle = math.pi / 4.0
class cPoint:
def __init__(self,x,y):
self.x = x
self.y = y
self.radius = math.sqrt(self.x*self.x + self.y*self.y)
self.angle = math.atan2(self.y,self.x)
def cartesian(self):
return (self.x, self.y)
def polar(self):
return (self.radius, self.angle)
def __str__(self):
return '(' + str(self.x) + ', ' + str(self.y) + ')'
def __cmp__(self,other):
return (self.x == other.x) and (self.y == other.y)
class pPoint:
def __init__(self,r,a):
self.radius = r
self.angle = a
self.x = r * math.cos(a)
self.y = r * math.sin(a)
def cartesian(self):
return (self.x, self.y)
def polar(self):
return (self.radius, self.angle)
def __str__(self):
return '(' + str(self.x) + ', ' + str(self.y) + ')'
def __cmp__(self,other):
return (self.x == other.x) and (self.y == other.y)
class Segment:
def __init__(self,start,end):
self.start = start
self.end = end
def length(self):
return math.sqrt( ((self.start.x - self.end.x) *
(self.start.x - self.end.x))
+ ((self.start.y - self.end.y) *
(self.start.y - self.end.y)))
p1 = cPoint(3.0, 4.0)
p2 = cPoint(5.0, 7.0)
s1 = Segment(p1,p2)
print s1.length()
class Rectangle:
def __init__(self,width,height,corner):
self.width = width
self.height = height
self.corner = corner
def findCenter(box):
p = cPoint(box.corner.x + box.width/2.0,
box.corner.y - box.height/2.0)
return p
box = Rectangle(100,200,p1)
print findCenter(box)
def growRect(box, dwidth, dheight):
box.width = box.width + dwidth
box.height = box.height + dheight
growRect(box,10,20)
print findCenter(box)
class newPoint:
def __init__(self,x = 0,y = 0):
self.x = x
self.y = y
def __str__(self):
return '(' + str(self.x) + ', ' + str(self.y) + ')'
def __eq__(self,other):
return (self.x == other.x) and (self.y == other.y)
def __add__(self, other):
return newPoint(self.x + other.x, self.y + other.y)
def __cmp__(self,other):
return self.x < other.x and self.y < other.y
origin = newPoint()
p1 = newPoint(3.0,4.0)
p2 = newPoint()
p3 = p1+p2
print p3
print p1 < p2
例-1の実行結果
>>>
[4, 3]
3.60555127546
(53.0, -96.0)
(58.0, -106.0)
(3.0, 4.0)
False
>>>
例-1のプログラムが実行時に使用したメソッドの出力
>>> dir
<built-in function dir>
>>> dir(p) ##what are all the methods associatd with a varialbe p
['__add__', '__class__', '__contains__', '__delattr__', '__delitem__', '__delslice__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__getslice__', '__gt__', '__hash__', '__iadd__', '__imul__', '__init__', '__iter__', '__le__', '__len__', '__lt__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__reversed__', '__rmul__', '__setattr__', '__setitem__', '__setslice__', '__sizeof__', '__str__', '__subclasshook__', 'append', 'count', 'extend', 'index', 'insert', 'pop', 'remove', 'reverse', 'sort']
>>> dir(1) ## what are all the methods associated with an integer 1
['__abs__', '__add__', '__and__', '__class__', '__cmp__', '__coerce__', '__delattr__', '__div__', '__divmod__', '__doc__', '__float__', '__floordiv__', '__format__', '__getattribute__', '__getnewargs__', '__hash__', '__hex__', '__index__', '__init__', '__int__', '__invert__', '__long__', '__lshift__', '__mod__', '__mul__', '__neg__', '__new__', '__nonzero__', '__oct__', '__or__', '__pos__', '__pow__', '__radd__', '__rand__', '__rdiv__', '__rdivmod__', '__reduce__', '__reduce_ex__', '__repr__', '__rfloordiv__', '__rlshift__', '__rmod__', '__rmul__', '__ror__', '__rpow__', '__rrshift__', '__rshift__', '__rsub__', '__rtruediv__', '__rxor__', '__setattr__', '__sizeof__', '__str__', '__sub__', '__subclasshook__', '__truediv__', '__trunc__', '__xor__', 'conjugate', 'denominator', 'imag', 'numerator', 'real']
>>> dir('1') ## what are all the methods associated with a string '1'
['__add__', '__class__', '__contains__', '__delattr__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__getnewargs__', '__getslice__', '__gt__', '__hash__', '__init__', '__le__', '__len__', '__lt__', '__mod__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__rmod__', '__rmul__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '_formatter_field_name_split', '_formatter_parser', 'capitalize', 'center', 'count', 'decode', 'encode', 'endswith', 'expandtabs', 'find', 'format', 'index', 'isalnum', 'isalpha', 'isdigit', 'islower', 'isspace', 'istitle', 'isupper', 'join', 'ljust', 'lower', 'lstrip', 'partition', 'replace', 'rfind', 'rindex', 'rjust', 'rpartition', 'rsplit', 'rstrip', 'split', 'splitlines', 'startswith', 'strip', 'swapcase', 'title', 'translate', 'upper', 'zfill']
>>>
Python コードのHTML表示には、Dan CederholmのSimpleCodeを使用しています。
Python コードの入出力は、Python IDLE から行っています。
-------------------------------------------------
講座第15回のリーディングアサイメント
1. Chapter 12 of How to Think Like a Computer Scientist: Learning with Python
2. Chapter 13 of How to Think Like a Computer Scientist: Learning with Python
3. Chapter 14 of How to Think Like a Computer Scientist: Learning with Python
4. Chapter 15 of How to Think Like a Computer Scientist: Learning with Python
5. Chapter 16 of How to Think Like a Computer Scientist: Learning with Python
-------------------------------------------------
テキスト(全てネット上で無償公開)
1. Getting Started: Python and IDLE
2. Python Programming
3. The Python Tutorial
4. How to Think Like a Computer Scientist: Learning with Python
-------------------------------------------------
No comments:
Post a Comment