View
2
Download
0
Category
Preview:
Citation preview
プログラミング
田浦健次朗
動機
なんとなくコンピュータに計算をさせる際の「考え方」「ノリ」はわかった (ことにしよう )
そうであっても ,機械語でプログラムを作る(CPUの命令を実際に並べる )のはひどく大変 !
何が大変 ?
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
それがこんなことに ...
ある値を覚えておく場所を自分で覚えておかなくてはならない (○○は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
プログラミング言語
人間に易しくプログラムを表現する記法 (「言語」 )
言語処理系 その言語のプログラムを「対応する機械語に読み替えて」実行してくれる
「読み替えて実行してくれる」のもまたプログラム !
いくつかの言語の実例 (固有名詞 )
C, C++, Pascal, Fortran, Java, JavaScript, Python, Ruby, Perl, PHP, Lisp, Scheme, Haskel, ML, OCaml, Prolog, …
用途に応じて無数に提案されている 本講義では ,シンプルさ (学習障壁の少なさ )を理由に ,Pythonで演習を行う
大部分のプログラミング言語に共通の事項 (1)
変数 (x, y, z, ...): 「方眼紙のマス目」に相当 「番地」を覚える必要は無く「自分の好きな名前」をつけられる
式 : 数学で良く使う記法や関数を自然にかける 計算方法は「処理系」が考えてくれる
大部分のプログラミング言語に共通の事項 (2)
条件による分岐や ,繰り返しをすっきりと書く記法 if文 ,while文 ,for文
関数 : プログラムの一部に相当 複数の関数を組み合わせてまた別の関数を作ることができる
本質的な「ノリ」は同じ 方眼紙と鉛筆のアナロジー ,繰り返しが重要 ,etc. 結局すべて「機械語の命令列を書きやすくしたもの」だからある意味では当然
プログラミング言語の学び方
第一段階 : 例から学ぶ どんな問題にどのような手段 (変数 ,繰り返し ,関数 ,...)が用意されているか
第二段階 : 文法と規則をしっかり意識する (残念ながら )特に最初は ,「プログラミング」「間違いとの戦い」
プログラムを書いていて遭遇するエラーへの対処ができるように
Pythonプログラミングを始める
プログラムの作成・編集 : テキストエディタ(mi, emacs, …) .py で終わるファイル名 で保存
プログラムの実行 : コマンドラインで ,pythonコマンド
動作 : 指定されたファイルに書かれている Pythonプログラムを実行
動作 : Pythonのプロンプトに対して対話的にプログラムを入力 ,その場で結果を確認できる
python ファイル名
python
最初の例 :
以下を a.py として作成
端末 (コマンドライン )で以下を実行
結果
print 12345679 * 63print 12345679 * 72
python a.py
777777777888888888
起きたこと (プログラムの実行規則 )の説明
プログラムは一般には ,文を羅列したもの printも文の一種 (print文 )
プログラムを pythonコマンドで実行すると ,かかれた文を順に「実行」していく
print 式を実行すると式の値が計算され ,結果が表示される
関数 (最重要コンセプト )
プログラムは ,あるまとまった計算をする断片を「関数」という単位で書くのが基本
実行結果
def f(x, y): return 3*x+4*y
print f(10, 20)
関数定義 (def文 )
110
関数にまつわる文法と用語
def f (x, y): return 3*x+4*y
print f(10, 20)
関数名 パラメータ関数への入力を受け取る変数名
本体 (中身 )文の羅列 (この例では一つ )
関数呼び出し
関数定義
def文の実行規則
関数定義も文の一種 (def文 )
def文を「実行」すると ,その名前で関数が定義される 後からそれを使う (「呼び出す」 )ことができる 注 :def文はあくまで関数を定義するだけ . その場で本体が実行されるわけではない
関数呼び出し式の実行規則
関数呼び出しの値が計算される際 , その「本体」 (文の羅列 )が実行される パラメータに値が渡される return ...も文の一種 (return文 )
return文の実行規則
関数の本体を実行中 , return文
が実行されると , 式が計算され その関数呼び出しが終了し ,
式の計算結果がその関数呼び出しの計算結果となる
return 式
式について 数 (1, 2, 3, …) 演算子 (3 + 4, 2 + 3 * 4, 123**10) 変数 (x, y, hensu, etc. 関数の入力や代入文の左辺に現れた名前 )
関数呼び出し (def文で )定義したもの 組み込み関数 : Pythonに元々備わっているもの
(abs, sin, cos, log, random, etc.)
複素数の実部・虚部 式 .real, 式 .imag
組み込み関数を使う場合の注意
from math import * 数学関数 (cos, sin, log, exp, など )を使えるようにするためのおまじない
「mathから全部持ってくる」 from random import *
乱数関数 (random, randint)などを使えるようにするためのおまじない
プログラムの「雛形」
from math import *from random import *
def f(x, y): …
def g(x, y, z): …
print f(10, 20)g(100, 200, 300)
おまじない (必要ならば )
関数の定義 . ここが中心 . 本題
実際の「実行」
残り (文の全容 )
if文 代入文 繰り返し
while文 for文
print文についてもう少し
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文
代入文 (アホな例 )
代入文 (yという「余白」に 1と書く )def gojo(x): y = 1 y = y * x y = y * x y = y * x y = y * x y = y * x return y
右辺の式を計算し ,左辺の変数名の ,「以降の値」をそれに設定
右辺 (任意の式 )
左辺 (変数名 )
繰り返し (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文
繰り返し (for文 )
指定された範囲の値を順に変数に代入して本体を実行
何回繰り返すかが繰り返しの開始時にわかる場合は whileよりも forを使う方が簡単
def njo(x, n): y = 1 for i in range(0, n): y = y * x return y
本体
範囲for文
print文についてもう少し
一般的な文法
複数の式を表示可能 (空白で区切られる ) 式として文字列 (”hello”など )も許される 例 結果
print 式 , 式 , ...
print x, ”+”, y, ”=”, x+y
10 + 20 = 30
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
やってしまいがちなミス
何がやってしまいがちかよりも , 「やってしまうと何が起きるか」を理解すること
(エラーメッセージの解読 ) エラーメッセージを見て直せること
ミスをしないことは不可能
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が定義されていない )
変数名 ,関数名の綴り間違い
結果
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
関数の 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 を実行しようとして失敗
無限whileループ
結果 (し~ん )
def njo(x, n): y = 1 a = n while a > 0: y = y * x return y
Recommended