web-dev-qa-db-fra.com

Comment puis-je simplifier les instructions if-Elif répétitives dans ma fonction de système de notation?

L'objectif est de créer un programme pour convertir les scores d'un système `` 0 à 1 '' en un système `` F à A '':

  • Si score >= 0.9 afficherait "A"
  • Si score >= 0.8 afficherait "B"
  • 0,7, C
  • 0,6, D
  • Et toute valeur inférieure à ce point, imprimez F

C'est la façon de le construire et cela fonctionne sur le programme, mais c'est un peu répétitif:

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')

Je voudrais savoir s'il existe un moyen de construire une fonction afin que les instructions composées ne soient pas aussi répétitives.

Je suis un débutant total, mais je voudrais quelque chose du genre:

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

être possible?

L'intention ici est que plus tard, nous pourrons l'appeler en ne passant que scr, numbergrade et letter grade comme arguments:

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')

S'il était possible de passer moins d'arguments, ce serait encore mieux.

20

Vous pouvez utiliser un dict.

Code

def grade(score):
    """Return a letter grade."""
    grades = {100: "A", 90: "A", 80: "B", 70: "C", 60: "D"}
    return grades.get((score // 10) * 10, "F")

Démo

[grade(scr) for scr in [100, 33, 95, 61, 77, 90, 89]]

# ['A', 'F', 'A', 'D', 'C', 'A', 'B']

Si les scores sont en fait entre 0 et 1, multipliez d'abord par 100, puis recherchez le score.

0
pylang

Voici quelques approches plus succinctes et moins compréhensibles:

La première solution nécessite l'utilisation de la fonction floor de la bibliothèque math.

from math import floor
def grade(mark):
    return ["D", "C", "B", "A"][min(floor(10 * mark - 6), 3)] if mark >= 0.6 else "F"

Et si pour une raison quelconque, importer la bibliothèque math vous dérange. Vous pouvez utiliser une solution de contournement pour la fonction de sol:

def grade(mark):
    return ["D", "C", "B", "A"][min(int(10 * mark - 6) // 1, 3)] if mark >= 0.6 else "F"

Ceux-ci sont un peu compliqués et je vous déconseille de les utiliser à moins que vous ne compreniez ce qui se passe. Ce sont des solutions spécifiques qui tirent parti du fait que les incréments de notes sont de 0,1, ce qui signifie que l'utilisation d'un incrément autre que 0,1 ne fonctionnerait probablement pas avec cette technique. Il n'a pas non plus d'interface simple pour mapper les notes aux notes. Une solution plus générale comme celle de dawg utilisant la bissectrice est probablement plus appropriée ou la solution très propre de schwobaseggl. Je ne sais pas vraiment pourquoi je poste cette réponse, mais c'est juste une tentative de résoudre le problème sans aucune bibliothèque (je n'essaye pas de dire que l'utilisation de bibliothèques est mauvaise) en une seule ligne démontrant la nature polyvalente de python.

0
Fizzlebert

J'espère que la suite pourrait aider: si scr> = 0.9: print ('A') Elif 0.9> scr> = 0.8: print ('B') Elif 0.8> scr> = 0.7: Print ('C') Elif 0.7 scr> = 0.6: imprimer ('D') sinon: imprimer ('F')

0
Amanda