こんにちは。倉内です。
プログラミングを初めて学ぶ方が、「プログラミングがちょっと分かり始めた!」と実感するのは、if文やfor文を書けるようになったときではないでしょうか。
ただ四則演算の段階では、「意外と簡単かも?」と思っていたのが、if文で条件分岐を書こうとしたときに少し難しさを感じる場合もあります。
また、分かったつもりになっていても複数の条件で場合分けする処理を書いたり、四則演算と組み合わせた条件を書く必要があったりすると途端に詰まってしまうことも…。
そこで今回は、paizaラーニングで無料公開している動画講座「Python3入門編」と練習問題集を利用して、プログラミングを初めて間もない方に、if文を基本中の基本から解説したいと思います!
前置き:利用教材について
paizaラーニングは、Webブラウザとインターネット環境があればどなたでもご利用いただけます。
動画はプロの声優さんによる解説つきで、学習した内容をすぐ演習課題で復習できるのが特徴です。
練習問題として利用するのは、さまざまな難易度・内容のプログラミング問題を集めた「レベルアップ問題集」です。
問題を解いたあとコードをテストするための全入力ケースが閲覧でき、一部問題は解答コード・解説もついています*1。
これからサンプルコードをたくさん載せますので、よければオンライン実行環境のpaiza.IOで自分で試しながら進めてみてください。
また、Pythonに初めて触れるという方は、Pythonによるコードの基本的な書き方、変数と演算子を使った計算の仕方を学習してからのほうが条件分岐処理を理解しやすいと思うので、先に以下の講座の受講がおすすめです。
条件分岐とは:ifの基本形
if...else文
if文を使って書く処理のことを一般的に「条件分岐処理」と呼びます。
もっとも単純な条件分岐は以下のような文章です。
もし○○だったら、△△する
たとえば「もしN=1だったら、“OK”と出力する」といった感じですね。
Pythonで書くと以下のようなコードになります。これがif文のもっとも基本的な書き方です。
N = 1if N == 1: print("OK")
これは「条件式が成立したとき」の処理ですが、「条件式が成立しなかったとき」つまり、○○でなかったときの処理も指定したい場合についても考えてみます。
もし○○だったら、△△する
そうでなければ□□する
さきほどの例を使って「もしNが1だったら、“OK”と出力する。そうでなければ“NG”と出力する」と処理するコードを書いてみます。
N = 2if N == 1: print("OK") else: print("NG")
上記のコードはN=2としてみたので、出力結果は“NG”となります。
Pythonは条件分岐を書くときにインデントも大切なので、気をつけてくださいね。
ここまでの内容は以下の動画講座で学ぶことができます。演習問題もありますので、身に付けられたかどうかのチェックも可能です。
if...elif...else文
条件は何個でも書けますが、ifとelseだけでは他の条件が書けません。
ここでelse ifの登場です。このelse ifは言語によって書き方がちょっとずつ違いますが、Pythonでの表記はelifです。
もし○○だったら、△△する
もし●●だったら、▲▲する
そうでなければ□□する
さらにさきほどの内容を変えて「もしNが1だったら、“OK”と出力する。もしNが2だったら、“NG”と出力する。そうでなければ“Error”と出力する」と処理するコードに修正してみましょう。
N = 3if N == 1: print("OK") elif N == 2: print("NG") else: print("Error")
elif文の部分を増やして、Nが3だったら…4だったら…と条件分岐を増やすことができます。
ここまでの内容は以下の動画講座で学べますので、複数の条件の組み合わせが理解できたかも確認してみてください。
比較演算子を使った条件分岐
比較演算子とはプログラミング言語の演算子を指し、2つの対象の関係を調べるために用いられます。たとえば、同値関係を調べる等号(=)や、順序関係を調べる不等号(>)などです。
関係式が成り立つ場合は真(True)を返し、成り立たない場合は偽(False)を返します。
比較演算子の種類
実際の利用シーンとして分かりやすいのは、テストの採点の合否判定です。以下のような判定をしてみましょう。
もし60点未満だったら、“不合格”と表示する。
もし60点以上だったら、“合格”と表示する。
少し本題からはズレますが、こういった比較演算子を使って関係式を書くときは、意外と「未満」「より大きい」「以下」「以上」をミスすることが多いので注意します。
ここでは score という変数に入れた点数を判定する処理としてコードを書いてみます。
score = 30if score < 60: print("不合格") elif60<= score: print("合格")
この例では、scoreは30にしたので実行すると“不合格”と出力されます。
余談ですが、このように数値を扱うときは、右側が大きい値になるように書くと分かりやすいです。
ここまでの内容は以下の動画講座で学べます。比較演算子はプログラミング問題を解く際はほぼ必ず使いますのでしっかり押さえておきましょう。
論理演算子を使った条件分岐
Pythonでは、論理積(かつ:and)、論理和(または:or)、否定(ではない:not)の3つが用意されており、2つの値や条件の関係性を示すことができます。
論理積(かつ:and)
「x and y」は、x も y も True であれば True を返します。
たとえば、「もしxもyも100より小さかったら、“OK”と出力する。そうでなければ“NG”と出力する」という処理を書いてみると…
x = 10 y = 11 if x < 100 and y < 100: print("OK") else: print("NG")
上記の例では、xもyも100より小さいため“OK”と出力されます。
もし x = 1000 とすると、Falseなので出力は“NG”となります。xとyがともに条件を満たしたときのみ真(True)の値が返ってきて、“OK”となります。
論理和(または:or)
「x or y」は、x と y のいずれかが True であれば True を返します。
たとえば、「もしxかyのどちらかが100より小さかったら、“OK”と出力する。そうでなければ“NG”と出力する」という処理を書いてみます。
x = 10 y = 1000 if x < 100 or y < 100: print("OK") else: print("NG")
上記の例では、xが100より小さいため“OK”と出力されます。どちらかだけ条件を満たせば“OK”なので、“NG”と出力されるケースはxもyも100以上のときだけです。
否定(ではない:not)
「not x」は、x が True であれば False を返し、x が False であれば True を返します。
混乱しやすいので、先にコードとその実行結果を見ることにします。
x = 10 if not x < 100: print("OK") else: print("NG")
この場合、xは10で、100より小さい値です。xが100より小さい(True)の否定(not)なのでFalseを返し、実行結果は“NG”となります。
では、以下のコードの場合はどうでしょうか。
x = 1000 if not x < 100: print("OK") else: print("NG")
この場合、xは1000で、100より大きい値です。xが100より大きい(False)の否定(not)なのでTrueを返し、実行結果は“OK”となります。
ちなみにですが、Pythonでコードを書くよりもう少し手前の知識として、論理演算そのものについて学んでおくと、コンピュータの仕組みやこれからもっと深くプログラミングを学ぶ上で役に立つと思います。
(参考)論理演算 - Wikipedia
ここまで学んだことの理解を深めるため、paizaラーニングの以下のレッスンでは「おみくじ」「RPGの戦闘シーン」などを実装します。
補足:複数の比較演算子を並べて使う
比較演算子の説明で「2つの対象の関係を調べる」とお伝えしたのですが、実はPythonでは3つ以上の値を並べて書くことができます。
数学では見覚えがあるかもしれませんが、たとえば「a < x < b」という書き方です。これはさきほど学んだ論理演算子を使った「a < x and x < b」と書くことと同じ意味です。
以下のような判定処理をコードを書いてみましょう。
もし40点未満だったら、“不可”と出力する。
もし40点以上60点未満だったら、“可”と出力する。
もし60点以上80点未満だったら、“良”と出力する。
もし80点以上だったら、“優”と出力する。
1つ目と2つ目のelifが該当します。
score = 75if score < 40: print("不可") elif40<= score < 60: print("可") elif60<= score < 80: print("良") elif80<= score: print("優")
たとえば「40 <= score < 60」は「40 <= score and score < 60」と書くこともできます。
ちなみに前の文章に忠実に書きましたが、最後の「elif 80 <= score」は「else」にしても問題ありません。
この書き方を応用すると、もっと複雑な式にすることもできますが、可読性が悪くなるので使いすぎには気をつけましょう。
if文を使って問題を解いてみよう
レベルアップ問題集の中でも比較的取り組みやすい問題を集めてある「Dランク早解きセット」を使うことにします。
【1】1日1万歩
問題:
あなたは健康のために、1日1万歩を歩くことを目標にしました。
入力として、歩いた距離(km)と歩幅(cm)が与えられるので、
1万歩を歩いているかどうかを判定して結果を出力してください。
入力される値:
入力は以下のフォーマットで与えられます。
d s・d は歩いた距離(km)
・s は歩幅(cm)
期待する出力:
歩数が
・1万歩以上であれば yes
・1万歩より少なければ no
を出力してください。ただし、歩いているときの歩幅は一定であるとします。
条件:
すべてのテストケースにおいて、以下の条件をみたします。
0 ≤ d ≤ 20
30 ≤ s ≤ 100
期待する出力を見ると、「もし1万歩以上であればyesを出力、もし1万歩より少なければnoを出力」と言い換えられるので、まさにif文を使えそうな問題であることが分かります。
その前に、与えられた値(この問題ではd、s)を受け取る処理を理解しておきましょう。
標準入力
Pythonでは input() 関数を使って与えられた値を受け取ります。今回は数値なので map() 関数を使って数値(int)に変換して受け取ることにします。
d,s = map(int, input().split()) print(d) print(s)
実行してみると以下の通り出力され、入力例1の「10 100」が受け取れたことが分かります。
10
100
上記の書き方でも問題はないのですが、せっかくPythonを使っているので内包表記での受け取り方もお伝えしておきます。
d,s = (int(x) for x ininput().split()) print(d) print(s)
実行結果はさきほどと同じです。
Pythonの標準入力は、動画講座「#05:データの読み込み(標準入力)」でも説明していますのでぜひ参考にしてみてください。
解答コードの例
今回気をつけたいのは歩いた距離dの単位はkmなので、歩幅sの単位cmに合わせて計算するところですね。
歩数は歩いた距離割る歩幅で出せます。
# 歩いた距離dと歩幅sを標準入力で取得 d,s = (int(x) for x ininput().split()) # dの単位はkmなのでcmに変換し、歩幅sで割ることで歩数nを算出 n = d * 1000 * 100 / s # 歩数nが1万歩以上か、より小さいかを判定if(10000<= n): print("yes") elif(n < 10000): print("no")
このコードを提出してみると…
すべてのテストケースが通りました!(このコード以外の書き方もありますのであくまで一例となります。)
【2】気温の変化
問題:
昨日と比べて、今日の気温が高いのか低いのかを教えてくれるプログラムを作成したいと思いました。
昨日の気温と今日の気温が入力として与えられるので、
気温がどれだけ変化したかを計算して出力してください。
入力される値:
入力は以下のフォーマットで与えられます。
t1 t2
・t1は昨日の気温
・t2は今日の気温
・t1, t2は0以上の整数
期待する出力:
・昨日より今日の方が暖かければ、+(気温差)
・昨日と今日が同じ気温なら、0
・昨日より今日の方が寒ければ、-(気温差)
を出力してください。
条件:
すべてのテストケースにおいて、以下の条件をみたします。
0 ≤ t1, t2 ≤ 35
標準入力
今回もスペース区切りで2つの値が与えられているので、さきほどと同じような処理で取得できます。
内包表記のコードは以下の通りです。
t1, t2 = (int(x) for x ininput().split()) print(t1) print(t2)
実行してみると以下の通り出力され、入力例1の「21 27」が受け取れたことが分かります。
21
27
解答コードの例
今回は条件が3つになったのでelifを使いました。
ポイントは今日のほうが気温が高い場合、前に「+」の記号を表示する必要がある部分ですね。「+」は文字列なので、気温差を引き算した結果(数値)を str() を使って文字列に変換しています。
# 昨日の気温t1と今日の気温t2を標準入力で取得 t1, t2 = (int(x) for x ininput().split()) # t1とt2の差を判定if(t1 < t2): print("+" + str(t2 - t1)) elif(t1 == t2): print("0") elif(t1 > t2): print(str(t2 - t1))
もし str() を使って文字列に変換しないで以下のように記述して実行すると、エラーになります。
… # t1とt2の差を判定if(t1 < t2): print("+" + (t2 - t1)) …
エラーメッセージ:
Traceback (most recent call last):
File "Main.py", line 10, in
print("+" + (t2 - t1))
TypeError: can only concatenate str (not "int") to str
また、条件の2つ目、3つ目は文字列変換しなくてもよいのですが、1つ目と合わせるためこのように書きました。よって、以下のコードでも正解になります。
… if(t1 < t2): print("+" + str(t2 - t1)) elif(t1 == t2): print(0) elif(t1 > t2): print(t2 - t1)
なお、レベルアップ問題集では条件範囲外の値が与えられることはないため考慮していませんが、実際は範囲外の値が来たときの処理(たとえば、エラーメッセージを出すなど)を実装する必要があることもあります。
ここでは2問を取り上げて解いてみましたが、他にも問題は多数用意しているのでぜひたくさん解いてif文をマスターしてください!
まとめ
if文を使った条件分岐処理について、基本から解説してきました。
動画で学んで、演習課題を解いて、さらに練習問題で定着させるという流れを実行すると確実に力がつきます。
学習した内容は実際にプログラミング問題を解いてみないと自分で書けるようになったか分からないので、「問題を解く」「分からなかったら講座に戻る」を繰り返してみましょう。
なお、レベルアップ問題集で出てきた「Dランク」というのは、プログラミング問題を時間制限ありで解答して、プログラミングスキルを測る「スキルチェック」でのランク表記です。力がついてきたなと思った方はぜひチャレンジしてみてください。詳細はこちら
「paizaラーニング」では、未経験者でもブラウザさえあれば、今すぐプログラミングの基礎が動画で学べるレッスンを多数公開しております。
詳しくはこちら
また、paizaが運営する「EN:TRY」では、若手・未経験者の方を対象とした、開発経験がない人・少ない人でも応募できる若手チャレンジ求人を中心に掲載しています。スキルチェック問題を解いて、スコアが一定基準を超えれば、事前の書類選考なしで複数求人へ応募できます。
詳しくはこちら
*1:無料会員の場合、閲覧にはpaizaへログインすると獲得できるチケット(最大6枚蓄積可能)の消費が必要です。