スクリプトでは「条件分け」をして、
その後の処理を決める場面がよく出てきます。
そこで、今回はPythonで条件分けをするための
「if文」について、解説していきます。
if文
if文はPythonで条件分けによる処理をするための機能です。
英語の「if」(もしも~~~だったら?)と意味合いは同じだと思ってください。
if文の書き方
if 条件式:
真の場合の処理
条件式・真の場合といった用語をもっと詳しく解説していきましょう。
条件式とは?
もしも~~~だったら?の「~~~だったら?」の部分が条件式となるのですが、
具体的に簡単な例として、
・変数「a」の値が「1」だったら?
という場合を考えてみましょう。
この場合は、以下のように記述します。
a = 1
if a == 1:
真の場合の処理
まず変数「a」を宣言し「1」を代入しています。
そして「if文」によって変数「a」の値が「1」だったら?
と記述した例です。
この時に気を付けてほしいのが、
「a = 1」 ではなくて、「a == 1」 となっているところです。
「a == 1」の「==」の事を「比較演算子」と呼びます。
「比較演算子」は、比較演算子を挟んで左の値と右の値がどうなのか?を判断する機能です。
「==」は、左右の値が「等しい」かどうかを判断します。
ちなみに「=」は変数に値を代入する際に使用します。
一般的な比較演算子
- a == b a と b は等しい
- a != b a と b は等しくない
- a < b a は b より小さい
- a > b a は b より大きい
- a <= b a は b 以下
- a >= b a は b 以上
以上が最もよく使う「比較演算子」です。
真の場合とは?
「真の場合」というのは「if文」の条件式が満たされている場合の事を言います。
a = 1
if a == 1:
真の場合の処理
先ほどの「条件式」の場合、
変数「a」の値は「1」なので、この「if文」は「真」となります。
そして、「真の場合の処理」が実行されます。
a = 1
if a == 5:
真の場合の処理
上記の場合は、変数「a」の値は「1」で、
「条件式」は「a == 5」(変数「a」は「5」と等しい場合)となりますので、
条件式にあてはまりません。
この場合は「偽」となり、「真の場合の処理」は実行されません。
プログラム的には、真・偽と日本語を使うわけにはいきませんので、
・真の場合の事を「true」
・偽の場合の事を「false」
と表現します。
真の場合の処理の書き方
条件式を満たした場合(true)の処理内容の記述は、
「if文」を書いた次の行を、インデントで字下げ(Tab1回)をして記述するというルールがPythonにはあります。
a = 1
if a == 1:
print('a is 1')
上記のように記述すると、
変数「a」の値は「1」なので、「if文」の条件式は「真(true)」となりますので、
真の場合の処理が実行されて、print()関数によって「a is 1」と文字列が表示されます。
インデントで字下げする意味
「if文」で条件式を判定して処理を行う場合、
大抵は、その処理内容は複数行記述することとなることが多いです。
その場合、どこまでの行が「if文の真の場合の処理」なのかを明確にしなければいけません。
そこで、Pythonの場合はインデントによる字下げでブロックを定義します。
「ブロック」というのは、「真の場合の処理内容が書かれた複数行のかたまり」と考えてください。
ですので、ブロックのインデントの位置は揃えておかないとエラーとなります。
if 条件式:
処理1行目
処理2行目
処理3行目
処理4行目
処理5行目
以上のように記述していきます。
if 条件式:
処理1行目
処理2行目
処理3行目
処理4行目
処理5行目
以上のように字下げの位置がバラバラだとエラーになります。
条件式が偽(false)の場合の処理
「if文」で条件式が満たされて「真(true)」となった場合に処理が実行される書き方は理解されたかと思います。
もし、条件式が満たされずに「真(true)」にならなかった場合は何もしない!
というのならば「if文」の解説はここで終わりですが、
条件式が満たされず「偽(false)」となった場合も処理を行いたい場合はよくある事です。
そこで、「偽(false)」となった場合の処理方法を解説します。
「elif」による追加判定
「elif」は「if文」の最初の条件式が満たされなかった場合に、
次の条件式を追記するための機能です。
「elif」はインデントで字下げせず「if」の行頭と同じ位置に記述します。
a = 1
if a == 0:
print('a is 0')
elif a == 1:
print('a is 1')
「elif」はいくつでも追記することができます。
if 条件式1:
真の場合の処理1
elif 条件式2:
真の場合の処理2
elif 条件式3:
真の場合の処理3
elif 条件式4:
真の場合の処理4
というように、
1つ目の条件が満たされなければ次の条件。
さらに満たされなければ次の条件。
と記述していくことが可能です。
else
「elif」で条件を複数羅列しても、どの条件も満たさない。
そんな場合の最後の砦として「else」という機能があります。
最後の「elif」の条件式まで判定を進めても条件式が満たされなかった場合に、
「else」によって、どの条件も満たさなかった場合の処理を記述することができます。
また、どの条件式も満たさない場合には何も処理しない。というのであれば、
「else」は必須ではありません。
「else」も「elif」同様に、「if文」と行頭を揃えます。
if 条件式1:
真の場合の処理1
elif 条件式2:
真の場合の処理2
elif 条件式3:
真の場合の処理3
elif 条件式4:
真の場合の処理4
else:
どの条件も満たさなかった場合の処理
どの条件も満たさなかった。ということなので、
「else」には条件式は書きません。
a = 5
if a == 1:
print('a is 1')
elif a == 2:
print('a is 2')
elif a == 3:
print('a is 2')
else:
print('not match')
上記の場合、変数「a」には「5」が代入されています。
「if文」の「a ==1」は「偽(false)」となるので、
次の「elif」へ進みます。
ですが、「a==2」も満たさず「偽(false)」となりますので、
さらに次の「elif」へ進みます。
ですが、「a==3」も満たさず「偽(false)」となりますので、
最後の「else」へ進み、どの条件も満たさなかったために
print ( ‘ not match’ )が実行されます。
論理演算子
前述の「if文」の条件式は、条件が1つのみでした。
(変数「a」が「1」と等しい など)
ですが、複数の条件を満たした場合を「真(true)」としたい場合もよくある事です。
そこで「論理演算子」の登場です。
Pythonで使える「論理演算子」は以下の3つです。
- and A and B とした場合、AもBも「真」の場合「真」
- or A or B とした場合、AもしくはBが「真」の場合「真」
- not not A とした場合、Aが「偽」の場合「真」
a = 1
b = 5
if a == 1 and b == 5:
print('true')
else:
print('false')
上記のようにした場合、
変数「a」には「1」が代入
変数「b」には「5」が代入
「if文」の条件式として、
変数「a」が「1」かつ、変数「b」が「5」
2つの条件が「and」によって繋げられています。
変数「a」も変数「b」も条件を満たしているので、
「if文」の条件は「真(true)」となり、
真の場合の処理が実行されます。
変数「b」の値を「10」へ変更してみました。
「if文」の条件式の「b == 5」を満たさないので「偽(false)」となり、
「else」の処理が実行されます。
※「else」は途中に「elif」による条件分けをする必要はありません。
※今回のように単に「2択」としたい場合は、上記の通り記述できます。
「if文」の「論理演算子」が「and」ではなく「or」の場合は、
「a == 1」が条件を満たしているので「真(true)」となります。
このように論理演算子によって複数条件を指定することが可能です。
また、論理演算子は「and」で3個・5個と条件を追加することも可能ですし、
「and」と「or」を組み合わせたりすることも可能です。
if文の中にif文を書く
「論理演算子」を用いることで複数条件を指定して真偽を判定する方法以外に、
「if文」の中に「if文」を書くことで複数条件を判定するという方法もあります。
a = 1
b = 10
if a == 1:
if b == 10:
print('true')
else:
print('false')
else:
print('false')
上記のように記述しても、論理演算子の「and」で複数条件をつないで真偽を判定した結果と同じになります。
このような簡単な条件分けの場合は、素直に論理演算子を用いたほうがわかりやすく、
上記のように記述するメリットはありませんが、
条件式の内容が複雑だったり、さらにきめ細やかな条件分けが必要な場合は、
「if文」の中に「if文」で条件を細かく判定していく事もよくあります。
この時に気を付けないといけないのは、「インデントによる字下げの位置」です。
「if文」の中に「if文」を書いた場合、2つ目の「if文」の行頭は1つ目の「if文」のインデントで字下げした位置となる事です。
そして、2つ目の「if文」の処理内容は、2つ目の「if文」の行頭位置からインデントで字下げした位置となります。
3つ目・4つ目となると、字下げ位置もどんどん下がっていきます。
if文による条件分けはスクリプトを書く上で必須です。
また次回をおたのしみに!