Модификация функции для возврата разных значений - PullRequest
0 голосов
/ 01 июня 2018

Я должен изменить функцию gp, чтобы она обрабатывала оценки «+» и «-», прибавляя или вычитая 0,3 балла.Например, B + стоит 3,3 балла, а C- составляет 1,7 балла.

Пример.

>>> gp('A-')
3.7

>>>gp('B+')
3.3

Предположение, что я мог бы просто добавить кучу предложений elif для тестирования каждого класса отдельно, но похожий дизайн - использовать вызов s.startswith для определения значения буквенного уровня,затем используйте s.endswith, чтобы увидеть, нужно ли вам прибавлять или вычитать 0,3 балла.

Пока это то, что у меня есть.

def gp(s):
       A = 4
       return A
       B = 3
       return B
       C = 2
       return C
       D = 1
       return D
       F = 0
       return f

Ответы [ 5 ]

0 голосов
/ 01 июня 2018

Другой подход к словарю (хешу).

def gp(s):
    gradhash = {
        "A+": 4.0 + 0.3
        ,"A": 4.0
        ,"A-": 4.0 - 0.3
        ,"B+": 3.0 + 0.3
        ,"B": 3.0
        ,"B-": 3.0 - 0.3
        ,"C+": 2.0 + 0.3
        ,"C": 2.0
        ,"C-": 2.0 - 0.3
        ,"D+": 1.0 + 0.3
        ,"D": 1.0
        ,"D-": 1.0 - 0.3
    }

    return gradhash[s]

print(gp('A-'))
0 голосов
/ 01 июня 2018

Я бы предложил использовать словарь для определения количества баллов, получаемых каждой конкретной оценкой.Использование словаря отчасти похоже на эквивалент Python для оператора switch и обычно считается более идиоматическим, чем длинная цепочка if/elif/else.(Мой ответ предполагает, что вы используете стандартную шкалу расчета 4.0 GPA. Если нет, ее, очевидно, можно изменить в соответствии с вашими потребностями.)

grade_to_points = {
    'A+':   4.0,
    'A':    4.0,
    'A-':   3.7,
    'B+':   3.3,
    'B':    3.0,
    ...
}

def gp(grade):
    points = grade_to_points.get(grade)
    if points is None:
        raise ValueError('{:r} is not a valid grade!'.format(grade))
0 голосов
/ 01 июня 2018

Вы должны использовать словари

def function(grade)
  dict = {'A':4, 'B':3, 'C':2, 'D':1, 'F':0}
  if grade[1] == '+':
    return dict[grade[0]]+0.3
  elif grade[1] == '-':
    return dict[grade[0]] - 0.3

Затем добавить или вычесть 0,3 в зависимости от знака

0 голосов
/ 01 июня 2018

Есть несколько проблем с функцией gp.

Хотя их можно перечислить, я предлагаю вам прочитать следующие ресурсы:

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

grade_dict = dict(zip('ABCDF', (4, 3, 2, 1, 0)))
sign_dict = dict(zip('-+', (-0.3, 0.3)))

def gp(s):

    grade, *sign = s

    if sign:
        return grade_dict[grade] + sign_dict[sign[0]]
    else:
        return grade_dict[grade]

res = gp('A-')  # 3.7

Редактировать : В моем школьном образовании не было GPA, поэтому я этого не понял.Если вам нужно ограничить до 4.0, вы можете использовать эту модификацию:

def gp(s):

    grade, *sign = s

    if sign:
        res = grade_dict[grade] + sign_dict[sign[0]]
    else:
        res = grade_dict[grade]

    return max(res, 4.0)
0 голосов
/ 01 июня 2018

Вместо серии операторов if/elif вы можете хранить числовые значения для оценок и суффиксы в словарях.Кроме того, вам не нужно использовать startswith или endswith, вы можете просто использовать s[0] и s[1], чтобы получить первый или второй символ в строке после проверки длины.Вы также можете использовать s[1:], чтобы получить все, начиная с позиции 1, даже если она пуста.

grades = {'A': 4, 'B': 3, 'C': 2, 'D': 1, 'F': 0}
signs = {'+': 0.3, '-': -0.3, '': 0}
def gp(s):
    return grades[s[0]] + signs[s[1:]]

>>> gp("A+")
4.3
>>> gp("C-")
1.7
>>> gp("F")
0
...