使用 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。如果是,它将打印“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 循环来遍历每个分数,获取其等级,并打印结果

这个基本的评分系统对于标准情况来说效果很好,但是对于边缘情况呢?在下一步中,我们将改进我们的系统以处理这些情况。

在我们的评分系统中处理边缘情况

我们基本的评分系统可以工作,但它没有考虑到边缘情况,例如:

  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. 错误处理:我们将代码包装在一个 try-except 块中,以捕获在提供非数字输入时发生的 ValueError 异常

  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:从文件读取数据和向文件写入数据
  2. 数据处理:转换和分析原始数据
  3. 统计计算:计算平均值并找到最小值/最大值
  4. 错误处理:在文件操作期间管理潜在错误
  5. 格式化输出:创建结构良好、可读的报告

此应用程序代表了我们的评分系统在现实世界中的一个用例,展示了 Python 的 if-elif-else 语句如何应用于解决教育环境中的实际问题。

总结

在本教程中,你已经成功地使用 Python 的 if-elif-else 语句构建了一个综合的评分系统。从基本的条件语句开始,你逐步增强了你的程序,以处理边缘情况,提供个性化的反馈,并处理真实的学生数据。

以下是你已经掌握的关键技能:

  1. 使用 if-elif-else 语句来实现决策逻辑
  2. 验证用户输入并优雅地处理错误
  3. 根据条件提供有意义的反馈
  4. 处理来自文件的数据并生成报告
  5. 从数据集计算统计数据

这些技能是许多编程任务的基础,并且可以应用于评分系统之外的各种现实世界场景。你所学习的条件逻辑原则将作为你未来 Python 项目中更复杂程序的构建模块。

请记住,良好的编程实践包括:

  • 清晰、描述性的变量和函数名称
  • 适当的错误处理
  • 结构良好且组织有序的代码
  • 有用的注释和文档

继续练习,通过扩展这个评分系统或将你所学到的知识应用于新的编程挑战!