この文書は、Linux magazine 2005年1月号〜3月号に掲載された連載の草稿を、(株)アスキーLinux magazine編集部の許可を得て公開するものです。校正前の原稿なので読みづらいところもあるかと思います。不明な点などありましたらコメントをお送りください。
今回はかなり文法中心の内容と, 駆け足の説明ですが、頑張っていきましょう。
今回の目次:
前回までのプログラムは、ソースコード上の命令 (文) は、上から順番に実行されるものばかりでした。ユーザがマウスをクリックしたりしたときに別のメソッドを呼び出したりすることもありましたが、私たちが書くソースコード (スクリプト) のなかでは、やはり上から下に実行されるだけでした。
データの内容やユーザの操作によっては、単純に上から順に実行するだけではやりたいことを実現できないことがあります。状況によっては、ある部分は実行してある部分は実行しない、あるいはプログラムのうち一定の範囲を何度か繰り返して実行するようにしたい、ということがあります。
このようなとき、Pythonでは、if文、while文、for文を使います。いずれも、これらの文を実行するときに指定する条件が成立しているかどうかを確認して、成立しているときにだけ付随する文を実行したり、繰り返したりします。
このほかにも便利な(短く書ける)書き方もありますが、まずは以下のものを覚えるだけで事足ります。
if文は、文の固まりを、条件次第で、あるときには実行してあるときには実行しないようにします。文法は次のとおりです。
if 式: 文 文 文...
まずif
の直後に式を書きます。この式を条件式といいます。スクリプトの実行の流れが if文のところにきたときにこの式が計算され、その計算結果が真(後述します。)のとき、「:
」の次に続く文が実行されます。
実行するかどうかの対象となる文は、字下げして書きます。字下げしている範囲がひと塊として扱われます。この固まりでは、新しい変数のスコープは導入されません。
次のスクリプトは、ごく単純なもので、ユーザに数を入力するように求め、入力結果が5より大きいときのみ画面に文字列を出力します。5以下のときは何もせず終了します。
03-01.py
例えば6を入力したときの実行結果は次のようになります。
$ python3 03-01.py 数字>>> 6 入力された数字は5より大きい。
input()
は、引数の文字列を画面に表示した上で、ユーザからの入力を待ちます。ユーザが何か入力してEnterキーを打つと、入力した文字列が戻り値となります。
条件式では、二つの値が一致しているか、あるいは大小関係などを調べたいです。すでに示したサンプルで、変数x
(の指すオブジェクト)が数値の5より大きいか調べました。
二つの値(オブジェクト)が一致しているかは「==
」で、大きいかは「>
」で調べることができます。このような記号を関係演算子といいます。その一覧は表1です。and
, or
の計算結果はTrue, Falseではありません。これが役立つところもありますが、今は気にしなくてもいいです。
記法 | 計算結果がTrueになるとき |
---|---|
x == y | xとyが一致している |
x != y | xとyが一致していない |
x < y | xがyより小さい |
x <= y | xがyと同じか小さい |
x > y | xがyより大きい |
x >= y | xがyと同じか大きい |
x in y | xがyに含まれる |
x and y | xかつy。計算結果は、xが偽であればx、そうでなければy |
x or y | xまたはy。計算結果は、xが真であればx、そうでなければy |
not x | xが偽である |
数値は常識的に大小関係が判定されます。文字列、タプル、リストは、長さ(要素の数)が同じですべての要素が両者で一致していれば ==
の計算結果はTrueとなり、違うものがあればそこで大小関係が判定されます。文字の大小関係は文字コード表のコードで判定されます。
「x in y
」でのyはタプルまたはリストで、x がy のどれかの要素と同じであれば、計算結果がTrueになります。
次のスクリプトで関係演算子の動作を確認してみます。"A"より"a"のほうが文字のコードが大きいので"abc"のほうが大きくなります。
03-02.py
条件式の計算結果が真と判定される、とはどういうことか、もう少し見ておきましょう。Pythonでは、式の計算結果は、必ず真か偽のいずれかになります。
偽となるのは、計算結果が数値の0と0.0、空の文字列 ""
、空のタプル ()
、空のリスト []
、None
オブジェクト、または False
オブジェクトのときです。それ以外はすべて真となります。False
だけが偽ではなく、True
だけが真というわけでもありません。
03-03.py は、さまざまな値(オブジェクト)が真と判定されるか、偽と判定されるかを表示します。関数tのなかのif文で判定し、真のときは"t"と、偽のときは"false"と表示します。[""]は、""という要素を持つので、真です。
03-03.py それぞれの値が真か偽かを表示する
そうすると、計算結果が0以外かどうかを調べるときは、わざわざ「!= 0
」を書かなくても差し支えないことが分かります。0以外かどうかを調べることはよくあり、!= 0
を省略して書く人も多いです。
先ほど else:
を使いましたが、if文は、すでに見た単純な形の後ろにelif節やelse節を加えることで、条件式Aが成り立っているときは文Xを実行する、そうでなくて条件式Bが成り立っているときは文Yを実行する、それとも違うときは文Zを実行する、と書くことができます。
文法は、次のようになります。
if 条件式A: 文 文 文... [elif 条件式B: ---+ 文 |elif節 文 | 文...]... ---+ [else: ---+ 文 |else節 文 | 文...] ---+
if文では、ifに続く文、elif節の文、else節の文のどれか一つだけが実行されます。スクリプトの上から順に条件式が判定され、上記の条件式Aが真のときはif
に続く文が、条件式Bが真のときはelif
に続く文が実行されます。いずれも違うときはelse節の文が実行されます。
elif節はいくつでも書くことができ、その場合もスクリプトの上から順に条件式が真かどうか判定されていきます。
if文を使ってみましょう。03-04.py は、ウィンドウにボールを表示し、画面の枠にぶつかったら跳ね返るように動かします。(画面1)
03-04.py 跳ね返るボール
実行結果
順に何をしているか見ていきます;
tkinter.Tk()
でウィンドウを生成し、tkinter.Canvas()
でボールを描くためのキャンバスを生成します。
Canvas#create_oval()
で円を描きます。
on_timer
メソッドを呼び出してもらいます。after
メソッドは、最初の引数の時間を経過したときに自動的に呼び出すメソッド・関数を登録します。時間はミリ秒単位で指定します(ここでは50ミリ秒 = 0.05秒を指定)。
Canvas#coords()
は、オブジェクトのキャンバス上での座標を調べたり設定したりします。引数としてオブジェクトを渡すと、現在の座標を調べて返します。戻り値は順に、左上のX座標、Y座標、右下のX座標、Y座標です。
self.dx
だけ、Y軸方向にself.dy
だけボールを動かします。x1 += self.dx
は、x1 = x1 + self.dx
と同じ意味で、変数x1
の値にself.dx
を足した結果を, x1
が指すようになります。
+=
だけでなく, -=
, *=
などもあります。
or
を組み合わせています。
Canvas#coords()
に新しい座標を引数として与えます。これでボールが移動します。
after
メソッドで on_timer
を登録しなおします。after
メソッドは, 時間が経過したときに一度だけしか登録した関数を呼び出しません。このサンプルプログラムでは連続して呼び出してほしいので、毎回 on_timer
を登録しなおします。
while文は、条件式の計算結果が真である間、続く文の実行を繰り返します。実行する文を字下げして書くのは、if文のときと同じです。
文法は、次のようになります。
while 条件式: 文...
次のスクリプトは、入力された数字をどんどん足していくものです。入力が空のとき(ユーザが何も入力せずにEnterキーを打ったとき)に終了します。while文で、入力結果が空の文字列 ""
かどうか調べ、そうでないときに続く3行を実行します。
03-05.py
実行結果は、次のようになります;
>>> 1 1 >>> 10 11 >>> 25 36 >>> <= ここでEnterのみ打ったので、終了 $
for文は、一定の回数、文の実行を繰り返します。文法は次のとおりです。
for 変数名 in 式リスト: 文...
式リストは、タプル、リストなど要素を持つ(格納する)ものです。for文は、式リストの要素を前から順番に変数に代入し、続く文を繰り返し実行します。
for文でも、新しいスコープは導入されません。
例えば次のように書きます。
03-06.py
要素の値を累積して表示します。変数 i
にタプルの要素1、3、5が順番に代入されて、続く文(print文)が実行されます。実行結果はこうなります;
$ python3 03-06.py 1 4 9
ところで、プログラムを書いていると、何回目の実行かはどうでもよくて、繰り返す回数だけが重要な場合がよくあります。このようなときは、式リストに range
関数を書きます。range
関数は、繰り返しを生成します。
range(n)
range(start, n)
for文では、例えば次のように書きます。
03-07.py
while文、for文で繰り返しの文を実行しているときに、最後まで繰り返すのを止めて、その場で繰り返しから抜け出すようにしたいことがあります。このような場合には、break文を使います。
break文は、繰り返しの文の中から、その場で脱出します。次の例は、i
が3のときに繰り返しを終了します。そのため、1と2しか表示されません。
03-08.py
実行結果$ python3 03-08.py 1 2 finish: 3
繰り返しのブロックの途中でいったん中断し、while
の条件式の判定に戻ったり、for
で次の要素による繰り返しに進むには、continue文を使います。
こちらも、break文と同様、continue
と書くだけです。
次の例は、i
が2のときに繰り返しのブロックの残りをスキップして、for
の式リストの次の要素による繰り返しに進みます。
03-09.py
実行結果1 3 4