Python の if-elif-else を使った成績評価方法:点数から成績を決定

PythonBeginner
オンラインで実践に進む

はじめに

このチュートリアルでは、Python の if-elif-else 文を使用して成績評価システムを実装するプロセスを説明します。学生の得点に基づいて成績を決定する方法を学びます。これは教育現場でよく行われる作業です。このチュートリアルを終える頃には、実際のシナリオに適用できる機能的な成績評価プログラムを作成できるようになります。この実践的なアプローチは、より複雑なプログラミングロジックの基本的な構成要素である、Python の条件文に対する理解を深めます。

Python の条件文を理解する

成績評価システムを作成する前に、Python の基本的な条件文を理解しましょう。条件文を使用すると、プログラムは特定の条件に基づいて決定を下すことができます。

最初の Python ファイルの作成

まず、新しい Python ファイルを作成しましょう。

  1. WebIDE で、左上の「File」メニューをクリックします。
  2. 「New File」を選択します。
  3. ファイルを /home/labex/project ディレクトリに conditional_demo.py として保存します。

基本的な If-Else 文

conditional_demo.py ファイルに、次のコードを記述します。

## Basic if-else example
score = 75

if score >= 70:
    print("You passed the test!")
else:
    print("You need to study more.")

## Try changing the score to see different results

このシンプルなプログラムは、score 変数が 70 以上かどうかをチェックします。70 以上であれば "You passed the test!" と出力します。それ以外の場合は "You need to study more." と出力します。

コードのテスト

コードを実行するには、WebIDE でターミナルを開き、以下を実行します。

python3 /home/labex/project/conditional_demo.py

次のような出力が表示されるはずです。

You passed the test!

If-Elif-Else でさらに条件を追加する

if-elif-else 構造を使用して、より多くの条件を処理するように例を拡張しましょう。

## If-elif-else example
score = 85

if score >= 90:
    print("Excellent!")
elif score >= 80:
    print("Very good!")
elif score >= 70:
    print("Good!")
elif score >= 60:
    print("Satisfactory")
else:
    print("Needs improvement")

## Try different values for score to see different results

ファイルを保存して、もう一度実行します。

python3 /home/labex/project/conditional_demo.py

出力:

You passed the test!
Very good!

if-elif-else 構造は、上から下に条件を評価します。条件が真になると、対応するコードブロックが実行され、残りの条件はスキップされます。

この流れを理解することは、次のステップで成績評価システムを構築するために不可欠です。

基本的な成績評価システムの作成

条件文を理解したので、シンプルな成績評価システムを構築しましょう。数値の得点をアルファベットの成績に変換する関数を作成します。

成績評価システムファイルの作成

  1. WebIDE で、grading_system.py という名前の新しいファイルを作成します。
  2. /home/labex/project ディレクトリに保存します。

基本的な成績評価関数の実装

grading_system.py ファイルに、次のコードを記述します。

def get_grade(marks):
    """
    Convert numerical marks to letter grades.

    A: 90-100
    B: 80-89
    C: 70-79
    D: 60-69
    F: 0-59
    """
    if marks >= 90:
        return 'A'
    elif marks >= 80:
        return 'B'
    elif marks >= 70:
        return 'C'
    elif marks >= 60:
        return 'D'
    else:
        return 'F'

## Test the function with a few examples
test_marks = [95, 82, 75, 65, 45]

for mark in test_marks:
    grade = get_grade(mark)
    print(f"Marks: {mark} - Grade: {grade}")

このコードは、学生の得点を入力として受け取り、一般的な成績評価のしきい値に基づいて対応するアルファベットの成績を返す関数 get_grade() を作成します。

成績評価システムの実行

コードを実行して、成績評価システムをテストしましょう。

python3 /home/labex/project/grading_system.py

次のような出力が表示されるはずです。

Marks: 95 - Grade: A
Marks: 82 - Grade: B
Marks: 75 - Grade: C
Marks: 65 - Grade: D
Marks: 45 - Grade: F

コードの理解

これがどのように機能するかを分解してみましょう。

  1. marks という 1 つのパラメータを受け取る get_grade() という関数を定義しました。
  2. 関数内で、if-elif-else 文を使用して、さまざまな成績のしきい値に対して得点をチェックしました。
  3. 関数がさまざまな値でどのように機能するかを示すために、テストマークのリストを作成しました。
  4. for ループを使用して各マークを反復処理し、その成績を取得し、結果を出力しました。

この基本的な成績評価システムは標準的なケースではうまく機能しますが、エッジケースはどうでしょうか?次のステップでは、それらを処理するようにシステムを改善します。

成績評価システムにおけるエッジケースの処理

基本的な成績評価システムは機能しますが、次のようなエッジケースは考慮されていません。

  1. 無効な入力(0 未満または 100 より大きい得点)
  2. 数値以外の入力

これらのシナリオを処理するように成績評価システムを改善しましょう。

成績評価システムの更新

/home/labex/project ディレクトリに、次のコードを含む improved_grading.py という新しいファイルを作成します。

def get_grade(marks):
    """
    Convert numerical marks to letter grades with input validation.

    A: 90-100
    B: 80-89
    C: 70-79
    D: 60-69
    F: 0-59

    Returns "Invalid marks" for inputs outside the range of 0-100
    """
    try:
        ## Convert to float in case input is a string number
        marks = float(marks)

        ## Check if marks are in valid range
        if marks < 0 or marks > 100:
            return "Invalid marks: must be between 0 and 100"
        elif marks >= 90:
            return 'A'
        elif marks >= 80:
            return 'B'
        elif marks >= 70:
            return 'C'
        elif marks >= 60:
            return 'D'
        else:
            return 'F'
    except ValueError:
        return "Invalid marks: not a number"

## Test the function with valid and invalid inputs
test_inputs = [95, 82, 75, 65, 45, -5, 105, "abc", "75"]

for value in test_inputs:
    grade = get_grade(value)
    print(f"Input: {value} - Result: {grade}")

改善された成績評価システムの実行

改善された成績評価システムを実行します。

python3 /home/labex/project/improved_grading.py

出力は次のようになります。

Input: 95 - Result: A
Input: 82 - Result: B
Input: 75 - Result: C
Input: 65 - Result: D
Input: 45 - Result: F
Input: -5 - Result: Invalid marks: must be between 0 and 100
Input: 105 - Result: Invalid marks: must be between 0 and 100
Input: abc - Result: Invalid marks: not a number
Input: 75 - Result: C

改善点の説明

行った改善点を見てみましょう。

  1. 入力型の変換: float() を使用して入力を数値に変換し、関数が "75" のような文字列入力を受け入れられるようにしました。

  2. 有効範囲のチェック: 得点が 0~100 の有効範囲内にあるかどうかをチェックする条件を追加しました。

  3. エラー処理: 非数値入力が提供された場合に発生する ValueError 例外をキャッチするために、コードを try-except ブロックでラップしました。

  4. 詳細なエラーメッセージ: エラーコードを返すだけでなく、何が問題だったのかをユーザーに知らせる具体的なエラーメッセージを返します。

これらの改善により、さまざまなエッジケースを適切に処理することで、成績評価システムの堅牢性が向上します。プログラムは、無効な入力が検出された場合に、クラッシュしたり、誤った結果を生成したりするのではなく、役立つフィードバックを提供するようになりました。

フィードバックメッセージによる成績評価システムの強化

各成績に対してパーソナライズされたフィードバックメッセージを追加することにより、成績評価システムをさらに改善しましょう。これにより、システムはより有益で使いやすくなります。

強化された成績評価システムの作成

/home/labex/project ディレクトリに、enhanced_grading.py という新しいファイルを作成します。

def get_grade_with_feedback(marks):
    """
    Convert numerical marks to letter grades with personalized feedback.

    Returns a tuple containing the grade and a feedback message.
    """
    try:
        marks = float(marks)

        if marks < 0 or marks > 100:
            return (None, "Invalid marks: must be between 0 and 100")
        elif marks >= 90:
            return ('A', "Excellent! Outstanding performance.")
        elif marks >= 80:
            return ('B', "Very good! Above average performance.")
        elif marks >= 70:
            return ('C', "Good work! Average performance.")
        elif marks >= 60:
            return ('D', "Satisfactory. Below average but passing.")
        else:
            return ('F', "Needs improvement. Please study more.")
    except ValueError:
        return (None, "Invalid marks: not a number")

def format_report(student_name, marks, subject):
    """
    Generate a formatted report for a student.
    """
    grade, feedback = get_grade_with_feedback(marks)

    if grade is None:
        return f"Report for {student_name}: {feedback}"

    return f"""
Report Card
-----------
Student: {student_name}
Subject: {subject}
Marks: {marks}
Grade: {grade}
Feedback: {feedback}
"""

## Test the enhanced system with a few examples
students = [
    {"name": "Alice", "marks": 92, "subject": "Mathematics"},
    {"name": "Bob", "marks": 78, "subject": "Science"},
    {"name": "Charlie", "marks": 45, "subject": "History"},
    {"name": "David", "marks": "abc", "subject": "English"}
]

for student in students:
    report = format_report(student["name"], student["marks"], student["subject"])
    print(report)

強化された成績評価システムの実行

強化された成績評価システムを実行します。

python3 /home/labex/project/enhanced_grading.py

次のような出力が表示されるはずです。

Report Card
-----------
Student: Alice
Subject: Mathematics
Marks: 92
Grade: A
Feedback: Excellent! Outstanding performance.


Report Card
-----------
Student: Bob
Subject: Science
Marks: 78
Grade: C
Feedback: Good work! Average performance.


Report Card
-----------
Student: Charlie
Subject: History
Marks: 45
Grade: F
Feedback: Needs improvement. Please study more.

Report for David: Invalid marks: not a number

新機能の説明

実装した機能強化を見てみましょう。

  1. パーソナライズされたフィードバック: 各成績には、コンテキストと励ましを提供する特定のフィードバックメッセージが含まれるようになりました。

  2. 戻り値の形式: get_grade_with_feedback() 関数は、成績とフィードバックメッセージの両方を含むタプルを返します。

  3. レポートのフォーマット: 各学生の構造化された成績表を生成する新しい関数 format_report() を作成しました。

  4. 現実世界のデータでのテスト: 実際の学生データをシミュレートするために、辞書のリストを使用しました。これは、プログラミングでよく使用されるデータ構造です。

  5. 適切なエラー処理: システムは引き続き無効な入力を適切に処理しますが、エラーをユーザーフレンドリーな形式で表示するようになりました。

これらの機能強化により、成績評価システムは現実世界での使用にさらに実用的になります。パーソナライズされたフィードバックは、学生が自分のパフォーマンスを理解するのに役立ち、フォーマットされたレポートは、結果の専門的なプレゼンテーションを提供します。

実データセットへの成績評価システムの適用

次に、より現実的なシナリオに成績評価システムを適用してみましょう。ファイルから学生データを読み込み、成績を計算し、包括的なレポートを書き出すプログラムを作成します。

サンプルデータセットの作成

まず、サンプル学生データを含むファイルを作成しましょう。 /home/labex/project ディレクトリに、次の内容で student_data.csv という新しいファイルを作成します。

name,subject,marks
John,Mathematics,88
Emily,Mathematics,92
Michael,Mathematics,75
Sophia,Mathematics,68
Daniel,Mathematics,42
Olivia,Mathematics,95
William,Mathematics,73
Emma,Mathematics,60
James,Mathematics,79
Ava,Mathematics,85

完全な成績評価アプリケーションの作成

次に、/home/labex/project ディレクトリに、grading_application.py という新しいファイルを作成します。

def get_grade_with_feedback(marks):
    """
    Convert numerical marks to letter grades with personalized feedback.

    Returns a tuple containing the grade and a feedback message.
    """
    try:
        marks = float(marks)

        if marks < 0 or marks > 100:
            return (None, "Invalid marks: must be between 0 and 100")
        elif marks >= 90:
            return ('A', "Excellent! Outstanding performance.")
        elif marks >= 80:
            return ('B', "Very good! Above average performance.")
        elif marks >= 70:
            return ('C', "Good work! Average performance.")
        elif marks >= 60:
            return ('D', "Satisfactory. Below average but passing.")
        else:
            return ('F', "Needs improvement. Please study more.")
    except ValueError:
        return (None, "Invalid marks: not a number")

def process_student_data(input_filename, output_filename):
    """
    Process student data from a CSV file and generate a report.
    """
    try:
        ## Read the input file
        with open(input_filename, 'r') as file:
            lines = file.readlines()

        ## Skip the header line
        headers = lines[0].strip().split(',')
        data = [line.strip().split(',') for line in lines[1:]]

        ## Prepare the output
        output_lines = ["Student Grade Report\n", "=" * 20 + "\n\n"]

        ## Calculate statistics
        valid_marks = []
        grade_counts = {'A': 0, 'B': 0, 'C': 0, 'D': 0, 'F': 0, 'Invalid': 0}

        ## Process each student
        for student in data:
            name, subject, marks = student
            grade, feedback = get_grade_with_feedback(marks)

            if grade:
                valid_marks.append(float(marks))
                grade_counts[grade] += 1

                output_lines.append(f"Student: {name}\n")
                output_lines.append(f"Subject: {subject}\n")
                output_lines.append(f"Marks: {marks}\n")
                output_lines.append(f"Grade: {grade}\n")
                output_lines.append(f"Feedback: {feedback}\n\n")
            else:
                grade_counts['Invalid'] += 1
                output_lines.append(f"Student: {name}\n")
                output_lines.append(f"Subject: {subject}\n")
                output_lines.append(f"Error: {feedback}\n\n")

        ## Calculate statistics
        if valid_marks:
            average_mark = sum(valid_marks) / len(valid_marks)
            max_mark = max(valid_marks)
            min_mark = min(valid_marks)

            output_lines.append("Class Statistics\n")
            output_lines.append("-" * 15 + "\n")
            output_lines.append(f"Average Mark: {average_mark:.2f}\n")
            output_lines.append(f"Highest Mark: {max_mark:.1f}\n")
            output_lines.append(f"Lowest Mark: {min_mark:.1f}\n\n")

            output_lines.append("Grade Distribution\n")
            output_lines.append("-" * 17 + "\n")
            for grade, count in grade_counts.items():
                output_lines.append(f"{grade}: {count}\n")

        ## Write the output file
        with open(output_filename, 'w') as file:
            file.writelines(output_lines)

        print(f"Report successfully generated and saved to {output_filename}")

    except Exception as e:
        print(f"An error occurred: {str(e)}")

## Run the application
input_file = "/home/labex/project/student_data.csv"
output_file = "/home/labex/project/grade_report.txt"

process_student_data(input_file, output_file)

## Display the report in the console as well
print("\nGenerated Report Contents:")
print("--------------------------")
with open(output_file, 'r') as file:
    print(file.read())

完全なアプリケーションの実行

アプリケーションを実行します。

python3 /home/labex/project/grading_application.py

プログラムは学生データを読み込み、成績を計算し、レポートを生成してコンソールに表示します。次のような出力が表示されるはずです。

Report successfully generated and saved to /home/labex/project/grade_report.txt

Generated Report Contents:
--------------------------
Student Grade Report
====================

Student: John
Subject: Mathematics
Marks: 88
Grade: B
Feedback: Very good! Above average performance.

Student: Emily
Subject: Mathematics
Marks: 92
Grade: A
Feedback: Excellent! Outstanding performance.

...

Class Statistics
---------------
Average Mark: 75.70
Highest Mark: 95.0
Lowest Mark: 42.0

Grade Distribution
-----------------
A: 2
B: 2
C: 3
D: 1
F: 2
Invalid: 0

レポートファイルの確認

生成されたレポートファイルも確認できます。

cat /home/labex/project/grade_report.txt

ファイルには、コンソールに表示されたものと同じ内容が含まれているはずです。

完全なアプリケーションの理解

作成した完全な成績評価アプリケーションは、いくつかの重要なプログラミング概念を示しています。

  1. ファイル I/O (File I/O): ファイルからのデータの読み取りとファイルへのデータの書き込み
  2. データ処理 (Data Processing): 生データの変換と分析
  3. 統計計算 (Statistics Calculation): 平均の計算と最小値/最大値の検索
  4. エラー処理 (Error Handling): ファイル操作中の潜在的なエラーの管理
  5. 出力のフォーマット (Formatting Output): 構造化され、読みやすいレポートの作成

このアプリケーションは、成績評価システムの現実的なユースケースを表しており、Python の if-elif-else ステートメントを教育現場の実用的な問題の解決にどのように適用できるかを示しています。

まとめ

このチュートリアルでは、Python の if-elif-else ステートメントを使用して、包括的な成績評価システムを正常に構築しました。基本的な条件文から始めて、エッジケースの処理、パーソナライズされたフィードバックの提供、実際の学生データの処理を行うように、プログラムを段階的に強化しました。

開発した主なスキルは次のとおりです。

  1. if-elif-else ステートメントを使用した意思決定ロジックの実装
  2. ユーザー入力の検証とエラーの適切な処理
  3. 条件に基づいた意味のあるフィードバックの提供
  4. ファイルからのデータの処理とレポートの生成
  5. データセットからの統計の計算

これらのスキルは、多くのプログラミングタスクの基本であり、成績評価システム以外にも、さまざまな現実世界のシナリオに適用できます。学習した条件ロジックの原則は、今後の Python プロジェクトにおける、より複雑なプログラムの構成要素として役立ちます。

優れたプログラミングプラクティスには、以下が含まれることを忘れないでください。

  • 明確で説明的な変数名と関数名
  • 適切なエラー処理
  • 構造化され、整理されたコード
  • 役立つコメントとドキュメント

この成績評価システムを拡張したり、学習した内容を新しいプログラミングチャレンジに適用したりして、練習を続けてください!