33
プログラミング 田浦健次朗

プログラミングtau/lecture/komaba...Python, Ruby, Perl, PHP, Lisp, Scheme, Haskel, ML, OCaml, Prolog, … 用途に応じて無数に提案されている 本講義では,シンプルさ(学習障壁の少なさ)

  • Upload
    others

  • View
    2

  • Download
    0

Embed Size (px)

Citation preview

Page 1: プログラミングtau/lecture/komaba...Python, Ruby, Perl, PHP, Lisp, Scheme, Haskel, ML, OCaml, Prolog, … 用途に応じて無数に提案されている 本講義では,シンプルさ(学習障壁の少なさ)

プログラミング

田浦健次朗

Page 2: プログラミングtau/lecture/komaba...Python, Ruby, Perl, PHP, Lisp, Scheme, Haskel, ML, OCaml, Prolog, … 用途に応じて無数に提案されている 本講義では,シンプルさ(学習障壁の少なさ)

動機

なんとなくコンピュータに計算をさせる際の「考え方」「ノリ」はわかった (ことにしよう )

そうであっても ,機械語でプログラムを作る(CPUの命令を実際に並べる )のはひどく大変 !

Page 3: プログラミングtau/lecture/komaba...Python, Ruby, Perl, PHP, Lisp, Scheme, Haskel, ML, OCaml, Prolog, … 用途に応じて無数に提案されている 本講義では,シンプルさ(学習障壁の少なさ)

何が大変 ?

x5の例 : やるべきことはこれだけ (紙と鉛筆 ) y = 1

y = y * xy = y * xy = y * xy = y * xy = y * x

答え y

3 1 3 3 3 9 3 27 3 81

3 243

yx

Page 4: プログラミングtau/lecture/komaba...Python, Ruby, Perl, PHP, Lisp, Scheme, Haskel, ML, OCaml, Prolog, … 用途に応じて無数に提案されている 本講義では,シンプルさ(学習障壁の少なさ)

それがこんなことに ...

ある値を覚えておく場所を自分で覚えておかなくてはならない (○○は100番地 , ○○は RX, ○○は RY, …)

*, + などお馴染みの記法が使えない レジスタとメモリで (レジスタしか演算できないという理由で )値を移さないといけない

load [100],RXadd 0,1,RYmul RX,RY,RYmul RX,RY,RYmul RX,RY,RYmul RX,RY,RYmul RX,RY,RYstore RY,[101]halt

Page 5: プログラミングtau/lecture/komaba...Python, Ruby, Perl, PHP, Lisp, Scheme, Haskel, ML, OCaml, Prolog, … 用途に応じて無数に提案されている 本講義では,シンプルさ(学習障壁の少なさ)

プログラミング言語

人間に易しくプログラムを表現する記法 (「言語」 )

言語処理系 その言語のプログラムを「対応する機械語に読み替えて」実行してくれる

「読み替えて実行してくれる」のもまたプログラム !

Page 6: プログラミングtau/lecture/komaba...Python, Ruby, Perl, PHP, Lisp, Scheme, Haskel, ML, OCaml, Prolog, … 用途に応じて無数に提案されている 本講義では,シンプルさ(学習障壁の少なさ)

いくつかの言語の実例 (固有名詞 )

C, C++, Pascal, Fortran, Java, JavaScript, Python, Ruby, Perl, PHP, Lisp, Scheme, Haskel, ML, OCaml, Prolog, …

用途に応じて無数に提案されている 本講義では ,シンプルさ (学習障壁の少なさ )を理由に ,Pythonで演習を行う

Page 7: プログラミングtau/lecture/komaba...Python, Ruby, Perl, PHP, Lisp, Scheme, Haskel, ML, OCaml, Prolog, … 用途に応じて無数に提案されている 本講義では,シンプルさ(学習障壁の少なさ)

大部分のプログラミング言語に共通の事項 (1)

変数 (x, y, z, ...): 「方眼紙のマス目」に相当 「番地」を覚える必要は無く「自分の好きな名前」をつけられる

式 : 数学で良く使う記法や関数を自然にかける 計算方法は「処理系」が考えてくれる

Page 8: プログラミングtau/lecture/komaba...Python, Ruby, Perl, PHP, Lisp, Scheme, Haskel, ML, OCaml, Prolog, … 用途に応じて無数に提案されている 本講義では,シンプルさ(学習障壁の少なさ)

大部分のプログラミング言語に共通の事項 (2)

条件による分岐や ,繰り返しをすっきりと書く記法 if文 ,while文 ,for文

関数 : プログラムの一部に相当 複数の関数を組み合わせてまた別の関数を作ることができる

Page 9: プログラミングtau/lecture/komaba...Python, Ruby, Perl, PHP, Lisp, Scheme, Haskel, ML, OCaml, Prolog, … 用途に応じて無数に提案されている 本講義では,シンプルさ(学習障壁の少なさ)

本質的な「ノリ」は同じ 方眼紙と鉛筆のアナロジー ,繰り返しが重要 ,etc. 結局すべて「機械語の命令列を書きやすくしたもの」だからある意味では当然

Page 10: プログラミングtau/lecture/komaba...Python, Ruby, Perl, PHP, Lisp, Scheme, Haskel, ML, OCaml, Prolog, … 用途に応じて無数に提案されている 本講義では,シンプルさ(学習障壁の少なさ)

プログラミング言語の学び方

第一段階 : 例から学ぶ どんな問題にどのような手段 (変数 ,繰り返し ,関数 ,...)が用意されているか

第二段階 : 文法と規則をしっかり意識する (残念ながら )特に最初は ,「プログラミング」「間違いとの戦い」

プログラムを書いていて遭遇するエラーへの対処ができるように

Page 11: プログラミングtau/lecture/komaba...Python, Ruby, Perl, PHP, Lisp, Scheme, Haskel, ML, OCaml, Prolog, … 用途に応じて無数に提案されている 本講義では,シンプルさ(学習障壁の少なさ)

Pythonプログラミングを始める

プログラムの作成・編集 : テキストエディタ(mi, emacs, …) .py で終わるファイル名 で保存

プログラムの実行 : コマンドラインで ,pythonコマンド

動作 : 指定されたファイルに書かれている Pythonプログラムを実行

動作 : Pythonのプロンプトに対して対話的にプログラムを入力 ,その場で結果を確認できる

python ファイル名

python

Page 12: プログラミングtau/lecture/komaba...Python, Ruby, Perl, PHP, Lisp, Scheme, Haskel, ML, OCaml, Prolog, … 用途に応じて無数に提案されている 本講義では,シンプルさ(学習障壁の少なさ)

最初の例 :

以下を a.py として作成

端末 (コマンドライン )で以下を実行

結果

print 12345679 * 63print 12345679 * 72

python a.py

777777777888888888

Page 13: プログラミングtau/lecture/komaba...Python, Ruby, Perl, PHP, Lisp, Scheme, Haskel, ML, OCaml, Prolog, … 用途に応じて無数に提案されている 本講義では,シンプルさ(学習障壁の少なさ)

起きたこと (プログラムの実行規則 )の説明

プログラムは一般には ,文を羅列したもの printも文の一種 (print文 )

プログラムを pythonコマンドで実行すると ,かかれた文を順に「実行」していく

print 式を実行すると式の値が計算され ,結果が表示される

Page 14: プログラミングtau/lecture/komaba...Python, Ruby, Perl, PHP, Lisp, Scheme, Haskel, ML, OCaml, Prolog, … 用途に応じて無数に提案されている 本講義では,シンプルさ(学習障壁の少なさ)

関数 (最重要コンセプト )

プログラムは ,あるまとまった計算をする断片を「関数」という単位で書くのが基本

実行結果

def f(x, y): return 3*x+4*y

print f(10, 20)

関数定義 (def文 )

110

Page 15: プログラミングtau/lecture/komaba...Python, Ruby, Perl, PHP, Lisp, Scheme, Haskel, ML, OCaml, Prolog, … 用途に応じて無数に提案されている 本講義では,シンプルさ(学習障壁の少なさ)

関数にまつわる文法と用語

def f (x, y): return 3*x+4*y

print f(10, 20)

関数名 パラメータ関数への入力を受け取る変数名

本体 (中身 )文の羅列 (この例では一つ )

関数呼び出し

関数定義

Page 16: プログラミングtau/lecture/komaba...Python, Ruby, Perl, PHP, Lisp, Scheme, Haskel, ML, OCaml, Prolog, … 用途に応じて無数に提案されている 本講義では,シンプルさ(学習障壁の少なさ)

def文の実行規則

関数定義も文の一種 (def文 )

def文を「実行」すると ,その名前で関数が定義される 後からそれを使う (「呼び出す」 )ことができる 注 :def文はあくまで関数を定義するだけ . その場で本体が実行されるわけではない

Page 17: プログラミングtau/lecture/komaba...Python, Ruby, Perl, PHP, Lisp, Scheme, Haskel, ML, OCaml, Prolog, … 用途に応じて無数に提案されている 本講義では,シンプルさ(学習障壁の少なさ)

関数呼び出し式の実行規則

関数呼び出しの値が計算される際 , その「本体」 (文の羅列 )が実行される パラメータに値が渡される return ...も文の一種 (return文 )

Page 18: プログラミングtau/lecture/komaba...Python, Ruby, Perl, PHP, Lisp, Scheme, Haskel, ML, OCaml, Prolog, … 用途に応じて無数に提案されている 本講義では,シンプルさ(学習障壁の少なさ)

return文の実行規則

関数の本体を実行中 , return文

が実行されると , 式が計算され その関数呼び出しが終了し ,

式の計算結果がその関数呼び出しの計算結果となる

return 式

Page 19: プログラミングtau/lecture/komaba...Python, Ruby, Perl, PHP, Lisp, Scheme, Haskel, ML, OCaml, Prolog, … 用途に応じて無数に提案されている 本講義では,シンプルさ(学習障壁の少なさ)

式について 数 (1, 2, 3, …) 演算子 (3 + 4, 2 + 3 * 4, 123**10) 変数 (x, y, hensu, etc. 関数の入力や代入文の左辺に現れた名前 )

関数呼び出し (def文で )定義したもの 組み込み関数 : Pythonに元々備わっているもの

(abs, sin, cos, log, random, etc.)

複素数の実部・虚部 式 .real, 式 .imag

Page 20: プログラミングtau/lecture/komaba...Python, Ruby, Perl, PHP, Lisp, Scheme, Haskel, ML, OCaml, Prolog, … 用途に応じて無数に提案されている 本講義では,シンプルさ(学習障壁の少なさ)

組み込み関数を使う場合の注意

from math import * 数学関数 (cos, sin, log, exp, など )を使えるようにするためのおまじない

「mathから全部持ってくる」 from random import *

乱数関数 (random, randint)などを使えるようにするためのおまじない

Page 21: プログラミングtau/lecture/komaba...Python, Ruby, Perl, PHP, Lisp, Scheme, Haskel, ML, OCaml, Prolog, … 用途に応じて無数に提案されている 本講義では,シンプルさ(学習障壁の少なさ)

プログラムの「雛形」

from math import *from random import *

def f(x, y): …

def g(x, y, z): …

print f(10, 20)g(100, 200, 300)

おまじない (必要ならば )

関数の定義 . ここが中心 . 本題

実際の「実行」

Page 22: プログラミングtau/lecture/komaba...Python, Ruby, Perl, PHP, Lisp, Scheme, Haskel, ML, OCaml, Prolog, … 用途に応じて無数に提案されている 本講義では,シンプルさ(学習障壁の少なさ)

残り (文の全容 )

if文 代入文 繰り返し

while文 for文

print文についてもう少し

Page 23: プログラミングtau/lecture/komaba...Python, Ruby, Perl, PHP, Lisp, Scheme, Haskel, ML, OCaml, Prolog, … 用途に応じて無数に提案されている 本講義では,シンプルさ(学習障壁の少なさ)

if文

条件式が真なら then節 ,偽なら else節を実行

条件式は任意の式 then節 ,else節は任意個の任意の文

def my_abs(x): if x < 0: return -x else: return x

条件式

then節

else節

def my_abs(x): if x < 0: return -x else: return x

if文

Page 24: プログラミングtau/lecture/komaba...Python, Ruby, Perl, PHP, Lisp, Scheme, Haskel, ML, OCaml, Prolog, … 用途に応じて無数に提案されている 本講義では,シンプルさ(学習障壁の少なさ)

代入文 (アホな例 )

代入文 (yという「余白」に 1と書く )def gojo(x): y = 1 y = y * x y = y * x y = y * x y = y * x y = y * x return y

右辺の式を計算し ,左辺の変数名の ,「以降の値」をそれに設定

右辺 (任意の式 )

左辺 (変数名 )

Page 25: プログラミングtau/lecture/komaba...Python, Ruby, Perl, PHP, Lisp, Scheme, Haskel, ML, OCaml, Prolog, … 用途に応じて無数に提案されている 本講義では,シンプルさ(学習障壁の少なさ)

繰り返し (while文 )

条件式を計算 .偽ならば終了 .真ならば本体を実行してもう一度繰り返し 言い換え : 条件式が偽になるまで本体を何度でも実行

def njo(x, n): y = 1 ato_nankai = n while ato_nankai > 0: y = y * x ato_nankai = ato_nankai – 1 return y 本体

条件式

while文

Page 26: プログラミングtau/lecture/komaba...Python, Ruby, Perl, PHP, Lisp, Scheme, Haskel, ML, OCaml, Prolog, … 用途に応じて無数に提案されている 本講義では,シンプルさ(学習障壁の少なさ)

繰り返し (for文 )

指定された範囲の値を順に変数に代入して本体を実行

何回繰り返すかが繰り返しの開始時にわかる場合は whileよりも forを使う方が簡単

def njo(x, n): y = 1 for i in range(0, n): y = y * x return y

本体

範囲for文

Page 27: プログラミングtau/lecture/komaba...Python, Ruby, Perl, PHP, Lisp, Scheme, Haskel, ML, OCaml, Prolog, … 用途に応じて無数に提案されている 本講義では,シンプルさ(学習障壁の少なさ)

print文についてもう少し

一般的な文法

複数の式を表示可能 (空白で区切られる ) 式として文字列 (”hello”など )も許される 例 結果

print 式 , 式 , ...

print x, ”+”, y, ”=”, x+y

10 + 20 = 30

Page 28: プログラミングtau/lecture/komaba...Python, Ruby, Perl, PHP, Lisp, Scheme, Haskel, ML, OCaml, Prolog, … 用途に応じて無数に提案されている 本講義では,シンプルさ(学習障壁の少なさ)

Python文法の特徴・注意点 要所でコロン (:) 要所で改行 (コロン後に改行 ,1行に 1文 ) 要所で「字下げ」

(def文の本体 , ifの then/else節 , while/forの本体の始まり )

それらの文は同じだけ「字下げ」 def njo(x, n): y = 1 a = n while a > 0: y = y * x a = a – 1 return y

while a > 0: y = y * x a = a – 1

while a > 0: y = y * xa = a – 1

Page 29: プログラミングtau/lecture/komaba...Python, Ruby, Perl, PHP, Lisp, Scheme, Haskel, ML, OCaml, Prolog, … 用途に応じて無数に提案されている 本講義では,シンプルさ(学習障壁の少なさ)

やってしまいがちなミス

何がやってしまいがちかよりも , 「やってしまうと何が起きるか」を理解すること

(エラーメッセージの解読 ) エラーメッセージを見て直せること

ミスをしないことは不可能

Page 30: プログラミングtau/lecture/komaba...Python, Ruby, Perl, PHP, Lisp, Scheme, Haskel, ML, OCaml, Prolog, … 用途に応じて無数に提案されている 本講義では,シンプルさ(学習障壁の少なさ)

from math import * 忘れ

結果

print cos(1.57)

Traceback (most recent call last): File "c.py", line 2, in <module> print cos(1.57)NameError: name 'cos' is not defined

どこで何をしようとしたときにエラーが起きたのか

直接の問題 (cosが定義されていない )

Page 31: プログラミングtau/lecture/komaba...Python, Ruby, Perl, PHP, Lisp, Scheme, Haskel, ML, OCaml, Prolog, … 用途に応じて無数に提案されている 本講義では,シンプルさ(学習障壁の少なさ)

変数名 ,関数名の綴り間違い

結果

def f(x): return z + 1print f(10)

Traceback (most recent call last): File "c.py", line 4, in <module> print f(10) File "c.py", line 2, in f return z + 1NameError: global name 'z' is not defined

Page 32: プログラミングtau/lecture/komaba...Python, Ruby, Perl, PHP, Lisp, Scheme, Haskel, ML, OCaml, Prolog, … 用途に応じて無数に提案されている 本講義では,シンプルさ(学習障壁の少なさ)

関数の return忘れ

結果

def f(x): x + 20print f(10)print f(10) + 40.5

NoneTraceback (most recent call last): File "c.py", line 4, in <module> print f(10) + 40TypeError: unsupported operand type(s) for +: 'NoneType' and 'float'

Noneは関数呼び出しが returnを実行せずに終了した場合に自動的に変えされる値Noneが print文で printされている

None + 40.5 を実行しようとして失敗

Page 33: プログラミングtau/lecture/komaba...Python, Ruby, Perl, PHP, Lisp, Scheme, Haskel, ML, OCaml, Prolog, … 用途に応じて無数に提案されている 本講義では,シンプルさ(学習障壁の少なさ)

無限whileループ

結果 (し~ん )

def njo(x, n): y = 1 a = n while a > 0: y = y * x return y