Python入門|if文の基本をマスターして条件分岐を思い通りに
- 公開日:2018/06/08
- 更新日:2018/10/19
- 投稿者:n bit
今回はPythonのif文について学習します。プログラムの大半は繰り返しと条件分岐で構成されています。if文の基本をマスターして条件分岐を思い通りに行えれば自分の目的とするシステム構築に大きく近づけます。複数条件や段階を追った条件などもわかりやすく解説します。
この記事は約 分で読めます。(文字)
条件分岐とは
条件分岐とは「ある条件の結果によって実行処理を分岐させる」ことをいいます。「Yes、No」チャートなどをイメージすると分かりやすいですね。下記の図であれば「Yes」であれば上側に、「No」であれば下側に進むといったイメージです。
プログラミングでは大半が条件分岐と繰り返し処理で構成されており、この条件分岐が頻繁に登場することとなります。日常生活においても条件分岐は頻繁に行われていますよね。例えば、テストの点数が80点以上であれば「おめでとう」と伝える、テストの点数が80点未満であれば「頑張りましょう」と伝えるといった感じである条件を満たせばその後の行動を変化させて行きます。
事例
日常生活における条件分岐
①:テストの点数を聞く
②:もし、テストの点数が
- 80点以上なら:「おめでとう」と伝える
- 80点未満なら:「頑張りましょう」と伝える
プログラミングにおいても考え方は基本的には同じで、行動を変化させるのが人間ではなくプログラムになりますので、「聞く」が「取得」に、「伝える」が「表示」に変わる位です。
事例
プログラミングにおける条件分岐
①:テストの点数を取得
②:もし、テストの点数が
- 80点以上なら:「おめでとう」と表示
- 80点未満なら:「頑張りましょう」と表示
後はこの考え方を実際にPythonのコードで記述することで条件分岐処理のプログラムが完成します。
if文の記述方法
実際に先程の考え方をPythonのコードで記述していく方法を解説します。Pythonで条件分岐のコードを記述するには【if文 】を利用します。「if」は英語で「もし〜なら」ですね。そして、【if文 】には【真偽値(bool型) 】が必要となります。
if文と真偽値(bool型)の関係
if文は真偽値(bool型)と密接な関係にあります。それは、if文が条件式の条件判定結果によって得られる真偽値(bool型)を使って実行処理を変更しているからです。
前回まで3回に分けて比較演算子、論理演算子、in演算子を使った条件判定を行ってきました。各条件判定の出力結果には真偽値(bool型)が出力されていましたね。この『真:True』か『偽:False』を利用してif分は条件分岐を行っているのです。
「もし『真:True』なら」実行する、もしくは、「もし『偽:False』なら」実行しないと言う様に処理が変化します。
つまり、【if文 】は「if(もし〜なら)+ 真偽値(bool型)が得られる条件式」で基本的な構成が行われていると言えます。
if文の基本構成
- if(もし〜なら) + 真偽値(bool型)が得られる条件式
ここからは条件式を必要とします。条件式について復習したい方はこちらのページを再度ご確認下さい。
Python入門|比較演算子で条件の真偽をチェックする【bool型】
今回はPythonの比較演算子について学習します。比較演算子を利用することで条件の適合、不適合を判断できます。演算子を使った条件の真偽値は主に条件分岐に利用しますのでここでしっかり身につけておきましょう。
Python入門|論理演算子(or,and,not)で複雑な条件判定方法【bool型】
今回はPythonの論理演算子(or、and、not)を使った条件式の判定方法について学習します。比較演算子と論理演算子の組み合わせを利用して様々な条件を判断し真偽値を取得します。また、論理演算子の優先順位による問題点やその解決方法も学習します。
Python入門|in演算子で文字列やリスト内に含まれているか判定【bool型】
今回はPythonのin演算子を使った条件判定について学習します。in演算子を利用することで文字列やリスト内に条件と合致する値が含まれているかを判定することができます。in演算子を使ったリストの条件判定は真偽値取得を簡単に処理できるので覚えておくと便利。
if文のコードを記述する
先程のテストの点数による条件分岐を実際にコードで記述すると下記のようになります。記述方法は【if 】の後ろに半角スペースを空けて条件式(\(set\_number\:>= 80\))を書き、最後にコロン【: 】を付けます。その後に実行させたい処理を記述します。
set_number = 90
if set_number >= 80:
print('おめでとう')
出力結果
おめでとう
条件式(\(set\_number\:>= 80\))の判定結果は「True」ですのでif内の処理が実行され出力結果には「おめでとう」が表示されています。
インデントとブロック
print関数の前に余白があることが確認できます。
print('おめでとう')
これはPythonコードの記述ルールに由来するものです。そもそもPython言語には「コードの可読性を重要視する」と言う趣旨があります。そのためコードのレイアウトにもしっかりとした規約が用意されています。
コードレイアウトの規約の中にはif文の条件判定後に行われる実行処理を記述する部分はインデント(字下げ)を行うと言う決まりがあります。エディタ等にもよりますが通常Pythonに対応したエディタであれば半角スペース4つ分で1インデントとされます。タブキーを押すことで1インデント分の空白が作られます。
インデントされた部分を「ブロック」と呼び、そのブロック内に判定後の実行処理を記述することができます。ブロック内の記述に関しては全て1インデント行う必要があります。
条件式の後にコロン【 : 】をつけ、その後インデントした行は全て同じブロックとして処理されます。インデントされていない行が登場すればその1行手前でブロックが終了となります。
つまり、インデントされていない実行処理に関しては同じifブロック内の処理とは認識されず、if文の条件判定にかかわらず実行されるようになります。例えば下記のコードであれば条件判定が「False」であったとしても、4行目のprint関数はインデントされていないため常に実行されます。
set_number = 90
if set_number >= 80:
print('おめでとう')
print('ここはインデントブロック外の行です')
出力結果
ここはインデントブロック外の行です
このインデントを行う規約はif文に限らず1行の記述の最後にコロン【 : 】がつくタイプものに関しては、その後の処理を記述する上で基本的にインデントを行うようになります。こちらに関してはインデントが必要なタイプのものが登場する都度説明していきますのでそのうち慣れてくると思います。
この規約のメリットはコードを記述する人に必ずインデントを強要するため誰がコードを記述しても必ず同じようなレイアウトになりコードの可読性が向上することです。
フローチャート
if文などのプログラミング処理を考えるときには一般的にフローチャートがよく利用されます。フローチャートとは処理ごとに決められた記号を使ってプログラミングの流れを図解するためのもです。
フローチャートが利用されるのは定型化されたフォーマットでプログラミングの処理を考えやすく、また、実際にコードを記述しなくてもそのフローチャートを見ることでどのような実行処理を行うのかを伝えることができるためです。
複数人でコードを記述していくような場合にはフローチャートがあると便利ですが、単独でコードを記述していく場合でも長期間にわたる場合はフローチャートがあることで元々のプログラミング処理の考え方を思い出すことができます。活用の幅は色々とありますね。
ここではこの先の説明に使える範囲で基礎的なフローチャートの解説だけを行います。興味がある人はまた時間がある時に追加で学習してみてください。
フローチャートに使う基本記号
フローチャートでは各処理ごとに記号が用意されています。基本的に覚えておく記号は4つです。
記号 | 記号の意味 | 説明 |
---|---|---|
開始/終了 | 角丸の四角形でプログムの開始や終了を表す記号です。 | |
入力/出力 | 平行四辺形でデータの入出力を表す記号です。 | |
実行処理 | 四角形でプログラムの実行処理を表す記号です。 | |
条件分岐 | 菱形で条件の分岐を表す記号です。 |
これらの記号を矢印で接続しフローチャートを書いていきます。
フローチャートの作成
実際に下記のコードをフローチャート化してみましょう。
set_number = 90
if set_number >= 80:
print('おめでとう')
まずはプログラムの流れを言語化します。
- プログラムの開始
- 変数に値を代入
- 変数の値で判定し条件分岐
- True:「おめでとう」を出力、False:何もしない
- プログラムの終了
このような流れとなっています。フローチャートにすると下記のような図になります。
図にするとプログラムの流れがとても把握しやすくなりますね。この後の説明にもフローチャートを利用していきます。
elseで条件式に該当しない場合の分岐処理
if文を使い条件式の判定に該当する場合はインデントブロック内の処理が実行されました。しかし、このままでは条件式に該当しなかった場合の処理が何も行われないことになります。そのため次は条件式に該当しなかったときの分岐処理を行えるように変更します。
条件式に該当しなかった場合の分岐処理には【else 】を利用していきます。記述方法はインデント無しでelseの後にコロン【: 】つけます。実行処理に関しては1インデントを空けるようにしましょう。
elseを使って、80点未満なら「頑張りましょう」と表示させる部分を追加していきます。
set_number = 70
if set_number >= 80:
print('おめでとう')
else:
print('頑張りましょう')
これで条件式に該当した場合は「おめでとう」、条件式に該当しなかった場合は「頑張りましょう」が出力されます。それでは上記のコードを実行してみましょう。
変数\(set\_number\)が「\(70\)」の場合の出力結果
頑張りましょう
条件式に該当しませんでしたので「頑張りましょう」が出力されていることが確認できます。
変数\(set\_number\)が「\(90\)」の場合の出力結果
おめでとう
フローチャートで確認すると次のようになります。
elifで複数条件での分岐
ifとelseを使うことで2択の条件分岐が完成しました。しかしプログラミングで条件分岐を作成するときには2択以上の条件分岐を作成したい場合もあります。先程の2択の条件分岐を次は複数の条件分岐に変更していきます。
そのような複数の条件分岐を作成したい場合は【 elif 】を利用します。3つ以上の条件分岐を作ることができます。記述方法はインデント無しで【 elif 】を記述し、その後に新しい条件式を記述して同じ行の最後にコロン【: 】をつけます。
新しい条件式に該当した場合の実行処理に関してはインデントをつけるようにしてください。
set_number = 75
if set_number >= 80:
print('おめでとう')
elif set_number >= 70 and set_number < 80:
print('あと少し')
else:
print('頑張りましょう')
これで80点以上であれば「おめでとう」、70点以上80点未満であれば「あと少し」、いずれの条件式にも該当しなかった場合は「頑張りましょう」が出力されます。それでは上記のコードを実行してみましょう。
変数\(set\_number\)が「\(75\)」の場合の出力結果
あと少し
2つ目の条件式\(set\_number\:>=\:70\:and\:set\_number\:<\:80\)に該当しましたので「あと少し」が出力されていることが確認できます。
フローチャートで見ると次のように変更されています。
elifを複数利用する場合の注意点
ifとelseはワンセットで1つずつしか利用することができませんが、elifに関しては複数回利用することができます。elifが複数ある場合の処理は上から順番に条件判定を行い、その条件に該当したところでその実行処理が行われます。そのため複数の条件式に該当する場合でも先に該当した条件式のところで実行処理が行われその後のelifに関しては処理が実行されません。
例えば次の事例はelifの条件式を1つ追加し、75点以上80点未満に該当する場合は「おしい!」と出力する実行処理を追加しました。
set_number = 75
if set_number >= 80:
print('おめでとう')
elif set_number >= 70 and set_number < 80:
print('あと少し')
elif set_number >= 75 and set_number < 80:
print('おしい!')
else:
print('頑張りましょう')
変数\(set\_number\)の値が75であれば4行目の70点以上80点未満の条件よりも6行目の75点以上80点未満の条件式の方がよりマッチしています。しかし70点以上80点未満の条件式の方が先に判定されるため、6行目のインデントブロック内の処理が実行される事はありません。
出力結果
あと少し
出力結果が「あと少し」となっていることが確認できます。
このように判定結果が1部重複する条件判定の式や条件判定の順序を間違えると意図しない結果が返ってきてしまいますのでelifなどを使って複数の条件を用意する場合は注意しておきましょう。
この問題を回避するとしたら下記のような記述方法になるでしょう。出力結果を確認すると意図した結果が返ってきています。
set_number = 75
if set_number >= 80:
print('おめでとう')
elif set_number >= 75 and set_number < 80:
print('おしい!')
elif set_number >= 70 and set_number < 75:
print('あと少し')
else:
print('頑張りましょう')
出力結果
おしい!
修正した内容は、条件判定後の出力結果に重複がないよう条件式を書き換え、条件式の並びを整理し直しました。
ifの入れ子構造
ここまでは全て1階層の条件判定による分岐処理を行ってきました。条件分岐では2階層の条件判定を行いたい場合もあります。例えば、1階層の条件判定が性別、2階層の条件判定が年齢と言った場合です。
まずは達成したいプログラム処理をフローチャートで確認します。
このような2階層以上の条件判定にはif文を入れ子構造にすることで対応できます。コードの記述方法は入れ子にするif文にさらに1インデント追加して記述していきます。
set_sex = '男'
set_age = 38
if set_sex == '男':
if set_age >= 20:
print('性別男性:20歳以上')
else:
print('性別男性:20歳未満')
else:
if set_age >= 20:
print('性別女性:20歳以上')
else:
print('性別女性:20歳未満')
出力結果
性別男性:20歳以上
正しく判定条件と合致する「性別男性:20歳以上」が出力されているのが確認できます。
入れ子構造の時に注意すべきポイントは4行目以降と、9行目以降さらに1インデント追加されていることです。入れ子構造の階層を増やす場合は階層が深くなるにつれてインデントが増えていくようになります。
データ型の仕組みを利用した条件分岐
最後にデータ型の仕組みを利用した条件分岐を解説します。if文は『真:True』か『偽:False』を利用して条件分岐を行っていましたよね。これまでは条件式の出力結果から『真:True』か『偽:False』を取得して分岐させていました。
しかし、条件式を書かなくても直接『真:True』または『偽:False』を返すものがあります。
下記に自動的に『偽:False』と判定されるものを一覧表にしておきます。
データ型 | 値 | 説明 |
---|---|---|
int | 0 | 整数の0 |
float | 0.0 | 浮動小数点数の0 |
str | '' | 空文字列 |
tuple | () | 空タプル |
list | [] | 空リスト |
dict | {} | 空辞書 |
set | set() | 空セット |
bool | False | 偽 |
None | None | なし |
一覧表を見てわかるとおり空のデータ型、そして「False」と「None」です。空のデータ型は『偽:False』を返します。逆に変数に値がセットされている場合は『真:True』を返します。
データ型が空の場合
x = ''
if x:
print('値がセットされています')
else:
print('値がセットされていません')
出力結果
値がセットされていません
変数に値がセットされている場合
x = 'Python'
if x:
print('値がセットされています')
else:
print('値がセットされていません')
出力結果
値がセットされています
こちらの条件分岐は変数に値がセットされているかどうかを確認するのによく利用しますので覚えておくと良いでしょう。
Falseは直接bool型を渡していることになりますので直感的に理解しやすいと思います。
「False」の場合
if False:
print('Trueがセットされています')
else:
print('Falseがセットされています')
出力結果
Falseがセットされています
「True」の場合
if True:
print('Trueがセットされています')
else:
print('Falseがセットされています')
出力結果
Trueがセットされています
このようにif文ではデータ型から直接判定して分岐させることも出来ます。
今日のdot
if文が入ってきたことで本格的にプログラミングらしくなってきましたね。プログラミング処理の大部分は条件分岐と繰り返しで成り立っています。if文をしっかりと使いこなすことができればプログラミングのレベルがグッと向上します。少し長いですが何度も繰り返し復習しておくことをおすすめします。
今回の学習内容を踏まえ、最後によく利用するif文のパターンを記述しておきます。まずはこれらのパターンを覚えておくだけでもif文が使いやすくなります。
数値と数値演算子・比較演算子・論理演算子を使った条件分岐
数値の計算結果が求めている値に該当しているかどうかを判断して条件を分岐させるような時に利用します。
偶数か奇数かで処理を分岐させる場合
偶数かどうかの判断は剰余が0(偶数)か1(奇数)で判断することができます。そのため剰余を求める数値演算子「%」と比較演算子「\(==\)」を利用してif文の条件式を作成します。
set_number = 20
if set_number % 2 == 0:
print('この数字は偶数です')
else:
print('この数字は奇数です')
これで条件式に該当した場合は「この数字は偶数です」、条件式に該当しなかった場合は「この数字は奇数です」が出力されます。それでは上記のコードを実行してみましょう。
変数\(set\_number\)が「\(20\)」の場合の出力結果
この数字は偶数です
変数\(set\_number\)の値が「\(20\)」であれば偶数で条件式に該当しますので「この数字は偶数です」が出力されます。
変数\(set\_number\)が「\(19\)」の場合の出力結果
この数字は奇数です
数値がある範囲に入っているかどうかで処理を分岐させる場合
ある数値の範囲に入っているかどうかを判定するには比較演算子を2つと論理演算子「and」を利用することで条件式を作ることができますね。範囲となる値と比較演算子・論理演算子を使ってif文の条件式を作成していきます。
set_number = 75
if set_number >= 80 and set_number <= 100:
print('おめでとう')
elif set_number >= 75 and set_number < 80:
print('おしい!')
elif set_number >= 70 and set_number < 75:
print('あと少し')
else:
print('頑張りましょう')
該当する条件式によって出力される値が変化します。それでは上記のコードを実行してみましょう。
変数\(set\_number\)が「\(75\)」の場合の出力結果
おしい!
変数\(set\_number\)の値が「\(75\)」であれば「set_number >= 75 and set_number < 80」の条件式に該当しますので「おしい!」が出力されます。
変数\(set\_number\)が「\(100\)」の場合の出力結果
おめでとう
文字列と比較演算子・in演算子を使った条件分岐
文字列を対象とした条件分岐では、対象文字列に完全一致する場合と、対象文字列を含む場合の2パターンの条件分岐がよく利用されます。
対象文字列と一致した時分岐させる場合
対象文字列と一致するかどうかは比較演算子「\(==\)」を利用することで判定可能です。対象となる文字列と比較演算子を使ってif文の条件式を作成していきます。
set_like = 'Python'
if set_like == 'Python':
print('Pythonが好きです')
else:
print(set_like + 'が好きです')
条件式に一致した場合は「Pythonが好きです」、一致しなかった場合は「変数\(set\_like\)に入力した文字列 \(+\) が好きです」が出力されます。それでは上記のコードを実行してみましょう。
変数\(set\_like\)が「\(Python\)」の場合の出力結果
Pythonが好きです
変数\(set\_like\)の文字列が「\(Python\)」であれば条件式に該当しますので「Pythonが好きです」が出力されます。
変数\(set\_like\)が「\(javascript\)」の場合の出力結果
javascriptが好きです
対象文字列を含む時分岐させる場合
対象文字列を含んでいるかどうかを判定する場合はin演算子を使うことができます。対象となる文字列とin演算子を使ってif文の条件式を作成していきます。
set_like = 'Pythonとjavascript'
if 'Python' in set_like:
print('Pythonも好きです')
else:
print(set_like + 'が好きです')
それでは上記のコードを実行してみましょう。
変数\(set\_like\)が「\(Pythonとjavascript\)」の場合の出力結果
Pythonも好きです
変数\(set\_like\)の値が「\(Pythonとjavascript\)」であれば条件式に該当しますので「Pythonも好きです」が出力されます。
変数\(set\_like\)が「\(javascriptとRudy\)」の場合の出力結果
javascriptとRudyが好きです
リストとin演算子を使った条件分岐
set_like = ['Python', 'javascript', 'Rudy']
if 'Python' in set_like:
print('Pythonも好きです')
else:
print('Pythonは好きではありません')
基本的な考え方は今までと同じですが、リストでin演算子を使う場合はその書き順に注意してください。必ず固定値がin演算子の左辺、変数(リスト)がin演算子の右辺となります。
if 'Python' in set_like:
変数が文字列の場合はどちらでも動作してしまうのですが、リストの場合は必ずこの順番でないとエラーが起こります。in演算子を利用する場合は「固定値がin演算子の左辺、変数がin演算子の右辺」となるように記述する癖をつけておきましょう。
それでは上記のコードを実行してみましょう。
変数\(set\_like\)が「['Python', 'javascript', 'Rudy']」の場合の出力結果
Pythonも好きです
変数\(set\_like\)の値が「['Python', 'javascript', 'Rudy']」であればリスト内に「Python」も含まれていて条件式に該当しますので「Pythonも好きです」が出力されます。
変数\(set\_like\)が「['javascript', 'Rudy', 'C']」の場合の出力結果
Pythonは好きではありません
【フリーランス向けの完全無料Pythonプログラミング講座】
dot blogではこの記事以外にも完全無料でフリーランス向けのPythonプログラミング講座を公開中です。フリーランスとして活躍し稼ぐための強力な武器となりますよ。
Python入門講座【無料のプログラミング学習講座】
最近特に注目度が高くなってきているプログラミング言語Python。転職、フリーランス、独立・起業を検討中、日々の業務が忙しい社会人等は今こそ身に付けておきたいスキルの1つ。初心者向けにやさしいプログラミング学習内容のPython入門講座を無料で公開。