JEPA4Japan · チュートリアル

条件で選び、繰り返して処理する

1,761文字 5分で読めます #Python

条件分岐、論理演算、forループ、whileループでプログラムの流れを制御します。

コース進捗 コース目次 24レッスン中 24件を公開中

Pythonに信号機を渡そう

ここまでのPythonは、一本道を上から下へ進みました。役立つプログラムには、「答えがはいなら、こちらへ進む」「仕事が残っている間、もう一度行う」という信号機も必要です。これを制御フローと呼びます。

  1. 聞く TrueかFalseの質問
  2. 選ぶ 一致した道を1つ進む
  3. 繰り返す 仕事が終わるまで
質問が道を選び、ループが同じ道を何度も進みます。

最後には「7日間学習トラッカー」を作ります。7回質問し、目標を達成した日を数え、1週間のメッセージを1つ表示します。

質問を作り、道を1つ選ぶ

比較の答えは、真偽値のTrueかFalseです。

minutes = 35

print(minutes == 35)
print(minutes != 35)
print(minutes > 30)
print(minutes >= 40)

出力:

True
False
True
False

6つの比較演算子は==、!=、>、>=、<、<=です。等号1つは代入、2つは比較です。また、整数と文字列は別の型なので、30 == "30"はFalseになります。

if、elif、elseで、道を1つだけ選びます。

score = 82

if score >= 90:
    print("優秀")
elif score >= 60:
    print("合格")
else:
    print("もう一度挑戦")

出力:

合格
  1. 90以上? 優秀
  2. 60以上? 合格
  3. それ以外 もう一度挑戦
  4. 最初の一致 そこで選択は終わり
Pythonは上から調べるので、高いしきい値を先に置きます。

コロンがブロックを始め、4つの空白がその中の命令を示します。インデントは飾りではなく、Pythonの文法です。

両方が真でなければならないときはand、どちらか一方でよいときはor、真偽を逆にするときはnotを使います。

minutes = 40
exercise_done = True

if minutes >= 30 and exercise_done:
    print("今日の学習は完了です")

False、None、0、""は、条件の中で偽として扱われます。それ以外の多くは真です。"False"は空ではない文字列なので、bool("False")はTrueになる点に注意してください。

ループの道を歩こう

回数が決まっているならforを使います。

for day in range(1, 4):
    print(f"{day}日目")

出力:

1日目
2日目
3日目

range(1, 4)は4の直前で止まります。そのため、range(1, 8)で1日目から7日目までを作れます。

合計を覚える累積値と、回数を覚えるカウンターは、ループの前で始め、内側で更新します。

total = 0
days_met = 0

for minutes in (30, 20, 40):
    total += minutes
    if minutes >= 30:
        days_met += 1

print(total)
print(days_met)

出力:

90
2

変化する条件によって終わるならwhileです。

remaining = 3

while remaining > 0:
    print(remaining)
    remaining -= 1

print("スタート!")
  1. 確認 remaining > 0?
  2. 実行 今の数を表示
  3. 変化 1を引く
whileには、やがて質問をFalseにする変化が必要です。

出力は3、2、1、最後に「スタート!」です。breakはループを途中で抜け、continueは次の繰り返しへ飛びます。道を追いやすくするため、必要なときだけ使いましょう。

7日間学習トラッカーを作ろう

標準機能だけで動く完全なミニプロジェクトです。study_tracker.pyへ保存します。

target = int(input("1日の目標(分):"))

total = 0
days_met = 0

for day in range(1, 8):
    minutes = int(input(f"{day}日目の学習時間(分):"))
    total += minutes

    if minutes >= target:
        days_met += 1
        print("目標達成")
    else:
        missing = target - minutes
        print(f"あと{missing}分")

average = total / 7

print()
print(f"週間合計:{total}分")
print(f"1日平均:{average:.1f}分")
print(f"目標達成:7日中{days_met}日")

if days_met == 7:
    print("毎日達成しました!")
elif days_met >= 5:
    print("充実した1週間でした")
else:
    print("少しずつ習慣を作りましょう")

目標を30分にし、30, 20, 45, 30, 35, 10, 40を1つずつ入力します。集計を確認してください。

週間合計:210分
1日平均:30.0分
目標達成:7日中5日
充実した1週間でした

境界も試します。コードは>=なので、ちょうど30分も達成です。7日達成なら「毎日達成しました!」、4日なら「少しずつ習慣を作りましょう」を選ぶ必要があります。

3つの小さなチャレンジとループの安全

  1. 得点の門。 90以上は「優秀」、60〜89は「合格」、60未満は「もう一度挑戦」と表示します。59、60、89、90で試します。
  2. 1から10を足す。 sum()を使わず、range()と累積値で合計します。55になれば成功です。
  3. 安全なカウントダウン。 開始する整数を受け取り、whileで数を減らします。毎回1つの値が変わることを確認し、0のときの動きも決めます。

注意点:文字列をint()へ渡すとValueErrorになり、第10章で対応します。コロンや4つの空白を忘れると、構文またはインデントのエラーになります。whileの条件が永遠に偽にならなければ無限ループです。Ctrl+Cで止め、足りない更新を探してください。

繰り返す仕事に名前を付ける準備はできたかな?

  • 6つの比較演算子で真偽値を作れる
  • =は代入、==は比較だと説明できる
  • 分かりやすいif / elif / elseを書ける
  • and、or、notで条件を組み合わせられる
  • range()が終了値を含まないと分かる
  • ループ全体で合計と回数を覚えられる
  • 自分のwhileが止まる理由を説明できる
  • トラッカーで210分の期待結果を出せる
  • 3つの小さなチャレンジを終えた

次章では、繰り返す仕事を名前の付いた関数へ入れ、長いプログラムも読みやすく、確かめやすくします。