Цель состоит в том, чтобы создать программу для преобразования баллов из системы «0 в 1» в систему «F в A»:
- Если
score >= 0.9
бы напечатать 'A' - Если
score >= 0.8
бы напечатать 'B' - 0,7, С
- 0,6, Д
- И любое значение ниже этой точки выведите 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')
Если бы было возможно передать меньше аргументов, было бы еще лучше.
python
if-statement
dry
Матеус Безерра Соареш
источник
источник
Ответы:
Вы можете использовать модуль bisect для поиска числовых таблиц:
источник
bisect
, которое я нахожу слишком редким.Вы можете сделать что-то вроде этого:
Используется
next
с аргументом по умолчанию для генератора над парами оценки и оценки, созданнымиzip
. Это практически точный эквивалент вашего цикла подхода.источник
Каждому классу можно присвоить пороговое значение:
источник
sorted(grades.items())
так как не обязательно сортировать dicts.dict
- это излишне тяжелая структура данных, так как важен порядок, и вы в любом случае просматриваете индекс (порядок), а не ключ.grades[int(score*10)/10.0]
, но тогда вы должны использовать вDecimal
качестве плавающих ключей общеизвестно плохое поведение.В этом конкретном случае вам не нужны внешние модули или генераторы. Немного базовой математики достаточно (и быстрее)!
источник
Вы можете использовать
np.select
библиотеку numpy для нескольких условий:источник
У меня есть простая идея, чтобы решить это:
Сейчас же,
источник
Вы могли бы использовать
numpy.searchsorted
, что дополнительно дает вам этот хороший вариант обработки нескольких баллов за один вызов:источник
Вы предоставили простой случай. Однако, если ваша логика усложняется, вам может понадобиться механизм правил для управления хаосом.
Вы можете попробовать движок правил Sauron или найти некоторые движки правил Python от PYPI.
источник
источник
Вы также можете использовать рекурсивный подход:
источник
Вот несколько более кратких и менее понятных подходов:
Первое решение требует использования функции пола из
math
библиотеки.И если по какой-то причине импорт
math
библиотеки беспокоит вас. Вы можете использовать обходной путь для функции пола:Это немного сложно, и я бы советовал не использовать их, если вы не понимаете, что происходит. Это конкретные решения, в которых используется тот факт, что приращения в оценках равны 0,1, что означает, что использование приращения, отличного от 0,1, вероятно, не будет работать с использованием этой техники. Он также не имеет простого интерфейса для сопоставления оценок с оценками. Более общее решение, такое как решение dawg с использованием bisect, вероятно, является более подходящим или очень чистым решением schwobaseggl. Я не совсем уверен, почему я публикую этот ответ, но это просто попытка решить проблему без каких-либо библиотек (я не пытаюсь сказать, что использование библиотек плохо) в одну строку, демонстрируя универсальность Python.
источник
Вы можете использовать диктовку.
Код
демонстрация
Если оценки на самом деле находятся между 0 и 1, сначала умножьте 100, а затем посмотрите результат.
источник
Надеюсь, что может помочь следующее: if 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: печать ( 'D') еще: печать ( 'F')
источник
Вы могли бы иметь список чисел, а затем список оценок, чтобы пойти с ним:
Затем, если вы хотите преобразовать указанную оценку в буквенную оценку, вы можете сделать это:
Тогда ваш окончательный счет будет
"B"
.источник
0.83
до оценки"B"
. Вам нужно будет показать, как добраться от оценки до индексаitem
.