PR

pythonの条件文: if-else、if-elif-else、while-loop、for-loop

python
記事内に広告が含まれています。

まず、以下のプログラムを実行してみましょう。

print("最初に実行")
print("2番目に実行")
print("3番目に実行")

出力:

最初に実行
2番目に実行
3番目に実行

上のコードのようにPythonを含むプログラミング言語では、プログラムは基本的に上から下に順々に実行されます。これを「順次処理」と呼びます。

条件分岐

特定の条件によって異なる動作をさせたいときや、同じ動作を何度も繰り返したいときには、順序処理とは少し異なるコードの書き方が必要になることがある。この一つとして「条件分岐 」があります。

条件分岐を使うと、プログラムの実行の順序を判断をさせることができます。例えば、ある条件が真であればある経路を、偽であれば別の経路を取るようにプログラムに指示することができます。

if文

テストのスコアが70点以上の場合に「合格」と表示するプログラムを考えてみましょう。

このようなプログラムでは、スコアが70点以上か70点未満かで処理が変わります。

  • スコアが70歳以上の場合、「合格」と表示される。
  • スコアが70歳未満の場合は、「合格」の部分はスキップされ、次の処理である 「終了」が表示される。

条件によって分岐する処理を記述する場合は、「if文」を使う。

score = int(input("テストスコアを入力:"))

if score >= 70:
    print("合格")

print("終了")

input()は、処理を一時停止し、表示されたテキストボックスへのデータ入力を求める関数です。データ入力後、処理が再開されます。

※注意input()で受け取ったデータはすべて 「文字列 」型なので、int()で数値に変換する必要があります。

スコア = 90の場合:

テストスコアを入力:90
合格
終了

スコア = 50の場合:

テストスコアを入力:50
終了

このコードの中で、「score >= 70: 」という行が、Pythonでいうところの分岐処理を実行する行です。

これは「if文 」と呼ばれ、プログラムが条件に基づいて選択をさせます。ifは「もしも 」を意味し、その後に続くものがチェックする条件です。

つまり、「if 」の答えが「イエス」(「if」の後の文が真であることを意味する)なら、その下のインデントされたコード・ブロックが実行される。コロン(:)は、条件の終わりを示しています。

このコードでは、条件は 「score >= 70」です。もし答えがイエスなら、プログラムは 「合格」と表示します。そうでなければ、そのメッセージを表示することなく、コードの次の部分(つまり「終了」)に進みます。

if文のインデント

前のコードを次のように修正してみます。

score = int(input("テストスコアを入力:"))

if score >= 70:
    print("合格")
    print("よくできました")

print("終了")

スコアが90の場合 :

テストスコアを入力:90
合格
よくできました
終了

今回、スコアが70歳以上の場合、2つの文章が表示されています。

「合格」

「よくできました」

if文の下の2行はインデントされていることに注目して下さい。

Pythonでは、インデントには半角スペースを4つ使うことが推奨されています。このインデントは行をグループ化するようなものです。そのため、条件が満たされたとき、プログラムはインデントされた行をグループとして実行します。

このインデントはコードの可読性を高め、制御構造の範囲を示します。

具体的には、「if score >= 70: 」のような行の下の命令をインデントすると、インデントされた命令は条件付きで実行される命令、つまり 「score >= 70」という条件が真である場合にのみ実行されます。

つまり、Pythonがどのコードが条件分岐に属するかを理解するためには、適切なインデントが重要なのです。

複数の条件式が組み込まれると、その適用範囲を示すインデントの使い方に戸惑うこともあるかと思いますが、徐々に慣れていきますので安心して下さい。

論理演算子を使った条件式

「and」や「or」などの論理演算子も条件式で使うことができます。

height = int(input("身長を㎝で入力:"))

if (height >= 170) and (heith <= 180):
    print("この服はぴったりサイズです。")
    print("終了")

身長が175㎝の場合 :

この服はぴったりサイズです。
終了

身長が165㎝の場合 :

身長を㎝で入力:165
終了

ネスト:if文の中のif文

複数の条件を指定するもう一つの方法は、「ネスト」と呼ばれるテクニックで、「if文 」を別の 「if文」の中に入れることです。

これにより、互いに異なるシナリオを考慮することができる。条件の中に別の条件があるようなもので、コード内でより複雑な条件を作成するのに役立ちます。

height = int(input("身長を㎝で入力:"))

if height >= 170:
    if  height <= 180:
        print("この服はぴったりサイズです。")

print("終了")

身長が175㎝の場合 :

身長を㎝で入力:175
この服はぴったりサイズです。
終了

身長が165㎝の場合 :

身長を㎝で入力:165
終了

身長が170以上かつ180以下かどうかをチェックする場合、「and」や「ネストになったif文」を使うことができます。ネストされたif文の中で起こることを記述するときは、インデントを2倍にして8スペースとなっていることも確認してください。

if-else 文

例えば、スコアが70点以上の場合は「合格 よくできました」と表示し、70点未満の場合は「次回は頑張りましょう」と表示したい場合、「if-else文」を使って示すことができます。

score = int(input("テストスコアを入力:"))

if score >= 70:
    print("合格")
    print("よくできました")

else:
    print("次回は頑張りましょう")

print("終了")

スコアが90の場合:

テストスコアを入力:90
合格
よくできました
終了

スコアが50の場合:

テストスコアを入力:50
次回は頑張りましょう
終了

条件式が満たされた場合は「if文」での処理が行われるが、条件式が満たされない場合は「else文」での処理が行われています。ここで、注目してほしいのは、else文はインデントされていません。

ネストされたif-else文の練習問題

うるう年の見分け方をネストされたif文を使ってプログラムしてみましょう。

ある年がうるう年かどうかを調べる方法:

  1. 4で割り切れる年で、
  2. さらに100で割り切れない年は「うるう年」
  3. ただし、100で割り切れる年でも、400で割り切れる年は「うるう年」

これをフローチャートにしてみると以下のようになります。

ネストされたif文で上記のフローチャートをもとにコードの1例を書いてみます。

year = int(input("年を入力: "))

if year % 4 == 0:
  if year % 100 == 0:
    if year % 400 == 0:
      print("うるう年")
    else:
      print("うるう年ではない")
  else:
    print("うるう年")
else:
  print("うるう年ではない")

2024年の場合:

2024
うるう年

1995年の場合:

1995
うるう年ではない

if-elif-else 文

特定の条件を満たすか満たさないかによって2つの結果を決定するだけでなく、3つ以上の分岐を持つより複雑なシナリオを作成することもできます。つまり、さまざまな条件とその組み合わせを考えることができます。

Pythonの実例で解説を進めていきます。上の例で使用した「うるう年」を判別するコードを今回は「if-elif-else」で書いてみます。

この場合、3つの条件を定義します:

  1. 4で割り切れなければ、「うるう年」ではない。
  2. 100で割り切れ、かつ400で割り切れない場合、「うるう年」ではない。
  3. 上記の条件を満たさない場合、「うるう年」である。
# ユーザーに年を入力してもらう
year = int(input("年を入力: "))

# 年が4で割り切れない場合、うるう年ではない
if year % 4 != 0:  
    print("うるう年ではない")

# 年が100で割り切れ、かつ400で割り切れない場合、うるう年ではない
elif year % 100 == 0 and year % 400 != 0: 
    print("うるう年ではない")

# 上記の条件を満たさない場合、うるう年である
else:  
    print("うるう年")

このコードを順番に解説します。

  1. year = int(input("年を入力: "))
    ユーザーに年を入力してもらいます。input() 関数はユーザーからの入力を受け取り、int() 関数で整数に変換しています。これにより、入力された値が年として処理されます。
  2. if year % 4 != 0:
    年が4で割り切れない場合、その年は「うるう年ではありません」。% 演算子は剰余(余り)を計算し、!= は等しくないことを判定します。つまり、入力した年を4で割り算したときに余りが0(ゼロ)でない場合をTrueとしたif文となっています。
  3. elif year % 100 == 0 and year % 400 != 0:
    もし、入力した年が4で割り切れた場合、このコードが実行されます。
    ここでは、100で割り切れ、かつ400で割り切れない場合、その年は「うるう年ではありません」。例えば、1900年は4で割り切れますが、100で割り切れ、かつ400でも割り切れないため、うるう年ではありません。
  4. else::
    上記の2と3の条件に当てはまらない場合、その年はうるう年です。例えば、2020年は4で割り切れますし、100でも400でも割り切れます。

結果は上記と同じになります。

2024年の場合:

2024
うるう年

1995年の場合:

1995
うるう年ではない

また、

「elif 」は複数の条件に対して使うことができます。再度、「うるう年」のコードを書き直してみます。

year = int(input("年を入力: "))

if year % 4 != 0:
  print ("うるう年ではない")
elif year % 100 != 0:
  print ("うるう年")
elif year % 400 !=0:
  print ("うるう年ではない")
else:
  print ("うるう年")

今回は分岐点毎にif、elif、elseを使って書いているのがわかるかと思います。特に分岐の数が多い場合は、elifを使うのがいいですね。

Python の if 文において、elif を使用する際のポイントを理解しやすく書き換えてみましょう。

  • else は必ず最後に配置します。
  • if … elif … else 文は同じインデントで書きます。
  • 複数の条件文でTrueとなる場合、上の行から順に実行されるため、上の条件コードが先に実行されます。したがって、if … elif … else 文を書く際に、条件の優先順位を考慮してください。

if-elif-elseの課題

仕様

  • 「1から10の数値を入力してください:」という文で、1~10の内から好きな数値を入力してもらう。
  • 入力した数値もとに以下のように表示させてみましょう。
    • 5未満であれ、「入力された数値は5未満です」
    • 5であれば、「入力された数値はちょうど5です」
    • 5以上であれば、「入力された数値は5より大きいです」

これはコードの一例です:

# 1から10の数値を入力してもらう
number = int(input("1から10の数値を入力してください: "))

# 数値に応じて異なるメッセージを表示する
if number < 5:
    print("入力された数値は5未満です")
elif number == 5:
    print("入力された数値はちょうど5です")
else:
    print("入力された数値は5より大きいです")

繰り返し

次に、同じ処理を繰り返す方法を学びます。

例えば、0から5までの整数を連続して表示したい場合、print()で繰り返すのは大変ですね。

print("0")
print("1")
print("2")
print("3")
print("4")
print("5")

このような、同じ処理を繰り返す処理を行う場合、while文とfor文が有用になります。

for文

「for文 」は、繰り返し処理の回数があらかじめわかっている場合に便利です。つまり、繰り返し回数が固定されている場合に適しています。

では、「forループ」を使った実用的な例を探ってみよう:

for i in range(6):
    print(i)

Output:

0
1
2
3
4
5

for文の下にある「インデントされたコード・ブロック」がループ本体で、i回実行される。

  • 「range(6) 」は0から5までの数列を生成する。
  • 「for i in ... 」は、数列の各値を1つずつ変数 「i 」に代入する。
  • for文の下の「インデントされたコード・ブロック」がループの本体で、i回実行される。

上の例ではわずか2行のコードで、0~5までの連続した数字を表示することができました。最初は少し見慣れない構文に思えるかもしれないですが、「for i in range(6):」の内訳を理解することで、より理解しやすくなる。

range()関数

例1: 「range() 」を使ったユーザー入力の繰り返し処理

for i in range(3): # Repeat 3 times
    user_input = input("好きな数字を入力: ")
    print(f"あなたの入力値: {user_input}")
print("終了")

このコードはrange()関数の基本です。引数に入れた回数を繰り返し処理を行っていますね。例では3回繰り返しています。

例 2: rangeで指定した範囲の数値を合計する

total_sum = 0

for num in range(1, 6): # 1から5を順に足す
    total_sum += num
    print(f"1から5の合計: {total_sum}")

出力:

1から5の合計: 1
1から5の合計: 3
1から5の合計: 6
1から5の合計: 10
1から5の合計: 15

この例では、for文を使って1から5までの数字の和を計算しているのがわかると思います。

例3:range()関数をステップを使った偶数の印刷

range()関数では、引数を、

range(start, end, step)という書式で記述します。この時、endに指定した値から-1した値まで繰り返すことは、これまでの例でもありましたね。今回はさらに、3番目の引数であるstep(増加分)を使用します。

for even_num in range(2, 11, 2): # 2から10までの偶数を表示
    print(even_num)

出力:

2
4
6
8
10

例4: ネストされたfor文

for i in range(1, 6):
    for j in range(1, 6):
        print(f"{i} x {j} = {i * j}")

このコードは、Pythonを使って、1から5までの数字の掛け算表を表示するものです。

  1. for ループを使って i を1から5まで順番に変化させます。
  2. さらに、その中でまた別の for ループを使って j を1から5まで順番に変化させます。
  3. その後、print() 関数を使って、ij の掛け算の結果を表示します。

ここで、f"{i} x {j} = {i * j}" の部分は、Pythonのf文字列という機能を使っています。これは、文字列の中に変数や式を埋め込むことができる便利な機能です。{} の中に変数や式を書くと、それが評価されて文字列に埋め込まれます。具体的には、ij の値がそれぞれ埋め込まれ、{i} x {j} = {i * j}{1} x {1} = {1 * 1} から {5} x {5} = {5 * 5} までの文字列に展開されていきます。

while 文

次に、「特定の条件式を満たす間だけ」処理を繰り返す「while文」について説明します。上記のfor文同様に、0~5までを表示させます。

i = 0

while i < 6:
    print(i)
    i += 1

print("終了")

出力:

0
1
2
3
4
5
終了

Pythonで「while文」を使う場合、構文は「if文」とよく似ています。「while文」は、指定された条件が真である限り、コードのブロックを繰り返し実行することができます。

上の例では、「while文 」が 「i <6 」という条件が真である限り、「while文」内のインデントされたコード・ブロックが実行されます。実行されるごとに"i"に1ずつ追加され、"6"になったところで終了されます。

ここで重要なのは、「while文」自体は本来、繰り返し回数を記録していません。繰り返し回数を数えるには、「while文」の前に変数(この場合は「i」)を宣言する必要があります。この変数はカウンターの役割を果たし、繰り返し回数を格納します。ループの前にカウンターを初期値設定し、ループ内で増加させることで、反復回数を効果的に記録することができる仕組みとなっています。

まとめると、「while文 」を使うと、ある条件が真の間、一連の命令を繰り返すことができます。繰り返し回数を記録するために、カウンタ変数が使用され、各反復の間に増加(減少)されます。このカウンタ変数は、一般にインデックスまたはループ変数と呼ばれます。

無限ループ

↓↓ 以下のコードは実行しないで下さい。

i = 0

while i >= 0:
    i += 1
    print(i)

print("DONE")

このコードの「while文」では、変数「i」の値が0以上である限り、ループが実行され続けることを意味します。ループは各反復で「i」を1ずつ増加し、その値を表示します。

しかし、「i 」が常にインクリメントされ、条件が常に真である(このループでは 「i 」が負になることはない)というループの性質上、プログラムは無限ループに入る。無限ループとは、ループが無限に実行され続け、プログラムが最後まで終了しない状態のことである。

上のコードは次のように書き換えましょう。

i = 0

while i < 10: 
    i += 1
    print(i)

print("終了")

出力:

1
2
3
4
5
6
7
8
9
10
終了

もし、プログラム実行中に無限ループの状況に陥った場合、あるいは間違って上記のようなプログラムを実行してしまった場合、次のようにして処理を停止させることができる:

Jupyter Notebookの上部にあるツールバーの四角い「■」(stop)ボタンをクリックする。
(このボタンは、現在のセルやカーネルの実行を中断するのに使う。)

カーネルを中断した後、ノートブックが反応しない場合はカーネルを再起動する必要があるかもしれません。メニューから 「Kernel 」を選択し、必要に応じて 「Restart & Clear Output 」または 「Restart & Run All 」を選択することで再起動することができます。

カーネルを中断すると、すべてのコードセルの実行が強制的に停止され、保存されていないプログレスが失われることに留意してください。失いたくない重要なデータがある場合は、Jupyter Notebookを定期的に保存するようにしてください。

break

break文はPythonでループを早期に終了するために使われます。特に 「while True: 」構文で意図的に作成された無限ループを扱うときに便利です。以下に 「break 」の使用例を示します:

i = 0

while True:
    i += 1

    if i > 5:
        break

    print(i)

print("終了")

この例では、「while True: 」の条件が常に真であるため、無限ループが発生します。

無限ループを防ぐために、ループ内で 「break 」文が使われていることを確認してください。ループは 「i 」が5を超えるまで実行され続け、その時点で 「break 」文が実行され、ループは終了し、同じループ・スコープ内にあるそれ以下のコードは実行されません。

したがって、「print("終了")」文はループの外にあり、ループが終了した後にのみ実行される。

最後に、このコードは1から5までの数字を表示し、ループが終了したことを示す「終了」を表示します。

出力:

1
2
3
4
5
DONE

「break 」を使用することで、特定の条件に基づいてループの流れを制御し、ループを早期に終了することができます。

continue

Pythonでは、「continue 」文は、現在の繰り返しをスキップし、次の繰り返しループの最初に戻るために使用されます。言い換えれば、特定の条件をバイパスしてループを続けたいときに特に便利です。例を通してその使い方を探ってみよう。

下のサンプルコードは0から10までの繰り返しを行う繰り返しコードで、偶数のみを表示させます。

i = 0

while True:
    i += 1
    if i > 10:
        break

    if i % 2 == 1:
        continue

    print(i)

print("終了")

出力:

2
4
6
8
10
終了

この例では、「i 」が10より大きくなるまで 「i 」変数を増加させるコードです。

「while True: 」ループ内に、「i 」が奇数(「i % 2 == 1」)かどうかをチェックする 「if 」文が追加されているのを確認して下さい。

もし、この条件が真の場合、「continue」文が実行されます。

continue が実行されると、コードは print(i)をスキップしてループの最初に戻ります。したがって、奇数が continueのトリガーとなり、print(i) の行をバイパスして最初に戻るため、偶数のみが画面に表示されるのです。

「continue」を使うことで、ループの流れを制御し、特定の条件に基づいて特定の反復をスキップすることができます。

具体的なコード例

以下は今回のif文とwhile文にbreakとcontinueを組み合わせてテストの結果を入力し、60点を合格ラインとして、

  • テストの合計得点
  • 合格者数
  • 不合格者数
  • 平均点

を求めるコードです。

# 初期値
total_score = 0
student_count = 0
pass_count = 0
fail_count = 0

# 点数の入力を受け付ける
while True:
    score_input = input("テストの点数を入力してください(終了するには e を入力): ")
    if score_input == "e":
        # -1が入力された場合、ループを抜ける
        break
    score = int(score_input)
    
    # スコアが負の場合は無視して次の入力を待つ
    if score < 0:
        print("無効なスコアです。負の値は無視されます。")
        continue

    # スコアを合計に加える
    total_score += score
    
    # 合格者と不合格者をカウントする
    if score >= 60:
        pass_count += 1
    else:
        fail_count += 1
    # 学生数をカウントする
    student_count += 1

    # 平均点を計算
    average_score = total_score / student_count

print(f"合計得点: {total_score} 点")
print(f"合格者数: {pass_count} 人")
print(f"不合格者数: {fail_count} 人")
print(f"平均テスト得点は {average_score} 点です。")

もうひとつ具体的なコードを紹介します。今度は、数字を当てるゲームのコードです。可能ならばサンプルコードを確認する前に、自分で書いてみて下さいね。

課題:
ユーザーと数字当てゲームをする Python プログラムを作成する必要があります。プログラムは以下のステップを踏む必要があります:


ゲームのルール:

  • プログラムは「秘密の数字」として、 1 から 100 までのランダムな整数を生成します。
  • ユーザーは10回、秘密の数字を当てることができます。
  • 1回当てるごとに、プログラムは以下のフィードバックを提示します:
    • 推測が高すぎる場合、プログラムは "高い"と出力する。
    • 推測が低すぎる場合、プログラムは "低い"と出力する。
    • 推測が正しければ、プログラムは「おめでとうございます!あなたは秘密の数字を当てました!」と出力し、ゲームを終了する。
  • ユーザーが10回以内に数字を当てることができなかった場合、プログラムは秘密の数字を明らかにし、ゲームを終了する。
  • ボーナス機能:ユーザーが最初に難易度を選択できるようにします:
    • Easy: 15回
    • Medium: 10回
    • Hard: 5回
import random

print("秘密の数字ゲームへようこそ!")
print("レベルを選択:")
print("1. Easy (15回トライ)")
print("2. Medium (10回トライ)")
print("3. Hard (5回トライ)")

# 難易度
difficulty = input("レベル 1, 2, or 3を入力: ")

if difficulty == '1':
    attempts = 15
elif difficulty == '3':
    attempts = 5
else:
    attempts = 10

# 秘密の数字をランダム選定
mystery_number = random.randint(1, 100)

print(f"{attempts}回の間に1~100内の秘密の数字を当てて下さい")

for attempt in range(1, attempts + 1):
    guess = int(input(f"{attempt}回目: 数字を入力: "))
    
    # Check guess
    if guess > mystery_number:
        print("予想した数は大きすぎます")
    elif guess < mystery_number:
        print("予想した数は小さすぎます")
    else:
        print("おめでとうございます!あなたは秘密の数字を当てました!")
        break
else:
    print(f"残念です。秘密の数字は{mystery_number}.")

まとめ

今回は、if-elif-elseを使った条件分岐やfor・whileを使た繰り返し、さらにはcontinueやbreakなどPythonでは無くてはならない構文を解説しました。それぞれがとても有用なものですから少しずつマスターしていきましょう!

コメント