Как определить оценку на основе баллов с использованием Python if-elif-else

PythonBeginner
Практиковаться сейчас

Введение

Этот учебник проведет вас через процесс реализации системы оценивания с использованием операторов if-elif-else в Python. Вы узнаете, как определить оценку студента на основе его баллов, что является распространенной задачей в образовательных учреждениях. К концу этого учебника вы создадите функциональную программу оценивания, которую можно будет применять в реальных сценариях. Этот практический подход укрепит ваше понимание условных операторов в Python, которые являются фундаментальными строительными блоками для более сложной логики программирования.

Понимание условных операторов Python

Прежде чем мы создадим нашу систему оценивания, давайте разберемся с основными условными операторами в Python. Условные операторы позволяют вашей программе принимать решения на основе определенных условий.

Создание вашего первого файла Python

Давайте начнем с создания нового файла Python:

  1. В WebIDE щелкните меню "File" в верхнем левом углу.
  2. Выберите "New File" (Новый файл).
  3. Сохраните файл как conditional_demo.py в каталоге /home/labex/project.

Базовый оператор 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 или выше. Если да, она выводит "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. Мы определили функцию get_grade(), которая принимает один параметр: marks (баллы).
  2. Внутри функции мы использовали операторы if-elif-else для проверки баллов по разным пороговым значениям оценок.
  3. Мы создали список тестовых баллов, чтобы продемонстрировать, как функция работает с разными значениями.
  4. Мы использовали цикл for для перебора каждого балла, получения его оценки и вывода результата.

Эта базовая система оценивания хорошо работает для стандартных случаев, но как насчет крайних случаев (edge cases)? На следующем шаге мы улучшим нашу систему, чтобы обрабатывать их.

Обработка крайних случаев в нашей системе оценивания

Наша базовая система оценивания работает, но она не учитывает крайние случаи, такие как:

  1. Недопустимые входные данные (баллы меньше 0 или больше 100)
  2. Нечисловые входные данные

Давайте улучшим нашу систему оценивания, чтобы справиться с этими сценариями.

Обновление системы оценивания

Создайте новый файл с именем improved_grading.py в каталоге /home/labex/project со следующим кодом:

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. Обработка ошибок: Мы заключили наш код в блок try-except, чтобы перехватывать исключения ValueError, которые возникают при предоставлении нечисловых входных данных.

  4. Подробные сообщения об ошибках: Мы возвращаем конкретные сообщения об ошибках, чтобы сообщить пользователю, что пошло не так, вместо простого возврата кода ошибки.

Эти улучшения делают нашу систему оценивания более надежной, корректно обрабатывая различные крайние случаи. Теперь программа предоставляет полезную обратную связь при обнаружении недопустимых входных данных, а не аварийно завершается или выдает неверные результаты.

Улучшение системы оценивания с сообщениями обратной связи

Давайте еще больше улучшим нашу систему оценивания, добавив персонализированные сообщения обратной связи для каждой оценки. Это делает систему более информативной и удобной для пользователя.

Создание улучшенной системы оценивания

Создайте новый файл с именем enhanced_grading.py в каталоге /home/labex/project:

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. Корректная обработка ошибок: Система по-прежнему корректно обрабатывает недопустимые входные данные, но теперь представляет ошибки в удобном для пользователя формате.

Эти улучшения делают нашу систему оценивания более практичной для реального использования. Персонализированная обратная связь помогает студентам понять свою успеваемость, а форматированный отчет обеспечивает профессиональное представление результатов.

Применение системы оценивания к реальному набору данных

Теперь давайте применим нашу систему оценивания к более реалистичному сценарию. Мы создадим программу, которая считывает данные о студентах из файла, вычисляет оценки и записывает подробный отчет.

Создание образца набора данных

Сначала давайте создадим файл с образцом данных о студентах. Создайте новый файл с именем student_data.csv в каталоге /home/labex/project со следующим содержимым:

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

Создание полного приложения для оценивания

Теперь создайте новый файл с именем grading_application.py в каталоге /home/labex/project:

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. Ввод/вывод файлов (File I/O): Чтение данных из файлов и запись данных в файлы
  2. Обработка данных (Data Processing): Преобразование и анализ необработанных данных
  3. Вычисление статистики (Statistics Calculation): Вычисление средних значений и поиск минимальных/максимальных значений
  4. Обработка ошибок (Error Handling): Управление потенциальными ошибками во время операций с файлами
  5. Форматирование вывода (Formatting Output): Создание хорошо структурированного, читаемого отчета

Это приложение представляет собой реальный пример использования нашей системы оценивания, показывающий, как операторы if-elif-else в Python могут быть применены для решения практических задач в образовательных учреждениях.

Резюме

В этом руководстве вы успешно создали комплексную систему оценивания, используя операторы if-elif-else в Python. Начиная с базовых условных операторов, вы постепенно улучшили свою программу, чтобы обрабатывать крайние случаи, предоставлять персонализированную обратную связь и обрабатывать реальные данные о студентах.

Вот основные навыки, которые вы развили:

  1. Использование операторов if-elif-else для реализации логики принятия решений
  2. Проверка пользовательского ввода и корректная обработка ошибок
  3. Предоставление содержательной обратной связи на основе условий
  4. Обработка данных из файлов и создание отчетов
  5. Вычисление статистики из набора данных

Эти навыки являются основополагающими для многих задач программирования и могут быть применены к различным реальным сценариям, выходящим за рамки систем оценивания. Принципы условной логики, которые вы изучили, послужат строительными блоками для более сложных программ в ваших будущих проектах на Python.

Помните, что хорошие методы программирования включают в себя:

  • Ясные, описательные имена переменных и функций
  • Правильную обработку ошибок
  • Хорошо структурированный и организованный код
  • Полезные комментарии и документацию

Продолжайте практиковаться, расширяя эту систему оценивания или применяя полученные знания к новым задачам программирования!