これまでPythonのデータ型とデータ構造を学んできました。
ようやくこれらを組み合わせたコード構造に入っていきます。条件によって振り分けたり分岐したり繰り返したりするフロー制御のコードを扱っていきましょう。
ここではif文を使った条件分岐について扱います。
Pythonコードの特徴の確認
まず、Pythonのコードブロックの特徴をPHPプログラミングと比較して見ておきましょう。
変数xが10より小さい時には「xは10より小さいです。」と出力し、そうで無い時には「xは10以上です。」と出力するというコードをまず用意してみました。
こちらはPHPで書いたもの。
<?php
$x = 10;
if ($x < 10) {
print 'xは10より小さいです。';
} else {
print 'xは10以上です。';
}
これをPythonで書くとこうなります。
x = 10
if x < 10:
print('xは10より小さいです。')
else:
print('xは10以上です。')
コード自体の意味は簡単だと思います。
二つのコードの違いがわかるでしょうか? Pythonのコードの方がスッキリしていて見やすいのではないかと思います。
Pythonは変数に$を使う必要がありませんし、条件分を丸括弧()で括る必要もありません。波括弧{}でブロックを作る代わりに、条件分をコロン「:」で終了し、ブロック部分は半角スペース4つ分のインデントで字下げして書くという特徴があります。
こういった書き方は以前にもこちらで触れました。
今一度、確認しておくといいと思います。
if文による条件分岐
それでは、if文からはじめていきましょう。ifはelif、elseと共に条件文で使うキーワードです。
条件文は制御構造の一つで、与えられた条件によって、どのような処理を実行するか判断するコードになります。
コードを日本語で書いてみると、こんな形になります。
もし(if) 条件式(が成立している) ならば(:)
_ _ _ _ここに書かれたコードを実行します
そうでないならば(else:)
_ _ _ _こちらに書かれたコードを実行します
上で挙げたコードと見比べてみるといいですね。
ifにづつけて振り分けたい条件式を書きます。条件式の最後にはコロン(:)を記入します。
条件式が成立している場合(真の場合)、すぐ下のブロックのコードが実行されます。
条件式が成立していない場合、elseの下のブロックのコードが実行されます。
if文とif-else文の条件分岐
if文は単独でも使うことができますが、その場合は条件文が成立しない時にブロックが実行されないというだけになります。
形としては次のようになります。
if 条件式A:
実行コードA
else:
実行コードB
条件式Aが成立するならコードAが実行され、成立しないならばコードBが実行されます。
条件がTrueの時のif文を次のように書いてみました。
hungry = True
if hungry:
print('I want to eat something!')
条件文が成立していない時にどんな処理をするかも記述しておくと処理の流れが見やすくなります。条件が成立しなかった場合に実行したい処理がある場合はelse文を使い、ifと合わせて使います。
上のコードをelseも使って条件が成立していない場合の処理も書き加えてみます。ファイル名はif-statement.pyとしています。
hungry = True
if hungry:
print('I want to eat something!')
else:
print('I am full.')
Atomエディタで実行するとこうなります。
条件がTrueなので、すぐ下のブロックの処理が実行されています。
今度は、条件をfalseにしてみました。
hungry = False
if hungry:
print('I want to eat something!')
else:
print('I am full.')
実行するとこうなります。
条件をFalseにしたので、elseの下のブロックが実行されています。
elif文を使った条件分岐
if-else文は条件が成立してる場合、成立しなかった場合の処理でしたが、さらに別の条件の場合を調べたい時があります。この場合はelif文も合わせて使うことでコードを書くことができます。
Pythonではelifと書きます。他のプログラミング言語ではelseif、else ifと書いたりするので違いに注意しましょう。
形としては次のようになります。
if 条件式A:
実行コードA
elif 条件式B:
実行コードB
else:
実行コードC
条件式Aが成立すればコードAが実行され、成立していなければ条件式Bが検証され成立していればコードBが実行され、いずれの条件も成立していなければコードCが実行されます。
検証したい条件がもっと必要であれば、elif文を必要なだけ書き加えることで分岐を増やすことができます。
具体的なコードでやってみましょう。
code = "Python"
if code == "Python":
print('I want to learn Django!')
elif code == "PHP":
print('I want to learn WordPress!')
elif code == "Swift":
print('I want to learn how to make iPhone apps.')
else:
print('I\'m going out for a walk.')
これまでと違って、条件文のところにTrueやFalseになる変数をそのまま入れるのではなく、今回は比較演算子(==)を使って条件文の左右の値が等しいかどうかを調べるコードにしています。(変数codeに代入された値と等しいかどうかを調べる)
これを実行してみます。
code = “Python”なので、最初の条件文と合致しています。ですからここでは一番最初のコードブロックが実行されているのがわかります。
今度はcode = “Ruby”にして、条件文に無い値をしてして書き換えてみます。
code = "Ruby"
if code == "Python":
print('I want to learn Django!')
elif code == "PHP":
print('I want to learn WordPress!')
elif code == "Swift":
print('I want to learn how to make iPhone apps.')
else:
print('I\'m going out for a walk.')
これを実行するとこうなります。
条件式の当てはまらない値なので、else文のコードブロックが実行されているのがわかりますね。
Pythonには他のプログラミング言語にあるswitch文がありません。これと同じような処理をこうやってPythonでは行います。
if文を入れ子構造にしてみる
条件の変数を2つ用意(複数条件)してif文を入れ子構造で書くこともできます。
コード例を書いてみます。
a = 100
b = 50
if a > 0:
print("a is not zero.")
if b > 0:
print("b is not zero.")
入れ子のインデントの位置を間違えないようにしないとブロックと認識されないので注意が必要です。
これを実行してみるとこうなります。
また、elif文のところで使ったコードをif-else文の入れ子構造で書き換えると次のようになります。
code = "Python"
if code == "Python":
print('I want to learn Django!')
else:
if code == "PHP":
print('I want to learn WordPress!')
else:
if code == "Swift":
print('I want to learn how to make iPhone apps.')
else:
print('I\'m going out for a walk.')
実行はしませんが、変数の値を同じように変えても実行結果は変わりません。
ただこちらのコードはインデントが重なってブロックがとても複雑になっています。スッキリしたコードを書くほうがベストですから、こういう書き方もできるということで、その場に応じたコードを書くようにしましょう。
まとめ
Pythonのフロー制御のコードとして、ここではif文を利用して条件分岐を扱いました。
条件が成立した時に実行するコードをインデントしたブロックに書きます。条件が成立しない場合はelse文を、複数の条件がある場合はelif文を使って書きます。
Pythonは他のプログラミング言語と違ってコードブロックを波括弧で括るような書き方はせず、インデントで字下げして書くのでスッキリしたコードになります。
インデントの位置を間違えないように気をつけましょう。