如何简化评分系统函数中重复的ifelif语句?

2024-10-02 20:36:44 发布

您现在位置:Python中文网/ 问答频道 /正文

目标是建立一个程序,将分数从“0到1”系统转换为“F到a”系统:

  • 如果score >= 0.9将打印“A”
  • 如果score >= 0.8将打印“B”
  • 0.7,C
  • 0.6,D
  • 任何低于该点的值,打印F

这是构建它的方法,它在程序中起作用,但它有点重复:

if scr >= 0.9:
    print('A')
elif scr >= 0.8:
    print('B')
elif scr >= 0.7:
    print('C')
elif scr >= 0.6:
    print('D')
else:
    print('F')

我想知道是否有一种方法可以构建一个函数,这样复合语句就不会 重复

我是一个完全的初学者,但我会:

def convertgrade(scr, numgrd, ltrgrd):
    if scr >= numgrd:
        return ltrgrd
    if scr < numgrd:
        return ltrgrd

可能吗

这里的意图是,稍后我们可以通过只传递scr、numbergrade和letter grade作为参数来调用它:

convertgrade(scr, 0.9, 'A')
convertgrade(scr, 0.8, 'B')
convertgrade(scr, 0.7, 'C')
convertgrade(scr, 0.6, 'D')
convertgrade(scr, 0.6, 'F')

如果可以通过更少的论点,那就更好了


Tags: 方法程序目标returnif系统else分数
3条回答

您可以按照以下思路做一些事情:

# if used repeatedly, it's better to declare outside of function and reuse
# grades = list(zip('ABCD', (.9, .8, .7, .6)))

def grade(score):
    grades = zip('ABCD', (.9, .8, .7, .6))
    return next((grade for grade, limit in grades if score >= limit), 'F')

>>> grade(1)
'A'
>>> grade(0.85)
'B'
>>> grade(0.55)
'F'

这将使用^{}和生成器上的默认参数,覆盖由^{}创建的分数等级对。它实际上与循环方法完全相同

您可以使用bisect模块执行数字表查找:

from bisect import bisect 

def grade(score, breakpoints=[60, 70, 80, 90], grades='FDCBA'):
     i = bisect(breakpoints, score)
     return grades[i]

>>> [grade(score) for score in [33, 99, 77, 70, 89, 90, 100]]
['F', 'A', 'C', 'C', 'B', 'A', 'A']

您可以为每个等级指定阈值:

grades = {"A": 0.9, "B": 0.8, "C": 0.7, "D": 0.6, "E": 0.5}

def convert_grade(scr):
    for ltrgrd, numgrd in grades.items():
        if scr >= numgrd:
            return ltrgrd
    return "F"

相关问题 更多 >