ここでは,プログラムでさまざまなデータに名前をつけて扱う仕組みである「変数」について説明します. また四則演算を含む算術演算について説明します.
もくじ
例題
ここでこの図を描く二つのプログラムを示します.
- vsample0.py(亀の動作に関するデータをすべて数値で記述)
- vsample.py(亀の動作に関するデータを変数で記述)
どちらのプログラムでも同じ図形を描くことができます. 最初のプログラム(vsample0.py)では,亀の動作に関するデータをすべて数値で記述しています. 二番目のプログラム(vsample.py)では,亀の動作に関するデータを「変数」(variable)で記述しています.
変数とその威力
変数(variable)とは,プログラムでデータに名前をつけて扱う仕組み,名前とデータを対応させる仕組みです. ここでは変数の威力について説明します. 具体的には変数には次のような意義があります.
- プログラムを書くときの変数の意義
- 名前でデータに意味づけ,データとデータの関係の明示
- プログラムの修正を容易にする
- プログラムを実行するときの変数の意義
- プログラムの汎用化
- 外部のデータの処理
- 計算結果の再利用
以下,それぞれについて説明します.
名前によるデータの意味づけ,データとデータの関係の明示
変数はプログラムでデータに名前をつけて扱う仕組みを提供します. プログラムに現れるさまざまなデータにそれらを区別できる名前を適宜つけておいて, 名前を用いてデータを表現したり,データとデータの関係を一般的に表現することができます. たとえば計算式を名前を使って一般的に表現したり, 計算された結果のデータに名前をつけてその結果を後で使ったりすることができます. プログラムでは,変数に対応するデータの値を必要なだけ適宜指定することで, 名前に値をあてはめて処理を順次実行していくことができます.
上で示した二番目のプログラム(vsample.py)では実際に変数を用いて,データを名前で表現したり,データとデータの関係を式で表現したりしています. 次の2つのデータは数値で指定しています.
sz = 200 # 一番外側の正方形の辺の長さ m = 20 # 正方形と正方形の間の間隔
このようにデータに適切な名前をつけておけばデータの意味が把握しやすくなります(どんな名前でもよいわけではありません).
さて二つめ,三つめの正方形のサイズはこれらのデータ(sz,m)から計算式によって導出されています. ここで「*」は乗算を意味します(以下同様).
sz2 = sz - 2*m # 2番目の正方形の辺の長さ sz3 = sz2 - 2*m # 3番目の正方形の辺の長さ
このように変数を使った式でデータを記述することでデータとデータの関係を明示できます.
さて,上で示した最初のプログラム(vsample0.py)では,データをすべて数値で記述していて,変数(名前)は一切使っていません. 今回の例題については,これでも問題なく同じ図形を描くことができます. こちらのプログラムの方が全体として記述量は少なくなっています.
しかし変数を使っていないプログラムではデータの意味を掴むことが簡単ではありません. データとデータの関係も読み取れません. 変数を用いないプログラムでは,たとえ同じ値が並んでいたとしても, それらがたまたま同じ値になっている別々のデータなのか,それともすべて同じデータなのかが分かりません. 一方変数を使ったプログラムでは,同じデータは同じ名前で表現されるため, データの区別は明らかです. たとえば今回の例題の場合, 変数を用いたプログラムでは正方形を描いていることは明らかでしょう. またsz,sz2,sz3の関係から,3つの正方形が外側から順に同じ割合で小さくなっていることも読み取れます.
プログラムの修正を容易にする
一般に描画する図形をデザインする過程では,辺の長さなどのデータをあれこれ調整する必要があるでしょう. 変数を使ったプログラム(vsample.py)では,最初に指定しているデータ(sz,m)さえ変更すれば,他の部分には手を加えることなく,図形全体の大きさ,正方形同士の間隔を簡単に調整できます. 一方で変数を使っていないプログラム(vsample0.py)では, 図形を調整しようとすれば,自分ですべてのデータの値を再計算して,あちこちを修正する必要があります.
変数によるプログラム外部のデータの利用,プログラムの汎用化
例題のプログラムでは処理に必要なすべてのデータの値がプログラム内に与えられています(実行のために必要なデータがプログラムにすべて記述されています). しかしプログラムにすべてのデータの値が常に記述されるとは限りません. プログラム実行中に利用者がデータを指定したり(たとえばWWWブラウザでのURLなど), 他のファイルからデータを読み取ったり(たとえば動画ファイルの再生など)するように, プログラムの外部にあるデータ(プログラム内部には存在しないデータ)を使って処理を行うのはごく一般的なことです. このような外部データを扱う場合にも変数を使います.
この授業のタートルグラフィクスでは「askv」によって数値データを読み込めるようになっています. 次の例では何らかのデータの個数(整数)を利用者が指定することを想定しています. 変数nの値が指定された数値になります(なお「int」は数値を整数化する処理です).
n = int(askv("データの個数を指定してください"))
またこのように変数を用いることで,変数の値に応じた処理を行う汎用的なプログラムを作ることができます. 変数を使わずに値を直接記述したプログラムは汎用性がありません.
変数によるデータの再利用
さてここで一度例題を離れて,f(x)という関数があって「f(10000)✕f(10000)✕f(10000)」の値を計算することを考えてみます. ここでは2通りの方法を示します.
# 手法1 y = f(10000)*f(10000)*f(10000) # 手法2 v = f(10000) y = v*v*v
どちらもy=f(10000)✕f(10000)✕f(10000)の値となります.手法1の方が記述としてはシンプルです. しかし計算時間は手法2が手法1のほぼ1/3になると期待できます. 手法1ではf(10000)を3回計算します. 一方で手法2ではf(10000)を計算するのは1回です. 手法2では「v=f(10000)」としてf(10000)の値を保存しておくことで, データを再利用しているわけです. このように変数によって一度計算したデータを再利用することで余計な手間を省くことができます.
値によるデータの直接指定
プログラムで必ずしもすべてのデータを変数で表現するわけではありません. 例題のプログラム(vsample.py)では, たとえば正方形の描画中に亀が直角に曲がるときに「turn(90)」として値を直接指定しています. どんな正方形を描く場合でも亀が90度ずつ回転していくことには変わりありませんし, この場合90度という角度が何を意味するのかも明確でしょう. これを変数で表現すると却って分かりにくくなるかもしれません.
代入
変数を表す名前とデータを対応付けることを代入といいます. すでにこれまでにも示しているようにPythonでは代入は「名前=式」と表現されます. 左辺がデータを対応付ける変数の名前, 右辺がデータの値を与える式です.
# 代入式: 「名前 = 式」 x = 3 y = 2*x # y = 6
代入によって,右辺の式の値が左辺の名前と対応付けられます. 具体的には次の順で処理が行われます.
- 右辺の式の値を計算する
式に変数が含まれる場合,それらに対応する値を使って計算する. - 計算して得られた値を左辺の変数に対応付ける
すでに値が代入されている変数に再度代入すると値が上書きされます. 変数の値は変わりうるわけです.
x = 3 y = 4 z = x + y # z = 7 z = 2*x*y # z = 24
代入の左辺と右辺に同じ変数が現れることもあります.
x = x + 1 # xに1を加える
数学ではこのような式を書くことはありませんので奇妙に思えるかもしれません. しかしプログラムでは,左辺と右辺に同じ変数をおいて,データを更新することがよくあります. たとえば何かのゲームのプログラムで得点データを変数scoreで表したとして,得点が増えるたびに,scoreの値を更新することが考えられます.
score = score + 10 # 10点を得た(scoreが10増える)
代入では上で説明した通り, まず右辺の値を計算して,その計算結果を左辺の変数に対応づけます. たとえば,代入(score=score+10)を行う前の時点で,scoreの値が5だったとしましょう.
score = 5 # scoreに5を対応づける score = score + 10 # scoreに10を加える
代入式「score=score+10」は次のように解釈されます.
- 右辺(score+10)の値を計算する
- 変数scoreが現われているので,これに対応するデータを取得する. 現在それは5である.
- scoreが5と分かったためscore+10,つまり5+10を計算する.結果は15である.
- 左辺に右辺の値を計算した結果を対応づける.
左辺の変数はscoreである.scoreに右辺の値15を対応づける.
これにより,結果として,代入の前と比べてscoreの値が10増えることになります.
代入に関する注意
代入によって左辺と右辺の式が対応付けられるわけではないことに注意してください.
x = 3 y = 2*x+1 # y = 7 x = 4 # この時点でy = 9?? # → y = 7のまま(y = 9ではない)
上でも説明した通り,代入ではまず右辺の式の値が計算されて, その計算結果である値が左辺の名前と対応づけられます. 計算した後の値が対応付けられるのであって,式が対応づけられるわけではありません. 上の例でyに対応付けられたのは7という値です. 「2*x+1」という式が対応付けられたのではありません.
変数の定義
Pythonでは変数は最初の代入によって定義されます. 変数を定義する前にその値を利用しようとするとエラーとなります.
# ここからプログラムがはじまっているとする a = b + 1 # ==> エラー (この時点でbは定義されていない) b = 2
変数の有効範囲
Pythonでは変数を定義した後,それをいつでもどこでも使えるわけではありません(例外もあります). 変数にはプログラム内でその値が参照できる範囲が定められています. つまり変数には有効範囲(スコープ)があります. この演習ではスコープを気にする必要はありません.
名前のつけ方
変数の名前にはルールがあります. 以下にでの変数の命名ルールを示します.
- 使える文字は英数字とアンダースコア(_)
- 最初の文字は数字以外
例えば「x」「 Foo」「 this_is_a_variable」はいずれも 変数名として有効です. 数学では名前は1文字にするのが一般的です(添字などが付くことも多い). プログラムではデータの意味を分かりやすくするように長い名前を使うことが一般的です(もちろん例外もあります).
次の二つを較べると2つ目の方が何を意味しているのかが分かりやすいのではないでしょうか.
y = a * b / 2 area = base * height / 2
なおPythonには最初から用途が定められている予約語があります. それらは名前として使うことはできません. たとえば「try」,「return」,「if」は予約語です. 予約語をプログラムで変数として使うとエラーになります(形式的に正しいと思えるのにエラーになってしまう場合,予約語を使っている可能性があります).
算術演算子式
Pythonでは四則演算を含めた算術演算が利用できます.
加算 | a+b |
減算 | a-b |
乗算 | a*b |
除算 | a/b |
剰余算 | a%b |
べき乗算 | a**b |
数学での習慣とは異なって乗算の演算子「*」は省略することはできません.
a = 3 b = 2 ab = 10 # abという名前の変数 c = ab # a✕bではない!(c = 10となる) d = c(a+b) # → エラー!! c*(a+b)と書かないとダメ
演算子には優先順位がきめられていて,優先順位の高い方から先に計算が行われます. たとえば,数学と同様に「*」と「/」は「+」と「-」に優先します.
数学と同様に演算の順序を明示するには部分式を括弧でくくります. なお数式をくくる括弧の記号としては常に( … )を使います. 括弧を多重に組み合わせる場合でも( … )以外は使いません. つまり数式をくくる括弧としては{ … }や[ … ]は利用できませんので注意してください.
1+2*3+4 # == 1+6+4 ==> 11 (1+2)*(3+4) # == 3*7 ==> 21 4*(3-(2+1)) # == 0 4*{3-(2+1)} # → エラー!!
コメントの利用
例題のプログラム(vsample.py)では, 「#」から行末までに日本語で説明が書かれている部分が少なからず含まれています. 「#」から行末までは「コメント」として扱われます. コメントはプログラムとしては処理されません. コメントはプログラム実行の際には単に読み飛ばされます. したがってコメントに何が書いてあってもプログラムの実行には無関係です. つまりコメントを書いても書かなくてもプログラムの動作は変わりません. それではコメントは何のために書くのでしょうか.
コメントにはプログラムの説明を適宜書きます. 一度作成したプログラムを後で拡張したり修正したりすることは一般的なことです. そのときプログラムを正しく理解できるのであれば,コメントを書かなくても問題ないとはいえます. しかし複雑なプログラムは読み解くのが難しくなります. 適切なコメントがあればプログラムを理解するのに大いに役立ちます. たとえ自分が書いたプログラムでも,コメントを書いておかないと,しばらく経ってからプログラムを見たときに全く理解できなくなることも少なくありません. プログラムには適宜コメントをつけるようにするとよいでしょう.
最初に提示した「変数を使っていないプログラム」(vsample0.py)にはコメントがありません. コメントを入れれば,このプログラムもわかりやすくできるでしょう.
サンプルプログラム
サンプルプログラムをいくつか紹介します. なお以下で⏎は[Enter]キーを押すことを意味します.
- タートルグラフィクスのプログラム
- その他のプログラム
- h2s.py
平成から西暦への変換を行うプログラムです.$ python h2s.py ⏎
平成を西暦に変換します
平成何年? 17 ⏎
平成17年は西暦2005年です
- t2m.py
坪から平方メートルへの面積単位の変換を行うプログラムです.$ python t2m.py ⏎
坪面積を平方メートルの値に直します
何坪の土地ですか? 27 ⏎
27坪は約89.256平方メートルです
- speed.py
時速(km/h)から秒速(m/s)への変換を行うプログラムです.$ python speed.py ⏎
時速(km/h)を秒速(m/s)に変換します
時速(km/h)? 50 ⏎
時速50kmは,秒速約13.89mです