プログラムを実行する際、プログラムの先頭から末尾まで、1行ずつ実直に実行することはまれだ。フロー制御を用いると、条件に従ってPythonの命令を実行するかどうかを決定ができる。
フロー制御文は、フローチャートの記号に対応づけることができるので、フローチャートを用いて考えてみよう。
通常、フローチャートにおいては、開始から終了まで複数の道筋があり、コンピューターも同様だ。フローチャートでは、菱形の記事で分析店を表現し、長方形で処理のステップを表す。開始と終了のステップは、角の丸い長方形で表す。
フロー制御文について学ぶ前に、まず、「はい」と「いいえ」の選択肢の表現方法を知り、分岐点をPythonのコードとして記述する方法を知る必要がある。そのために、ブール型、比較演算子、ブール演算子を知っておく必要がある。
ブール型
整数や浮働小数点や文字列のデータ型が取りうる値は無限にあるが、ブール値はTrue(真)とFalse(偽)の2種類の値しか取れない(ブール型(Boolean)は、数学者George Booleにちなんで名付けられたデータ型だ)。Pythonで書くときには、ブール型の値は、クォート記号につけずにTrueとFalseと書き、戦闘は大文字、残りは小文字で書く。
比較演算子
比較演算子は、2つの値を比較して1つのブール値を返す。以下が比較演算子の一覧
演算子 : 意味
== : 等しい
!- : 等しくない
< : より小さい
> : より大きい
<= : 以下
>= : 以上
==と=の違い
=と==の違い
比較演算子の==には、等しい記号が2つ、代入演算子の=には統合記号が一つであることに気づいたと思う。両者は混同しやすいので、以下の点を覚えておこう。
•比較演算子==は、両辺が等しいかどうかを調べる。
•代入演算子=は、右辺の値を左辺の変数に代入する。
不等号を表す演算子!=が2つの文字から構成されているので、それと同様に、不等号を表す演算子も2文字の==であると覚えておくと良い。
ブルー演算子
ブルー演算子(and, or, not)は、ブール値を組み合わせる場合に使う。比較演算子のように、一つのブール値を返す。まずand演算子から詳しく説明していく。
二項ブール演算子
andとor演算子は、常に2つのブール値(あるいは式)をとるので、二項演算子とみなされている。and演算子は、両方のブール値がTrueのときにTrueとなり、それ以外はFalseとなる。
審議値表を用いると、ブール演算子の結果をすべて調べることができる。以下にand演算子の真偽値表を示します。
and演算子の真偽値表
式 : 評価結果
True and True : True
True and False : False
False and True : False
False and False : False
一方、or演算子は2つのブール値のどちらかがTrueなら Trueになり、両方がFalseならFalseになる。
以下のor演算子の真偽表を見れば、すべての評価結果がわかる。
or演算子の真偽値表
式 : 評価結果
True or True : True
True or False : True
False or True : True
False or False : False
not演算子
andやorとは異なり、not演算子はひとつのプール値()not演算子はひとつのブール値(もしくは式)だけをとるnotは、ブール値を反転させる。
以下にnot演算子の真偽値表を示す。
not
式 : 評価結果
not True : False
note False : True
ブール演算子と比較演算子を組み合わせる
比較演算子はブール値を返すので、ブール演算子と組み合わせて使うことができる。
and、or、not演算子はブール値のTrueとFalseを扱うのでブール演算子と呼ばれている。4 < 5のような式はブール値ではないが、式を評価蔓とブール値になる。
Pythonは演算子の左辺に式をを先に評価した後に、右辺の式を評価する。両方ともブール値であり、それに評価した結果もブール値になる。(4 < 5) and (5 < 6)を評価する過程を以下に示す。
(4 < 5) and (5 < 6)を評価してTrueになる過程
(4 < 5) and (5 < 6)
↓
True and (5 < 6)
↓
True and True
↓
True
ブール演算子は、算術演算子と同様に優先順位を待つ。Pythonは算術演算子と比較演算子を評価した後に、まずnot演算子を評価し、次にand演算子、最後にor演算子を評価する。
フロー制御の構成要素
フロー制御文は、条件式と呼ばれる部分から始まり、節と呼ばれるコードのブロックが続く。Python特有のフロー制御を説明する前に、条件式とコードのブロックにつて説明していこう。
条件式
これまで説明したブール式はすべて条件式とみなすことができるが、条件式はブロー制御文の文脈で特にそう呼ぶ場合に用いる。条件式は常にひとつのブール値(TrueかFalse)に評価される。フロー制御文は条件式がTrueかFalseかによって、何を実行するかを決定します。ほぼすべてのフロー制御文で条件式を用いる。
コードのブロック
Pythonのコードは1行以上をひとまとまりにしてブロックすることができる。ブロック区間は、コードの字下げで指定する。字下げとは、行の先頭に何個かスペースを入れることだ。Pythonの標準コーディングスタイルでは4文字のスペースを入れる。Googleのスタイルは2文字です。日本語の全角スペースを入れないように注意する。
ブロックのルールには3つある。
1.ブロックは字下げが増えると開始する。
2.ブロックの中には他のブロックを含めることができる。
3.字下げがなくなるが、上位ブロックの字下げに戻るとブロックは終了する。
同じだけ字下げされたコードを見ればブロックであるとすぐにわかる。
プログラム実行
プログラム実行(あるいは単に実行)とは、実行している現在の命令の意味だ。ソースコードを紙に印刷して実行する行を指でなぞっていくと、その指をプログラム実行とみなすことができる。
すべてプログラム実行が、単純に進むとは限らない。フロー制御文を持つプログラムを指でなぞっていくと、条件式に従ってソースコードをあちこち飛ぶことになり、ブロック全体をスキップすることもある。
フロー制御文
フロー制御の重要な構成要素を説明することにする。フロー制御文は、フローチャートで見た菱形の記号を表し、プログラムが条件分岐をする箇所だ。
if文
最もよく用いるフロー制御文はif文だ。if文の節(すなわち、if文に続くブロック)は、条件式がTrueの時に実行される。条件式がFalseならブロックの実行はスキップされる。
日本語で言えばif文はこう読む。「もし条件式が真なら、ブロックの中のコードを実行せよ」Pythonのif文は以下の構成されている。
•ifというキーワード
•条件式(すなわち、TrueかFalseとして評価される式)
•コロン(:)
•次の行に字下げしたコードのブロック(if)
例えば、誰かの名前がAliceかどうか調べるコードがあるとする。
フロー制御文はすべてコロン(:)で終わり、次にコードのブロック(節)が続く。コードの何にprint('Aliceさん、こんにちは。')というブロックがif文の節だ。
if文のフローチャート
開始
|
↓
name=='Alice' ーTrue→ print('やぁ、Alice。')
|
False
↓
終了
else文
if節にはオプションとしてelse文を続けることができる。else節は、if文の条件式がFalseの時に実行される。日本語で書けば、else文がこう読む「もし条件式が真なら、このコードを実行せよ。そうでなければあのコードを実行せよ。」else文には条件式は必要がない。以下のように記述する。
•elseキーワード
•コロン(:)
•次の行に、字下げしたコードブロック(else節)
前述のAliceの例に戻って、名前がAliceでない場合には挨拶を変えるようにelse文を使うとする。
else文のフローチャート
開始
↓
name=='Alice'-True→print('やぁ、Alice')
|
False→print('見知らぬ人よ、こんにちは。')
↓
終了
elif文
これまでの例ではif節かelse節のいずれかの一方だけが実行されるが、多数の節のうちから一つを実行したい場合もある。elif文は「else if」、つまり「そうでなく、もし〜ならば」を意味し、if文や他のelif文に続けて記述する。それ以前の条件式がFalseだった場合に限り、別の条件式を判定する働きをする。elifは、以下のようにコードを記述する。
•elifキーワード
•条件式(TrueかFalseに評価される式)
•コロン(:)
•次の行に、字下げしたコードのブロック(elif節という)
次は年齢をチェックして12よりも小さければ異なるメッセージを出す容易になった。elif節はname == 'Alice'がFalseかつage < 12がTrueの場合に実行される。ただし、両方の条件式がFalseの場合は、どちらの説もスキップされて実行されません。節のうち少なくとも一つが実行されるということは保証されていません。elif文が連鎖しているときは、節のどれか1つが実行されるかひとつも実行されないかのいずれかだ。条件式式がTrueになればe、残りのelif文は自動的にスキップされる。
elif文のフローチャート
開始
↓
name=='Alice'-True→print('やぁ、Alice')
|
False
↓
age < 12-True→print('Aliceじゃないね、お嬢ちゃん。')
|
False
↓
終了
名前チェッカーに2つのelif文を追加し、年齢ageに応じて異なる返事をするようにしました。以下に示す。
開始
↓
name=='Alice'-True→print('やぁ、Alice')
|
False
↓
age < 12-True→print('Aliceじゃないね、お嬢ちゃん。')
|
False
↓
age > 2000-True→print('Aliceは重のような不死身ではない吸血鬼目。')
|
False
↓
age > 100-True→print('Aliceじゃないね、おばあちゃん。')
|
False
↓
終了
この時、elif文の順番が重要だ。試しに順番を変えてわざとバグを作ってみる。
プログラムのフローチャート。ageが2000より大きければ、常に100よりも大きくなるので、Xをつけた箇所には論理的に到達不可能。
開始
↓
name=='Alice'-True→print('やぁ、Alice')
|
False
↓
age < 12-True→print('Aliceじゃないね、お嬢ちゃん。')
|
False
↓
age > 100-True→print('Aliceは重のような不死身ではない吸血鬼目。')
|
False
| \ /
age > 2000-True→print('Aliceじゃないね、おばあちゃん。')
| /
False
↓
終了
elif文の最後には、else文をつけることもできる。その場合には、少なくともひとつ(かつ、たったひとつ)の節が実行されることが保証されることが保証される。ifやelif文の条件式がすべてFalseなら、else節が実行される。例として