【Python入門】5章の演習プログラム

 5章の演習プログラムでは、これまで学んできた条件分岐や入力処理、繰り返し処理、ループの中断やスキップ、さらには関数のプレースホルダーまで、幅広い基本文法を実際に組み合わせて実践的なプログラムを作成します。
 ここまでの学習内容を総まとめし、各制御構造の使い方と特徴を振り返ることで、より実践的なPythonプログラミングへとステップアップできるでしょう。

プログラムのダウンロード

 「ダウンロード」から、JupyterLab で実行できるサンプルプログラムがダウンロードできます。ファイルは、ESET Endpoint Securityでウイルスチェックをしておりますが、ダウンロードとプログラムの実行は自己責任でお願いいたします。

以下は、5章で学んだ主要な項目とその概要をまとめた表です。

項目内容の概要
条件分岐のif文条件がTrueの場合に特定の処理を実行する基本構文
キーボード入力のinput文ユーザから入力を受け取り、その文字列を返す。
if文で複数の文を実行するインデントを用いて、if文のブロック内に複数の文を記述する。
条件に一致しない場合のelse節条件がFalseの場合に実行される処理を定義する。
elif節を伴うif文複数の条件を順次評価し、最初にTrueとなった条件に対応する処理を実行する。
三項演算子式A if 条件 else 式B の形で、条件に応じた値を1行で返す。
複雑な条件式3通り以上の結果を返す条件式の記述方法(式A if 条件X else 式B if 条件Y else 式C)
for文の基本とネストfor文でイテラブルなオブジェクトを順に処理し、ネストで多重ループが可能
for文とアンパッキング辞書やタプルなどの各要素をアンパッキングして複数の変数に代入できる。
range関数を用いたfor文指定した範囲の整数列を生成し、繰り返し処理に利用する。
for文のネスト内側のfor文が外側のfor文の各反復で実行される多重ループ
for文とenumerate関数の組み合わせenumerate関数でカウントと要素を同時に取得し、番号付きの反復処理を実現
逆順に繰り返すreversed関数イテラブルの要素を逆順に取り出して処理する。
while文を使ったループ条件式がTrueである限り繰り返し処理を行うループ
次の繰り返しに進めるcontinue文ループ内の残りの処理をスキップして、次の反復に直ちに移行する。
繰り返しを中断するbreak文ループ全体を中断して、以降の反復処理を終了する。
while文やfor文のelse節ループが最後まで正常に実行された場合にのみ実行される処理を記述する。
無限ループを抜けるbreak文無限ループの中で、特定の条件でbreak文を使ってループを終了する。
何もしないpass文文法上記述が必要な場所において、何も処理を行わないことを明示するプレースホルダー

 次の演習では、これら5章の知識を総合して、実際にプログラムを作成してみます。このサンプルプログラムでは、ユーザからテストの点数を入力してもらい、各反復で条件に応じた評価を行い、最終的にすべての点数が条件を満たしているかをチェックするという内容です。なお、途中で未実装の機能がある部分は、後で実装するためのpass文を使用しています。

【サンプルプログラム:テストの点数判定と評価】

def bonus_points():
    # 将来的にボーナス点の計算処理を実装する予定です。
    pass  # 現時点では未実装

# ユーザにテストの点数を入力してもらい、その合計と評価を計算するプログラム
scores = []  # 点数を格納する空のリスト

# 無限ループを使用して、ユーザから点数を入力させる(空文字で終了)
while True:
    inp = input("Enter test score (or press Enter to finish): ")
    if not inp:  # 空文字の場合、ループを終了
        break
    try:
        score = float(inp)
    except ValueError:
        print("Invalid input. Please enter a numeric value.")
        continue  # 無効な入力の場合は、次の反復に移る
    scores.append(score)

# 全ての点数が70以上なら"Pass"、そうでなければ"Fail"を表示
for s in scores:
    if s < 70:
        print("Fail")
        break
else:
    print("Pass")

# 各点数に対して、評価コメントを表示する(enumerateとfor文を使用)
print("\nDetailed Scores:")
for i, s in enumerate(scores, 1):
    # 三項演算子を用いて評価を簡潔に決定
    evaluation = "Excellent" if s >= 90 else "Good" if s >= 75 else "Average" if s >= 60 else "Poor"
    print(f"{i}: Score = {s}, Evaluation = {evaluation}")

# テストの合計点と平均点を表示(range関数を用いたfor文の例も含む)
total = 0
for i in range(len(scores)):
    total += scores[i]
if scores:
    average = total / len(scores)
    print(f"\nTotal: {total}, Average: {average:.2f}")
else:
    print("\nNo scores were entered.")

# 逆順に各点数を表示(reversed関数とfor文の組み合わせ)
print("\nScores in Reverse Order:")
for idx, score in reversed(list(enumerate(scores, 1))):
    print(f"{idx}: {score}")

print("\nBonus Points Calculation (to be implemented):")
bonus_points()  # 現在はpass文により何も実行されません

実行結果

Enter test score (or press Enter to finish):  90
Enter test score (or press Enter to finish):  85
Enter test score (or press Enter to finish):  75
Enter test score (or press Enter to finish):  96
Enter test score (or press Enter to finish):  72
Enter test score (or press Enter to finish):  
Pass

Detailed Scores:
1: Score = 90.0, Evaluation = Excellent
2: Score = 85.0, Evaluation = Good
3: Score = 75.0, Evaluation = Good
4: Score = 96.0, Evaluation = Excellent
5: Score = 72.0, Evaluation = Average

Total: 418.0, Average: 83.60

Scores in Reverse Order:
5: 72.0
4: 96.0
3: 75.0
2: 85.0
1: 90.0

Bonus Points Calculation (to be implemented):

解説

  • ユーザ入力
    ・ユーザからテストの点数を入力してもらい、空文字が入力された時点でwhileループがbreak文により終了します。
    ・例外処理(try...except)を用いて、数値以外が入力された場合はcontinue文で次の反復に進みます。
  • 評価判定
    ・for文とbreak文、else節を組み合わせて、すべての点数が70以上であるかどうかをチェックしています。
    ・1つでも70未満の点数があれば"Fail"を表示し、break文によりループを中断します。else節は、break文が実行されなかった場合にのみ"Pass"を表示します。
  • 詳細な評価の表示
    ・enumerate関数を用いて、各点数にインデックスを付与し、三項演算子を利用して各点数に応じた評価コメントを生成して表示します。
  • 合計点と平均点の計算
    ・range関数を用いたfor文で、リスト内の各点数を反復処理し、合計を求めた後、平均点を計算して表示します。
  • 逆順表示
    ・reversed関数とenumerate関数を組み合わせることで、入力された点数の順序を逆にして表示します。
  • 未実装機能のプレースホルダー
    ・関数bonus_points()は、将来的にボーナス点の計算処理を実装するためのプレースホルダーとしてpass文を使用しています。

まとめ

 この演習プログラムでは、5章で学んだ様々な基本制御構造と関数、ループ、条件分岐、入力処理、そしてbreak、continue、pass文などを総合的に活用しています。

  • while文とbreak/continue文: ユーザ入力によるループ制御を実装し、不正な入力をスキップしたり、終了条件に達した場合にループを中断します。
  • if文、elif文、else節、三項演算子: 各点数の評価と全体の合格/不合格判定を柔軟に行います。
  • for文とenumerate、range、reversed: 点数リストの反復処理、インデックスの付与、合計および平均点の計算、逆順での出力など、多様な反復処理技法を学びます。
  • pass文: 将来的な機能実装のためのプレースホルダーとして、関数内で利用されます。

 この演習を通じて、5章で学んだ知識を実践的に統合し、より複雑で実用的なプログラムの作成に向けた基盤を固めることができます。次の6章では、関数の定義とその活用についてさらに深掘りしていきます。