Friday, July 13, 2018

MIT 6.00 コンピュータサイエンスとプログラミング秋期講座第20回

MIT 6.00 コンピュータサイエンスとプログラミング秋期講座第20回
 
 

 
オープンコースウエア 大学名:MIT
講座名:6.00 Introduction to Computer Science and Programming
講義日:2008年11月18日(火曜日) ― 第12週・1回目  

担当教授:Prof.  Guttag

全講義数:24コマ
各講義時間:60分

配信開始日:2009年8月19日
講義ビデオソース:Youtube
講義ビデオ収録時間:50分38秒
サブタイトル:有
キーワード: シミュレーションモデリング、確率的シミュレーション、確定的シミュレーション、静的モデル 対 動的モデル、モンテカルロシミュレーション、円周率

ビデオ画像品質5段階評価:4
ビデオ音声品質5段階評価:4

講義コメント: 講義中に学生の携帯が鳴った。
グターグ教授、「君のお母さんからなら、遠慮しないで電話をとってもいいよ」とジョークで切り返しています。
今回の話は、dichotomy  二分法 《物事を対立的な概念に二分する論法》を使い、
比較しながら分かりやすく、シミュレーションモデリングの講義を進めています。
確率的シミュレーション 対 確定的シミュレーション
確率的分析と確定的分析
静的モデル 対 動的モデル
   動的モデルは、時間軸との関連で考える。静的モデルにはその必要はない。
   これから見ていくのは、動的モデルである。
   動的モデルの例:Queing Network - Scheduling and planning
Discreteシミュレーション 対 Continuousシミュレーション
高速道路の交通状況 個々の車の流れ 対 車の流れを流体として捉える
これから見ていくのは、Discreteシミュレーション。
モンテカルロシミュレーション
酔っ払いのランダムウオークモデリングは、モンテカルロシミュレーションであった。
モンテカルロシミュレーションは、統計的推理(Inference Statistics)である。
Randomly chosen sample tends to exhibit same properties as population To which it is drawn
コイン投げシミュレーション -> 表が出るか、裏が出るか
このコイン投げシュミレーションもモンテカルロシミュレーションとして扱うことができる。
--------------------------------------------------
Pythonのループ構文で、新しい構文が出てきました。
For i in xrange(  )
For i in range(  )  今まで使ってきた Range()は、リストを内部に作るため、Range()が大きくなると
メモリの浪費になる。グダーグ教授は、For i in xrange()をほとんどの場合使っているそうです。
講義の後半からは、円周率の計算となります。
1650BC  円周率 =3.16
聖書 円周率 =3
アルキメデス:   223/71  < Pi < 22/7   Pi = 3.1418
フランス人数学者 Buffon Laplace の円周率を求める方法を
モンテカルロシミュレーションで実行してみます。

-------------------------------------------------

Lecture 20 Hand out 補助教材 ダウンロード
Lecture 20  ホームワーク ダウンロード
MIT 6.00 講座のプログラムも含んだ資料のダウンロード
-------------------------------------------------


-------------------------------------------------
講義で取り上げたPythonコードの例
注-1! あらかじめ PylabとNumpy という数学・計算用および図表表示モジュールをインストールしておく必要があります。
個別モジュールをダウンロードするには、ソースフォージ(SourceForge)のサイトから次の2つの小さいパッケージをダウンロードしてインストールします。
1. Numpy のパッケージ --> http://sourceforge.net/projects/numpy/files/NumPy/
   ダウンロードするパッケージは、numpy-1.5.1-win32-superpack-python2.6.exe
2. Pylab のパッケージ --> http://sourceforge.net/projects/matplotlib/files/matplotlib/matplotlib-1.0.1/
   ダウンロードするパッケージは、matplotlib-1.0.1.win32-py2.6.exe
例-1  ソースコード

from pylab import *
import random, math
def flipTrial(numFlips):
    heads, tails = 0, 0
    for i in xrange(0, numFlips):
        coin = random.randint(0, 1)
        if coin == 0: heads += 1
        else: tails += 1
    return heads, tails
def simFlips(numFlips, numTrials):
    diffs = []
    for i in xrange(0, numTrials):
        heads, tails = flipTrial(numFlips)
        diffs.append(abs(heads - tails))
    diffs = array(diffs)
    diffMean = sum(diffs)/len(diffs)
    diffPercent = (diffs/float(numFlips))*100
    percentMean = sum(diffPercent)/len(diffPercent)
    hist(diffs) 
    axvline(diffMean, color = 'r', label = 'Mean')
    legend()
    titleString = str(numFlips) +  ' Flips, ' + str(numTrials) + ' Trials'
    title(titleString)
    xlabel('Difference between heads and tails')
    ylabel('Number of Trials')
    figure()
    plot(diffPercent)       
    axhline(percentMean, color = 'r', label = 'Mean')
    legend()
    title(titleString)
    xlabel('Trial Number')
    ylabel('Percent Difference between heads and tails')
simFlips(1000, 1000)
show()

例-1の実行結果
エディタから実行してPython Shell に出力

出力した画像の元ファイルをダウンロードしてみる。
SVG(Scalable Vector Graphics)ファイル
--------------------------------------------------
例-2  ソースコード

#Tell Python which local standard to use
import locale
locale.setlocale(locale.LC_ALL,'en_US.UTF-8')
#Format ints according to local standard
def formatInt(i):
    return locale.format('%d', i, grouping = True)
from pylab import *
import random, math
def throwDarts(numDarts, shouldPlot):
    inCircle = 0
    estimates = []
    for darts in xrange(1, numDarts + 1, 1):
        x = random.random()
        y = random.random()
        if math.sqrt(x*x + y*y) <= 1.0:
            inCircle += 1
        if shouldPlot:
            piGuess = 4*(inCircle/float(darts))
            estimates.append(piGuess)
        if darts%1000000 == 0: #So I know it's making progress
            piGuess = 4*(inCircle/float(darts))
            dartsStr = locale.format('%d', darts, True)
            print 'Estimate with', formatInt(darts), 'darts:', piGuess
    if shouldPlot:
        xAxis = arange(1, len(estimates)+1)
        semilogx(xAxis, estimates)
        titleString = 'Estimations of pi, final estimate: ' + str(piGuess)
        title(titleString)
        xlabel('Number of Darts Thrown')
        ylabel('Estimate of pi')
        axhline(3.14159)
    return 4*(inCircle/float(numDarts))
def findPi(numDarts, shouldPlot=False):
    piGuess = throwDarts(numDarts, shouldPlot)
    print 'Estimated value of pi with', formatInt(numDarts), 'darts:', piGuess
 
findPi(10000, True)
findPi(100000000)
show() 
--------------------------------------------------


Python コードのHTML表示には、Dan CederholmのSimpleCodeを使用しています。
Python コードの入出力は、Python IDLE から行っています。
Python_idle_1_small


-------------------------------------------------

講座第19回のリーディングアサイメント

1. Random walks applet
2. Chapter 13 of Matplotlib/pylab reference
-------------------------------------------------
-------------------------------------------------



MIT 6.00 コンピュータサイエンスとプログラミング秋期講座第19回

MIT 6.00 コンピュータサイエンスとプログラミング秋期講座第19回
オープンコースウエア 大学名:MIT
講座名:6.00 Introduction to Computer Science and Programming
講義日:2008年11月13日(木曜日) ― 第11週・2回目  

担当教授:Prof. Guttag

全講義数:24コマ
各講義時間:60分

配信開始日:2009年8月19日
講義ビデオソース:Youtube
講義ビデオ収録時間:50分38秒
サブタイトル:有
ジャンル: オブジェクト指向プログラミング、クラス構造、ソフトウエアの再利用、ランダムウオーク、Pylab、Numpy、図表やヒストグラムをプロットする方法

ビデオ画像品質5段階評価:3.5
(今回は、どういうわけかソースコードがやや読みにくいように感じます。)
ビデオ音声品質5段階評価:4


講義コメント:
グターグ教授、どうやら風邪を引いた様子。咳をしながらの講義はちょっとつらそうです。

MITのこの講座も会を重ねること19回目となりました。あと5回の講義を残すのみとなり、
ゴールがはっきりと見えてきたような気がします。
今回19回目の講義は前回、前々回の講義でコーディングしたランダムウオークプログラムの拡張です。
でもただの拡張とは違います。
Pythonがサポートしているオブジェクト指向プログラミングの特性を利用して、
新しいクラスを既存のクラス構造の中にはめ込む事によって、プログラムの機能を拡張するテクニックの学習です。
グターグ教授は、どちらかというと、プログラミングのテクニックをいろいろ講義の中に盛り込みたい傾向があるようです。
対してグリムソン教授は、プログラミングのもつ数学的というかアルゴリズム的な部分に特に重きを置いているようです。
ここでは、前回のプログラムで作った 酔っぱらいクラスを以下のように拡張しています。

class Drunk(object): #Replaced
  def __init__(self, name):
    self.name = name
  def move(self, field, cp, dist = 1):
    if field.getDrunk().name != self.name:
      raise ValueError('Drunk.move called with drunk not in field')
    for i in range(dist):
      field.move(cp, 1)
   
class UsualDrunk(Drunk): #Added a new class
  def move(self, field, dist = 1):
    cp = random.choice(CompassPt.possibles)
    Drunk.move(self, field, CompassPt(cp), dist) #Note notation of call
  
class ColdDrunk(Drunk): #Added a new class
  def move(self, field, dist = 1):
    cp = random.choice(CompassPt.possibles)
    if cp == 'S':
      Drunk.move(self, field, CompassPt(cp), 2*dist)
    else:
      Drunk.move(self, field, CompassPt(cp), dist)
   
class EWDrunk(Drunk): #Added a new class
  def move(self, field, time = 1):
    cp = random.choice(CompassPt.possibles)
    while cp != 'E' and cp != 'W':
      cp = random.choice(CompassPt.possibles)
    Drunk.move(self, field, CompassPt(cp), time)




-------------------------------------------------

Lecture 19 Hand out 補助教材 ダウンロード

Lecture 19 ホームワーク ダウンロード
MIT 6.00 講座のプログラムも含んだ資料のダウンロード
-------------------------------------------------


-------------------------------------------------
講義で取り上げたPythonコードの例
注-1! あらかじめ PylabとNumpy という数学・計算用および図表表示モジュールをインストールしておく必要があります。
個別モジュールをダウンロードするには、ソースフォージ(SourceForge)のサイトから次の2つの小さいパッケージをダウンロードしてインストールします。
1. Numpy のパッケージ --> http://sourceforge.net/projects/numpy/files/NumPy/
   ダウンロードするパッケージは、numpy-1.5.1-win32-superpack-python2.6.exe
2. Pylab のパッケージ --> http://sourceforge.net/projects/matplotlib/files/matplotlib/matplotlib-1.0.1/
   ダウンロードするパッケージは、matplotlib-1.0.1.win32-py2.6.exe


例-1 ソースコード


import math, random, pylab, numpy

class Location(object):
  def __init__(self, x, y):
    self.x = float(x)
    self.y = float(y)
  def move(self, xc, yc):
    return Location(self.x+float(xc), self.y+float(yc))
  def getCoords(self):
    return self.x, self.y
  def getDist(self, other):
    ox, oy = other.getCoords()
    xDist = self.x - ox
    yDist = self.y - oy
    return math.sqrt(xDist**2 + yDist**2)
class CompassPt(object):
  possibles = ('N', 'S', 'E', 'W')
  def __init__(self, pt):
    if pt in self.possibles: self.pt = pt
    else: raise ValueError('in CompassPt.__init__')
  def move(self, dist):
    if self.pt == 'N': return (0, dist)
    elif self.pt == 'S': return (0, -dist)
    elif self.pt == 'E': return (dist, 0)
    elif self.pt == 'W': return (-dist, 0)
    else: raise ValueError('in CompassPt.move')
 
class Field(object):
  def __init__(self, drunk, loc):
    self.drunk = drunk
    self.loc = loc
  def move(self, cp, dist):
    oldLoc = self.loc
    xc, yc = cp.move(dist)
    self.loc = oldLoc.move(xc, yc)
  def getLoc(self):
    return self.loc
  def getDrunk(self):
    return self.drunk
class Drunk(object): #Replaced
  def __init__(self, name):
    self.name = name
  def move(self, field, cp, dist = 1):
    if field.getDrunk().name != self.name:
      raise ValueError('Drunk.move called with drunk not in field')
    for i in range(dist):
      field.move(cp, 1)
   
class UsualDrunk(Drunk): #Added a new class
  def move(self, field, dist = 1):
    cp = random.choice(CompassPt.possibles)
    Drunk.move(self, field, CompassPt(cp), dist) #Note notation of call
 
class ColdDrunk(Drunk): #Added a new class
  def move(self, field, dist = 1):
    cp = random.choice(CompassPt.possibles)
    if cp == 'S':
      Drunk.move(self, field, CompassPt(cp), 2*dist)
    else:
      Drunk.move(self, field, CompassPt(cp), dist)
   
class EWDrunk(Drunk): #Added a new class
  def move(self, field, time = 1):
    cp = random.choice(CompassPt.possibles)
    while cp != 'E' and cp != 'W':
      cp = random.choice(CompassPt.possibles)
    Drunk.move(self, field, CompassPt(cp), time)
def performTrial(time, f):
  start = f.getLoc()
  distances = [0.0]
  for t in range(1, time + 1):
    f.getDrunk().move(f)
    newLoc = f.getLoc()
    distance = newLoc.getDist(start)
    distances.append(distance)
  return distances
##drunk = Drunk('Homer Simpson')
##for i in range(3):
##  f = Field(drunk, Location(0, 0))
##  distances = performTrial(500, f)
##  pylab.plot(distances)
##pylab.title('Homer\'s Random Walk')
##pylab.xlabel('Time')
##pylab.ylabel('Distance from Origin')
def performSim(time, numTrials, drunkType): #Replaced
  distLists = []
  for trial in range(numTrials):
    d = drunkType('Drunk' + str(trial))
    f = Field(d, Location(0, 0))
    distances = performTrial(time, f)
    distLists.append(distances)
  return distLists
def ansQuest(maxTime, numTrials, drunkType, title): #Replaced
  means = []
  distLists = performSim(maxTime, numTrials, drunkType)
  for t in range(maxTime + 1):
    tot = 0.0
    for distL in distLists:
      tot += distL[t]
    means.append(tot/len(distLists))
  pylab.figure()
  pylab.plot(means)

##  pylab.ylabel('distance')
##  pylab.xlabel('time')
##  pylab.title('Average Distance vs. Time (' + str(len(distLists)) + ' trials)')
  pylab.ylabel('Ave. Distance')
  pylab.xlabel('Steps')
  pylab.title(title)
numSteps = 500
numTrials = 100
ansQuest(numSteps, numTrials, UsualDrunk, 'UsualDrunk ' + str(numTrials) + ' Trials')
ansQuest(numSteps, numTrials, ColdDrunk, 'ColdDrunk ' + str(numTrials) + ' Trials')
ansQuest(numSteps, numTrials, EWDrunk, 'EWDrunk ' + str(numTrials) + ' Trials')
pylab.show()




例-1の実行結果
エディタから実行してPython Shell に出力
Mit_600_19_1

出力した画像の元ファイルをダウンロードしてみる。

「Usual_Drunk_100Trials.svg」をダウンロード
「Cold_Drunk_100Trials.svg」をダウンロード
「EastWest_Drunk_100Trials.svg」をダウンロード
SVG(Scalable Vector Graphics)ファイル
--------------------------------------------------


Python コードのHTML表示には、Dan CederholmのSimpleCodeを使用しています。
Python コードの入出力は、Python IDLE から行っています。
Python_idle_1_small


-------------------------------------------------

講座第19回のリーディングアサイメント

1. Random walks applet

2. Chapter 13 of Matplotlib/pylab reference
-------------------------------------------------

-------------------------------------------------

MIT 6.00 コンピュータサイエンスとプログラミング秋期講座第18回

MIT 6.00 コンピュータサイエンスとプログラミング秋期講座第18回
オープンコースウエア 大学名:MIT
講座名:6.00 Introduction to Computer Science and Programming
講義日:2008年11月11日(火曜日) ― 第11週・1回目 (第10週・2回目の講義は休講でした)

担当教授:Prof. Guttag

全講義数:24コマ
各講義時間:60分

配信開始日:2009年8月19日
講義ビデオソース:Youtube
講義ビデオ収録時間:50分38秒
サブタイトル:有
ジャンル: プログラム出力結果の評価、ランダムウオークのデバッグ、Pylab、Numpy、図表やヒストグラムをプロットする方法

ビデオ画像品質5段階評価:4
(解像度が480pあり、コンピュータ画面に表示されたソースコードを比較的はっきりと読み取ることができます。)
ビデオ音声品質5段階評価:4


講義コメント:
今回18回目の講義は前回の講義でコーディングしたランダムウオークプログラムの精査およびデバックとなります。

基本シミュレーションのコーディングは、以下の3部からなっている。
その1. シミュレーションを1回だけ実行するインナーループ。
その2・ シミュレーションの試行回数を管理するループ。このループはその1のループを内蔵する。
その3. 計算および統計処理の(グラフィカル)表示

ランダムウオークプログラムの精査の部分は、前回さらっと流した以下のコード:
   f.getDrunk().move(f) 

f.getDrunk() は、インスタンス(つまりメソッドのインボケイション)であり、f.getDrunkとは区別されなければならない。
f.getDrunkは、この場合メソッドでインスタンスではない。
前回でコーディングしたプログラム、エラーメッセージが表示されることもなく無事に結果が出力されていました。
しかしその出力結果をよくよく見てみると、なんか変なことに気がつきました。
それは、100歩や200歩シミュレートした結果がどれも原点から4,5歩の距離しか離れていないのです。
これはどうもおかしいじゃないかということになって、プログラムをデバックすることになりました。
グダーグ教授のデバック作法の手順は:
  1. Find a really simple example that I know the answer
  2. Take only one step - we know the answer should be one
  3. Go half way in the middle of the program and print some intermediate value (total distance so far)
  4. Label axes and look
  5. Ask if answer makes sense
上記の手順に従ってデバッグしてみると、どうやら距離の平均値の求め方にバグがあったようです。
ほんの1行だけなのですが、手直しして再実行すると、前回の結果よりもっともらしい(?)結果が出力されました。



-------------------------------------------------

Lecture 18 Hand out 補助教材 ダウンロード

Lecture 18 ホームワーク ダウンロード
MIT 6.00 講座のプログラムも含んだ資料のダウンロード
-------------------------------------------------


-------------------------------------------------
講義で取り上げたPythonコードの例
注-1! あらかじめ PylabとNumpy という数学・計算用および図表表示モジュールをインストールしておく必要があります。
個別モジュールをダウンロードするには、ソースフォージ(SourceForge)のサイトから次の2つの小さいパッケージをダウンロードしてインストールします。
1. Numpy のパッケージ --> http://sourceforge.net/projects/numpy/files/NumPy/
   ダウンロードするパッケージは、numpy-1.5.1-win32-superpack-python2.6.exe
2. Pylab のパッケージ --> http://sourceforge.net/projects/matplotlib/files/matplotlib/matplotlib-1.0.1/
   ダウンロードするパッケージは、matplotlib-1.0.1.win32-py2.6.exe
注ー2! 前回のコードがデバックされています。

例-1 ソースコード


import math, random, pylab

class Location(object):
  def __init__(self, x, y):
    self.x = float(x)
    self.y = float(y)
  
  def move(self, xc, yc):
    return Location(self.x+float(xc), self.y+float(yc))
  def getCoords(self):
    return self.x, self.y
  def getDist(self, other):
    ox, oy = other.getCoords()
    xDist = self.x - ox
    yDist = self.y - oy
    return math.sqrt(xDist**2 + yDist**2)
class CompassPt(object):
  possibles = ('N', 'S', 'E', 'W')

  def __init__(self, pt):
    if pt in self.possibles: self.pt = pt
    else: raise ValueError('in CompassPt.__init__')
  
  def move(self, dist):
    if self.pt == 'N': return (0, dist)
    elif self.pt == 'S': return (0, -dist)
    elif self.pt == 'E': return (dist, 0)
    elif self.pt == 'W': return (-dist, 0)
    else: raise ValueError('in CompassPt.move')
  
class Field(object):
  
  def __init__(self, drunk, loc):
    self.drunk = drunk
    self.loc = loc
  
  def move(self, cp, dist):
    oldLoc = self.loc
    xc, yc = cp.move(dist)
    self.loc = oldLoc.move(xc, yc)
  
  def getLoc(self):
    return self.loc
  def getDrunk(self):
    return self.drunk
class Drunk(object):
  def __init__(self, name):
    self.name = name
  
  def move(self, field, time = 1):
    if field.getDrunk() != self:
      raise ValueError('Drunk.move called with drunk not in field')
    for i in range(time):
      pt = CompassPt(random.choice(CompassPt.possibles))
      field.move(pt, 1)
    
def performTrial(time, f):
  start = f.getLoc()
  distances = [0.0]
  for t in range(1, time + 1):
    f.getDrunk().move(f)
    newLoc = f.getLoc()
    distance = newLoc.getDist(start)
    distances.append(distance)
  return distances
drunk = Drunk('Homer Simpson')
for i in range(3):
  f = Field(drunk, Location(0, 0))
  distances = performTrial(500, f)
  pylab.plot(distances)

pylab.title('Homer\'s Random Walk')
pylab.xlabel('Time')
pylab.ylabel('Distance from Origin')
def performSim(time, numTrials):
  distLists = []
  for trial in range(numTrials):
    d = Drunk('Drunk' + str(trial))
    f = Field(d, Location(0, 0))
    distances = performTrial(time, f)
    distLists.append(distances)
  return distLists
def ansQuest(maxTime, numTrials):
  means = []
  distLists = performSim(maxTime, numTrials)
  for t in range(maxTime + 1):
    tot = 0.0
    for distL in distLists:
      tot += distL[t]
    means.append(tot/len(distLists))
  pylab.figure()
  pylab.plot(means)
  pylab.ylabel('distance')
  pylab.xlabel('time')
  pylab.title('Average Distance vs. Time (' + str(len(distLists)) + ' trials)')
 
ansQuest(500, 300)
pylab.show()


例-1の実行結果
エディタから実行してPython Shell に出力
Mit_600_18_1
「MIT_600_18_2.jpg」をダウンロード

出力した画像の元ファイルをダウンロードしてみる。
「Lec18_Homers_Random_Walk.svg」をダウンロード
「Lec18_Average_Dist_vs_Time.svg」をダウンロード

SVG(Scalable Vector Graphics)ファイル
--------------------------------------------------
例-2 ソースコード

from pylab import *
import random

# Plot - 1
plot([1,2,3,4])
plot([5,6,7,8])
# Plot - 2
plot([1,2,3,4], [1,4,9,16])
figure()
plot([1,2,3,4], [1,4,9,16], 'ro')
axis([0, 6, 0, 20])
title('Earnings')
xlabel('Days')
ylabel('Dollars')
figure()
# Plot - 3
xAxis = array([1,2,3,4])
print xAxis
test = arange(1,5)
print test
print test == xAxis
yAxis = xAxis**3
plot(xAxis, yAxis, 'ro')
# Plot - 4 Plots a histgram
figure()
vals = []
dieVals = [1,2,3,4,5,6]
for i in range(10000):
vals.append(random.choice(dieVals)+random.choice(dieVals))
hist(vals, bins=11)
show()

例-2 の実行結果
「Lec18_Plot_1.svg」をダウンロード
「Lec18_Plot_2-1.svg」をダウンロード
「Lec18_Plot_2-2.svg」をダウンロード
「Lec18_Plot_3.svg」をダウンロード
「Lec18_Plot_4.svg」をダウンロード


Python コードのHTML表示には、Dan CederholmのSimpleCodeを使用しています。
Python コードの入出力は、Python IDLE から行っています。
Python_idle_1_small


-------------------------------------------------

講座第18回のリーディングアサイメント

1. Random walks applet

2. Chapter 13 of Matplotlib/pylab reference
-------------------------------------------------

-------------------------------------------------

MIT 6.00 コンピュータサイエンスとプログラミング秋期講座第17回

MIT 6.00 コンピュータサイエンスとプログラミング秋期講座第17回
オープンコースウエア 大学名:MIT
講座名:6.00 Introduction to Computer Science and Programming
講義日:2008年11月4日(火曜日) ― 第10週・1回目


担当教授:Prof. Guttag


全講義数:24コマ
各講義時間:60分


配信開始日:2009年8月19日
講義ビデオソース:Youtube
講義ビデオ収録時間:50分38秒
サブタイトル:有
ジャンル: 乱数、ランダムウオーク、擬似乱数(Psudo Random)

ビデオ画像品質5段階評価:4
(解像度が480pあり、コンピュータ画面に表示されたソースコードを比較的はっきりと読み取ることができます。)
ビデオ音声品質5段階評価:4


講義コメント:
第1回から第16回目の講義までが、基礎固めの講義でした。コンピューターサイエンス専攻の学生向けの入門コースとしては、普通の大学であればこの辺りまでがおそらく範囲なのでしょう。

しかしMITの入門コース、この第17回目の講義から最終回にあたる24回目の講義まで、プログラミングの応用や、さらなる難問の挑戦に当てています。
問題を解くにあたって、コンピューターを問題解決のツールとして使えるか、
それとも紙と鉛筆(つまり数学的にもしくは、OR的に)で解くかにより、
問題解決のアプローチが異なっている。
ばらつき(ランダム)を処理する。
データの意味の整合性を検証する。
プログラムの実行結果の品質を検証する。
プログラムを書いていく前に、単純なシステムからモデリングを始める事。
ランダムウオークをシステム的にモデリングし、Pythonで実装する。
   1. Location
   2. CompassPT(Direction)
   3. Field
   4. Drunk(酔っ払い)
Youtubeでこの講義を見ていたら、お勧め動画(つまりこの17回目の講義を見ている人がこんな動画も見ている!)にアルゴリズム入門 - MIT 6.046J/18.410J Fall 2005)とあるのを発見。
そこに書き込みしてある「学生達」のコメントが面白い。
コメントその1.真のプログラマーが生まれる瞬間がここにある。
コメントその2.黒板を使い倒している。すごい!パワーポイント(PowerPoint)なんてくそくらえだ。
コメントその3.(レイア姫の出身星)アルデロン星からケンブリッジまでどうやってたどり着くかのアルゴリズムだなんて、この先生スターウオーズオタクだね。



-------------------------------------------------

Lecture 17 Hand out 補助教材 ダウンロード

Lecture 17 ホームワーク ダウンロード
MIT 6.00 講座のプログラムも含んだ資料のダウンロード
-------------------------------------------------


-------------------------------------------------
講義で取り上げたPythonコードの例
注! 今回のコード、実行する前にPylabという数学・計算用モジュールをインストールしておく必要があります。イギリス・サウザンプトン大学のサイトPython 教材ダウンロードを参照しても良いです。ここからダウンロードすると、すべて込みこみのサイズが200M以上のパッケージをダウンロードすることになります。
個別モジュールをダウンロードするには、ソースフォージ(SourceForge)のサイトから次の2つの小さいパッケージをダウンロードしてインストールします。
1. Numpy --> http://sourceforge.net/projects/numpy/files/NumPy/
   ダウンロードするパッケージは、numpy-1.5.1-win32-superpack-python2.6.exe
2. Pylab --> http://sourceforge.net/projects/matplotlib/files/matplotlib/matplotlib-1.0.1/
   ダウンロードするパッケージは、matplotlib-1.0.1.win32-py2.6.exe


例-1


import math, random, pylab

class Location(object):
  def __init__(self, x, y):
    self.x = float(x)
    self.y = float(y)

  def move(self, xc, yc):
    return Location(self.x+float(xc), self.y+float(yc))
  def getCoords(self):
    return self.x, self.y
  def getDist(self, other):
    ox, oy = other.getCoords()
    xDist = self.x - ox
    yDist = self.y - oy
    return math.sqrt(xDist**2 + yDist**2)
class CompassPt(object):
  possibles = ('N', 'S', 'E', 'W')

  def __init__(self, pt):
    if pt in self.possibles: self.pt = pt
    else: raise ValueError('in CompassPt.__init__')

  def move(self, dist):
    if self.pt == 'N': return (0, dist)
    elif self.pt == 'S': return (0, -dist)
    elif self.pt == 'E': return (dist, 0)
    elif self.pt == 'W': return (-dist, 0)
    else: raise ValueError('in CompassPt.move')

class Field(object):

  def __init__(self, drunk, loc):
    self.drunk = drunk
    self.loc = loc

  def move(self, cp, dist):
    oldLoc = self.loc
    xc, yc = cp.move(dist)
    self.loc = oldLoc.move(xc, yc)

  def getLoc(self):
    return self.loc
  def getDrunk(self):
    return self.drunk
class Drunk(object):
  def __init__(self, name):
    self.name = name

  def move(self, field, time = 1):
    if field.getDrunk() != self:
      raise ValueError('Drunk.move called with drunk not in field')
    for i in range(time):
      pt = CompassPt(random.choice(CompassPt.possibles))
      field.move(pt, 1)
  
def performTrial(time, f):
  start = f.getLoc()
  distances = [0.0]
  for t in range(1, time + 1):
    f.getDrunk().move(f)
    newLoc = f.getLoc()
    distance = newLoc.getDist(start)
    distances.append(distance)
  return distances
drunk = Drunk('Homer Simpson')
for i in range(3):
  f = Field(drunk, Location(0, 0))
  distances = performTrial(500, f)
  pylab.plot(distances)

pylab.title('Homer\'s Random Walk')
pylab.xlabel('Time')
pylab.ylabel('Distance from Origin')
def performSim(time, numTrials):
  distLists = []
  for trial in range(numTrials):
    d = Drunk('Drunk' + str(trial))
    f = Field(d, Location(0, 0))
    distances = performTrial(time, f)
    distLists.append(distances)
  return distLists
def ansQuest(maxTime, numTrials):
  means = []
  distLists = performSim(maxTime, numTrials)
  for t in range(maxTime + 1):
    tot = 0.0
    for distL in distLists:
      tot += distL[t]
    means.append(tot/len(distL))
  pylab.figure()
  pylab.plot(means)
  pylab.ylabel('distance')
  pylab.xlabel('time')
  pylab.title('Average Distance vs. Time (' + str(len(distLists)) + ' trials)')

ansQuest(500, 300)
pylab.show()


例-1の実行結果
エディタから実行してPython Shell に出力
Mit_600_17_2

出力した画像の元ファイルをダウンロードしてみる。
1. 「Lec17_Average_Dist_vs_Time.svg」をダウンロード
2. 「Lec17_Homers_Random_Walk.svg」をダウンロード
SVG(Scalable Vector Graphics)ファイル


Python コードのHTML表示には、Dan CederholmのSimpleCodeを使用しています。
Python コードの入出力は、Python IDLE から行っています。
Python_idle_1_small


-------------------------------------------------

講座第17回のリーディングアサイメント

1. Random walks applet

2. Chapter 13 of Matplotlib/pylab reference
-------------------------------------------------

-------------------------------------------------

MIT 6.00 コンピュータサイエンスとプログラミング秋期講座第16回

 MIT 6.00 コンピュータサイエンスとプログラミング秋期講座第16回
オープンコースウエア 大学名:MIT
講座名:6.00 Introduction to Computer Science and Programming
講義日:2008年10月30日(木曜日) ― 第9週・2回目


担当教授:Prof. Grimson


全講義数:24コマ
各講義時間:60分


配信開始日:2009年8月19日
講義ビデオソース:Youtube
講義ビデオ収録時間:50分38秒
サブタイトル:有
ジャンル: クラス定義、カプセル化、インヘリタンス

ビデオ画像品質5段階評価:4
(解像度が480pあり、コンピュータ画面に表示されたソースコードを比較的はっきりと読み取ることができます。)
ビデオ音声品質5段階評価:3.5 グリムソン教授の発声、とてもめりはりがついているため、YoutubeのCC機能(キャプションソフトウエア機能)をオンにしてサブタイトルを表示すると、ほぼ正確に話した言葉が表示されています。・・・が、今回の収録は後半雑音が入り聞き取れなくなっている箇所があります。



講義コメント:
第16回目の講義は、前回3コマの講義で学習したオブジェクト指向プログラミングのまとめとなっています。
僅か4回の講義で(つまり4時間少々で)オブジェクト指向プログラミングの基礎をカバーしているわけで、正直オブジェクト指向プログラミングに関すjるエッセンスがいっぱい詰まった講義となっています。

特に前回と今回の講義で取り上げているPythonで書かれたサンプルプログラム、一見単純に見えますが、オブジェクト指向プログラミングの基礎エッセンスが盛り込まれていて、
とっても使える例題となっています。
ためになった講義内容の抜粋:
その1. 属性や入力した値を継承することができる。クラス図の上下関係を辿って、メソッドも継承することができ、またそのメソッドを上書きすることもできる。それらすべてをクラスのハイアラキーで実装することができる。
その2. 内在する数多くのユニットがそれぞれに特有な形でインタラクティブするようなシステムをモデルする場合に、オブジェクト指向のシステムは大変有効である。
その3. 自然な形でユニットをまとめることができて、ユニット間のインタラクティブが非常に制御されているようなシステムをモデルするべきである。



-------------------------------------------------

Lecture 16 Hand out 補助教材 ダウンロード

Lecture 16 ホームワーク ダウンロード
MIT 6.00 講座のプログラムも含んだ資料のダウンロード
-------------------------------------------------


-------------------------------------------------
講義で取り上げたPythonコードの例
例-1


class Person(object):
    def __init__(self, family_name, first_name):
        self.family_name = family_name
        self.first_name = first_name
    def familyName(self):
        return self.family_name
    def firstName(self):
        return self.first_name
    def __cmp__(self, other):
        return cmp((self.family_name, self.first_name),
                   (other.family_name, other.first_name))
    def __str__(self):
        return '<Person: %s %s>'%(self.first_name, self.family_name)
    def say(self,toWhom,something):
        return self.first_name + ' ' + self.family_name + ' says to ' + toWhom.firstName() + ' ' + toWhom.familyName() + ': ' + something
    def sing(self,toWhom,something):
        return self.say(toWhom,something + ' tra la la')

class MITPerson(Person):
    nextIdNum = 0
    def __init__(self, familyName, firstName):
        Person.__init__(self, familyName, firstName)
        self.idNum = MITPerson.nextIdNum
        MITPerson.nextIdNum += 1
    def getIdNum(self):
        return self.idNum
    def __str__(self):
        return '<MIT Person: %s %s>'%(self.first_name, self.family_name)
    def __cmp__(self,other):
        return cmp(self.idNum, other.idNum)

##p1 = MITPerson('Smith','Fred')
##p2 = MITPerson('Foobar','Jane')
##print p1.getIdNum()
##print p2.getIdNum()

class UG(MITPerson):
    def __init__(self, familyName, firstName):
        MITPerson.__init__(self, familyName, firstName)
        self.year = None
    def setYear(self, year):
        if year > 5: raise OverflowError('Too many')
        self.year = year
    def getYear(self):
        return self.year
    def say(self,toWhom,something):
        return MITPerson.say(self,toWhom,'Excuse me, but ' + something)
##
##me = Person("Grimson", "Eric")
##ug = UG('Doe', 'Jane')

class Prof(MITPerson):
    def __init__(self, familyName, firstName, rank):
        MITPerson.__init__(self, familyName, firstName)
        self.rank = rank
        self.teaching = {}
    def addTeaching(self, term, subj):
        try:
            self.teaching[term].append(subj)
        except KeyError:
                self.teaching[term] = [subj]
    def getTeaching(self, term):
        try:
            return self.teaching[term]
        except KeyError:
            return None
    def lecture(self,toWhom,something):
        return self.say(toWhom,something + ' as it is obvious')
    def say(self,toWhom,something):
        if type(toWhom) == UG:
            return MITPerson.say(self,toWhom,'I do not understand why you say ' + something)
        elif type(toWhom) == Prof:
            return MITPerson.say(self,toWhom,'I really liked your paper on ' + something)
        else:
            return self.lecture(something)
 
##me = Prof('Grimson', 'Eric', 'Full')
##me.addTeaching('F08', '6.00')
##me.addTeaching('S09', '6.00')
##me.addTeaching('S09', '6.xxx')
##print me.getTeaching('F08')
##print me.getTeaching('S09')
##print me.getTeaching('S08')
##print me.teaching
    
class Faculty(object):
    def __init__(self):
        self.names = []
        self.IDs = []
        self.members = []
        self.place = None
    def add(self,who):
        if type(who)!= Prof: raise TypeError('not a professor')
        if who.getIdNum() in self.IDs: raise ValueError('duplicate ID')
        self.names.append(who.familyName())
        self.IDs.append(who.getIdNum())
        self.members.append(who)
    def __iter__(self):
        self.place = 0
        return self
    def next(self):
        if self.place >= len(self.names):
            raise StopIteration
        self.place += 1
        return self.members[self.place-1]

##grimson = Prof('Grimson','Eric', 'Full')
##lozano = Prof('Lozano-Perez', 'Tomas', 'Full')
##guttag = Prof('Guttag', 'John', 'Full')
##barzilay = Prof('Barzilay', 'Regina', 'Associate')
##course6 = Faculty()
##course6.add(grimson)
##course6.add(lozano)
##course6.add(guttag)
##course6.add(barzilay)
##
##for p in course6: ##    print p.familyName()
##
##
##print ug.say(grimson,'I do not understand')
##print grimson.say(ug,'you do not understand')
##print grimson.say(guttag,'why the sky is blue')
##
##print ug.sing(ug,'I think I finally understand') 


例-1の実行結果

Python 2.6.4 (r264:75708, Oct 26 2009, 08:23:19) [MSC v.1500 32 bit (Intel)] on win32
Type "copyright", "credits" or "license()" for more information.

    ****************************************************************
    Personal firewall software may warn about the connection IDLE
    makes to its subprocess using this computer's internal loopback
    interface.  This connection is not visible on any external
    interface and no data is sent to or received from the Internet.
    ****************************************************************

IDLE 2.6.4  
>>> ================================ RESTART ================================
>>>
>>> ================================ RESTART ================================
>>>
>>> ================================ RESTART ================================
>>>
>>> grimson = Prof('Grimson','Eric', 'Full')
>>> lozano = Prof('Lozano-Perez', 'Tomas', 'Full')
>>> guttag = Prof('Guttag', 'John', 'Full')
>>> barzilay = Prof('Barzilay', 'Regina', 'Associate')
>>> course6 = Faculty()
>>> course6.add(grimson)
>>> course6.add(lozano)
>>> for p in course6: print p.familyName()
Grimson
Lozano-Perez
>>> if p in course6: print p.familyName()
Lozano-Perez
>>> for p in course6: print p.familyName()
Grimson
Lozano-Perez
>>> course6.add(guttag)
>>> course6.add(barzilay)
>>> for p in course6: print p.familyName()
Grimson
Lozano-Perez
Guttag
Barzilay
>>> if p in course6: print p.familyName()
Barzilay
>>> print ug.say(grimson,'I do not understand')
Traceback (most recent call last):
  File "<pyshell#19>", line 1, in <module>
    print ug.say(grimson,'I do not understand')
NameError: name 'ug' is not defined
>>> UG.say(grimson,'I do not understand')
Traceback (most recent call last):
  File "<pyshell#20>", line 1, in <module>
    UG.say(grimson,'I do not understand')
TypeError: unbound method say() must be called with UG instance as first argument (got Prof instance instead)
>>> print grimson.say(guttag,'why the sky is blue')
Eric Grimson says to John Guttag: I really liked your paper on why the sky is blue
>>> ug = UG('Doe', 'Jane')
>>> print ug.say(grimson,'I do not understand')
Jane Doe says to Eric Grimson: Excuse me, but I do not understand
>>>
>>> 



Python コードのHTML表示には、Dan CederholmのSimpleCodeを使用しています。
Python コードの入出力は、Python IDLE から行っています。
Python_idle_1_small


-------------------------------------------------

講座第16回のリーディングアサイメント

1. Chapter 12 of How to Think Like a Computer Scientist: Learning with Python

-------------------------------------------------

-------------------------------------------------

MIT 6.00 コンピュータサイエンスとプログラミング秋期講座第15回

 MIT 6.00 コンピュータサイエンスとプログラミング秋期講座第15回
オープンコースウエア 大学名: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

-------------------------------------------------

-------------------------------------------------

MIT 6.00 コンピュータサイエンスとプログラミング秋期講座第2回

  MIT 6.00 コンピュータサイエンスとプログラミング秋期講座第2回 オープンコースウエア 大学名:MIT 講座名:6.00 Introduction to Computer Science and Programming Download course material ...