Pythonをこれから始めようとする人、又は始めたばかりの人に向けて、if 文の使い方を解説します。
前半はエッセンスだけまとめていますので、忘れた部分を思い出すためにお使いいただけます。
後半はif 文について詳しく解説していますので、if 文について曖昧な方は、是非最後までお読みください。
if 文については他のサイトでも解説されていますが、具体的な応用事例はあまり紹介されていないようなので、この記事では、その辺についても触れています。
if文の基本形
if文は条件式が成り立つ(True)か成り立たないか(False)によって、処理の分岐を分けるために利用します。
Pythonの if文は以下のような構造になります。
elif はいくつも連ねて書く事が可能で、この場合は if 又は elif で指定された条件式の結果が、最初にTrueになった時の処理のみが実行されます。
if 文は if 単体か if ~ else の組み合わせで利用することが多く、 elif の使用頻度はそれほど多くありません。
それは、条件式を何段も使うようなケースが限られていることと、別の書き方でも同じ処理が出来るからです。
条件式で使える演算子
Python では、条件式で次の比較演算子が利用可能です。
比較演算子 | 意味 |
---|---|
a == b | a と b は等しい |
a != b | a と b は異なる |
a < b | a は b より小さい(a は b 未満である) |
a > b | a は b より大きい |
a <= b | a は b 以下 |
a >= b | a が b 以上である |
a is b | a が b と等しい(a は b である) |
a is not b | a とb は異なる(a は b ではない) |
a in b | a が b に含まれている |
a not in b | a が b に含まれていない |
複数の条件式を組み合わせたい場合は、次の論理演算子を用います
論理演算子 | 意味 |
---|---|
c1 and c2 | c1 と c2の両方が成り立つ |
c1 or c2 | c1 と c2 のどちらか、又は両方が成り立つ |
not c1 | c1 を否定 (c1 がTrueの場合はFalseを、Falseの場合はTrueを返す) |
if 文のサンプルコード
それでは、キーボードから入力値された値が、閾値より大きいか否かを if 文で判定し、それに応じたメッセージを表示するサンプルプログラムを例に、if 文の具体的なソースコードを解説してきます。
サンプルプログラムの基本的な処理手順は次の通りです。
if 文単独
if 文だけで用いる場合は、何らかの初期値に対して条件文で変更を加えるようなケースです。
サンプルでは、「入力された値は50より大きい」という初期値が msg に登録されており、閾値(50)を超える場合は msgの内容を「入力された値は50以下である」に変更するような使い方をしています。
#キーボードから入力された文字列を、int関数を使って数値に変換 val = int(input("2桁の数値を入力して下さい> ")) #メッセージの初期値を設定 msg ='入力された値は50より大きい' #入力された値が50より大きいか否かをif文で判定 if val <= 50 : msg = '入力された値は50以下である' #メッセージの表示 print(msg)
if ~ else 文
if ~ else を使って、閾値(50)以下とそうでない場合のメッセージを分ける例です。
おそらく、このパターンが一番多く使われていると思います。
#キーボードから入力された文字列を、int関数を使って数値に変換 val = int(input("2桁の数値を入力して下さい> ")) #入力された値が50より大きいか否かをif文で判定 if val <= 50 : print('入力された値は50以下である') else: print('入力された値は50より大きい')
if ~ else 文(複数の条件式)
次は、単一の閾値ではなく、範囲を示す2つの閾値(20と50) を使って、入力された値が、20~50 の範囲内に収まっているか否かによってメッセージを分る例です。
20以上であるか否かは val >= 20 、50以下であるか否かは val <= 50 と記述できます。
従って、20以上~50以下の範囲指定は and を使って val >= 20 and val <= 50 と記述出来ます。
サンプルでは 20 <= val and val <= 50 と記述していますが、この書き方の方が直感的に分かりやすいからで、実際はどちらでも構いません。
#キーボードから入力された文字列を、int関数を使って数値に変換 val = int(input("2桁の数値を入力して下さい> ")) #入力された値が20以上~50以下か否かをif文で判定 if 20 <= val and val <= 50 : print('入力された値は20~50の間です。') else: print('入力された値は20未満か50より大きい値です')
if ~ elif ~ else 文
では先ほどのプログラムを elif を使って書きてみます。
elif は上から順番に条件判断が行われ、判断結果が True になった段階で if 文は終了します。
今回は、上から順番に除外したい条件を記述し、最後まですり抜けた場合に入力された値が範囲内を示すメッセージ「入力された値は20~50の間です」を表示するようにしています。
#キーボードから入力された文字列を、int関数を使って数値に変換 val = int(input("2桁の数値を入力して下さい> ")) # if~elif~else を使った記述例 if val < 20: print('入力された値は20未満です') elif val > 50: print('入力された値は50より大きい値です') else: print('入力された値は20~50の間です。')
if 文のネスト(入れ子)
if 文の中に if文を入れる、いわゆるネスト(入れ子)することも可能です。
入れ子はいくつでも深くすることは可能ですが、あまり深くしすぎるとプログラムが読みにくくなるので、ほどほどにしましょう。
先ほどの if~elif~else を使った分岐のプログラムを if文をネスト(入れ子)にして書き直すと、以下の様になります。
#キーボードから入力された文字列を、int関数を使って数値に変換 val = int(input("2桁の数値を入力して下さい> ")) # if文をネスト(入れ子)にした記述例 if val >= 20: if val <= 50: print('入力された値は20~50の間です。') else: print('入力された値は50より大きい値です') else: print('入力された値は20未満です')
どんな時にどの if 文を使うのか
以上の通り、同じ条件判断をさせる場合でも、条件文を複数使う方法、if~elif を使う方法、if文のネストを使う方法などバリエーションがあることが分かるかと思います。
では、どんな時にどんな書き方をすればよいのでしょう?
答えは・・・ありません。
強いて言うなら、プログラミングする人が「この書き方の方が第三者に分かりやすいと思う」書き方で記述すれば良いかと思います。
ただ、分かりやすさの目安として
- 複雑な条件式(and や or を多用するような場合)は書かない
- elif で使う条件式は、極力単純(a==b 、a > b など)なものにする
- ネストは深くしない(2~3階層程度にとどめる)
は心がけておくべきかと思います。
あくまで参考ですが、条件文に応じて値を返す関数を作る場合、elif の代わりに下記の様に単独のif文とreturn を組み合わせた書き方をする場合もあります。
#範囲内に収まっているかを判定する関数 def judge(val): if val < 20: return '入力された値は20未満です' if val > 50: return '入力された値は50より大きい値です' return '入力された値は20~50の間です。' #キーボードから入力された文字列を、int関数を使って数値に変換 val = int(input("2桁の数値を入力して下さい> ")) #判定及び結果の表示 print(judge(val))
自分が分かりやすいコードと他人が分かりやすいコードは違いますが、少なくとも分かりやすいコードを書こうと意識しないと、いつまでも良いコードは書けませんので、是非分かりやすいコードを心がけてください。
if文による空の判定
プログラムの中で使っている変数の中身が空かどうかを、 if 文でチェックしたくなることがよくあります。
例えば、a という変数と b という変数を掛け算する場合、a が空だと計算時にエラーとなってしまうからです。
Pythonには int や float 、リストやタプルなど複数のデータ型が用意されていますが、それぞれ空の判定方法が異なりますので、ここで整理しておきたいと思います。
変数の方 | 条件式 |
---|---|
int,float,str,classなど | a is None a == None |
リスト | a == [] |
リスト、セット | a == {} |
タプル | a == () |
Python は値を入れた段階で、その変数の型が決まります。
1つの変数に対して、プログラムの中で異なる型のデータを複数回代入するような場合は、どの型で判定すべきか注意が必要です。
a = None b = [] c = {} d = () #inf,float,str,class など if a is None: print('a is None') #inf,float,str,class など if a == None: print('a は None') #リスト if b == []: print('b は []') #辞書、セット if c == {}: print('c は {}') #タプル if d == (): print('d は ()')
もし変数に代入されている値の型が分からない場合は、想定される型の空判定をor を使って羅列します。
#変数 a の値が None と [] のどちらでも正しく判定する書き方 if a is None or a == []: print('a is None')
3項演算子
if 文はどうしても2行以上にまたがってしまいますが、以下のような書き方をすることで1行にすることが可能です。
res = 999 if val > 100 else 0
この様に1行の中に if ~ else を記述したものを3項演算子と呼んでおり、条件判断による分岐処理を1行で記述できます。
3項演算子は基本的に条件分岐に応じて値を返すだけなので、通常は結果を変数に代入するような記述になります。
あくまでも条件式が成り立つか(True)成り立たないか(False)の2択でしかありません。
ただ、3項演算子をネストすることで、elif のような記述は可能です。
# val が100を超えると999、100以下の場合、50を超えると 111、50以下だと0を返す res = 999 if val > 100 else 111 if val > 50 else 0
if 文のTips
何らかの入力値から別の値に変換する場合(いわゆるコード変換)は次の様に書く事が出来ます。
#if~elif をコード変換に使う if code == 1: item = '関東' elif code == 2: item = '関西' elif code == 3: item = '四国' elif code == 4: item = '九州' else: item = '該当なし'
タプルやリストなど配列上のデータに対して、その中に値が含まれているかは in を使って次のように記述出来ます。
values = ['a','b','c','d'] val = 'a' if val in values: print('hit')
まとめ
今回はPython の勉強をこれから始めようとしている人、または始めている人向けに、if文の基本と使い方について解説しました。
if 文と言っても色々な書き方があり、プログラムの内容やプログラミング者の好みにもよるところが多く、「この場合はこの記述」と言った方程式はありません。
しかし、分かりやすいように書くことを心がけることは大切です。
特にif 文は書き手によって読み易さが大きく変わりますので、あまり複雑な条件式にならないよう、ネストは深くならないよう、注意しながらプログラミングして頂ければと思います。
今回の記事が皆様のお役に立てれば幸いです。