2016-05-03 7 views
1

Я новичок в Python, принимая мой первый класс в этом прямо сейчас, только около 4 недель.Использование функций для нескольких входов [Python]

Назначение заключается в вычислении среднего тест и отображение класса для каждого тест введен.

Часть задания заключается в использовании функции для вычисления среднего значения, а также при определении того, для какой марки письма присваивается каждый балл.

Как я понимаю, функции должны помочь сократить глобальные переменные.

Мой вопрос:Как сгустить этот код?

Я не знаю, как использовать функцию для определения класса письма, а затем отображать это, не создавая глобальную переменную для каждого класса, который был введен.

Если вы заметили избыточность в моем коде, я был бы признателен за хедз-ап и небольшой урок о том, как это вырезать. Я уже чую раскрывающиеся метки я получу, если я включаю это как есть ...

def main(): 



    grade1=float(input("Enter score (0-100):")) 
    while (grade1 <0 or grade1 >100): 
     if grade1 <0 or grade1 >100: 
      print("Please enter a valid grade") 
      grade1=float(input("Enter score (0-100):")) 


    grade2=float(input("Enter score (0-100):")) 
    while (grade2 <0 or grade2 >100): 
     if grade2 <0 or grade2 >100: 
      print("Please enter a valid grade") 
      grade2=float(input("Enter score (0-100):")) 


    grade3=float(input("Enter score (0-100):")) 
    while (grade3 <0 or grade3 >100): 
     if grade3 <0 or grade3 >100: 
      print("Please enter a valid grade") 
      grade3=float(input("Enter score (0-100):")) 

    grade4=float(input("Enter score (0-100):")) 
    while (grade4 <0 or grade4 >100): 
     if grade4 <0 or grade4 >100: 
      print("Please enter a valid grade") 
      grade4=float(input("Enter score (0-100):")) 

    grade5=float(input("Enter score (0-100):")) 
    while (grade5 <0 or grade5 >100): 
     if grade5 <0 or grade5 >100: 
      print("Please enter a valid grade") 
      grade5=float(input("Enter score (0-100):")) 

    total=grade1+grade2+grade3+grade4+grade5 
    testAverage=calcAverage(total) 
    eachGrade1=determineGrade(grade1) 
    eachGrade2=determineGrade(grade2) 
    eachGrade3=determineGrade(grade3) 
    eachGrade4=determineGrade(grade4) 
    eachGrade5=determineGrade(grade5) 

    print("\nTest #1 grade:", (eachGrade1)) 
    print("Test #2 grade:", (eachGrade2)) 
    print("Test #3 grade:", (eachGrade3)) 
    print("Test #4 grade:", (eachGrade4)) 
    print("Test #5 grade:", (eachGrade5)) 
    print("\nTest average:", (testAverage),("%")) 


def calcAverage(total): 
    average=total/5 
    return average 


def determineGrade(grade): 
    if grade >=90: 
     return "A" 
    elif grade >=80: 
     return "B" 
    elif grade >=70: 
     return "C" 
    elif grade >=60: 
     return "D" 
    else: 
     return "F" 
+0

Правило # 1 кодирования, никогда не копировать и вставлять. Всякий раз, когда вы копируете и вставляете, это действительно функция. – Kurt

+0

Боюсь, я не понимаю, о чем вы говорите? –

+0

Возможно, вам захочется внимательно ознакомиться с материалами курса, касающимися этого задания. Он, вероятно, обсуждает такие темы, как функции, возвращаемые значения и списки. – TigerhawkT3

ответ

1

Я не буду реорганизовать весь код, но вот несколько советов:

Прежде всего, вам нужна функция, чтобы получить пользовательский ввод, назовем его get_score. Я не буду вдаваться в подробности здесь, потому что есть отличный ресурс о том, как написать функцию для этого здесь: Asking the user for input until they give a valid response. Эта функция должна возвращать float или integer, поэтому не забывайте, что input (при условии, что вы используете Python 3) возвращает строку, которую вы должны использовать для int или float вручную.

Чтобы получить список n оценки, я предлагаю функцию:

def get_n_scores(n): 
    return [get_score() for _ in range(n)] 

Материал в квадратных скобках список понимание и эквивалентно:

scores = [] 
for _ in range(n): 
    scores.append(get_score()) 

Используйте этот код вместо этого, если вам не комфортно с пониманием (не забудьте вернуть result).

Имя переменной _ обычно используется для указания временного значения, которое не используется (кроме итерации).

Вы можете избежать объявления grade1 ... grade5 по телефону all_scores = get_n_scores(5), который вернет список с пользовательским вводом. Помните, что индексирование основано на нуле, поэтому вы сможете получить доступ к all_scores[0] ... all_scores[4].

Вместо жесткого кодирования total, вы можете просто применить встроенный в sum функции: total = sum(all_scores), предполагая, что all_scores имеет целые или поплавки.

Наконец, вы можете определить оценку для каждого балла, применив вашу функцию determineGrade к каждому результату в all_scores.Опять же, вы можете использовать понимание:

all_grades = [determineGrade(score) for score in all_scores] 

или традиционное:

all_grades = [] 
for score in all_scores: 
    all_grades.append(determineGrade(score)) 

Другой материал выглядит хорошо, за исключением того, что для того, чтобы напечатать класс вы можете просто цикл по all_grades и распечатать детали , Это зависит от вас, если вы хотите написать дополнительные функции, которые обертывают пару отдельных вызовов функций, которые мы делаем.

В общем, всегда избегайте repeating yourself, вместо этого напишите функцию.

+0

Спасибо, что нашли время, чтобы написать все. Приступая к повторному исполнению всего, пользуясь советами и более подходящим образом использовать функции. –

+0

Не забывайте, что среднее значение всех чисел в списке - 'average = sum (my_list)/len (my_list)', вам также не нужно жестко кодировать длину. –

+0

@ByteCommander Действительно, 'calcaverage' должен принимать два аргумента (если вы хотите использовать эту функцию вообще). Я пропустил это. – timgeb

0

Я напишу, как показано ниже:

def get_grade(): 
    while(True): 
     grade = float(input("Enter score (0-100):")) 
     if grade >= 0 and grade <= 100: 
      return grade 
     print("Please enter a valid grade!") 

def get_average(sum_val, counter): 
    return sum_val/counter 


def determine_grade(grade): 
    if grade >=90: 
     return "A" 
    elif grade >=80: 
     return "B" 
    elif grade >=70: 
     return "C" 
    elif grade >=60: 
     return "D" 
    else: 
     return "F" 

test_num = 5 
sum_val = 0 
result = {} 

for i in range(test_num): 
    grade = get_grade() 
    result[i] = determine_grade(grade) 
    sum_val += grade 

for key in result: 
    print ("Test %d Grade is %s" % (key+1, result[key])) 
avg = get_average(sum_val, test_num) 
print ("Average is %d" % avg) 

работает так:

>>> ================================ RESTART ================================ 
>>> 
Enter score (0-100):89 
Enter score (0-100):34 
Enter score (0-100):348 
Please enter a valid grade! 
Enter score (0-100):34 
Enter score (0-100):90 
Enter score (0-100):85 
Test 1 Grade is B 
Test 2 Grade is F 
Test 3 Grade is F 
Test 4 Grade is A 
Test 5 Grade is B 
Average is 66 
>>> 
+0

Спасибо, что нашли время написать. Я считаю, что вы использовали ряд вещей, которые мне еще предстоит изучить (я очень новый). Но я намерен принять это и сделать третичную страницу того же кода, используя ваши методы, чтобы что-то узнать. –

+0

@ ZacharyMcCauley Добро пожаловать. Google для 'for loop в Python',' словаря в Python' и 'отформатированной печати в Python'. Это все, что вам нужно для этой программы. Желаем вам успеха. – EbraHim

+0

Преобразование 'float' внутри' getAverage (...) 'является излишним. Кроме того, соглашения об именах Python - это случай змей (т. Е. Ваши имена функций и переменных должны выглядеть как 'get_average' вместо этого). Кроме того, вы можете опустить переменную 'counter', потому что, когда вы ее используете, ее значение определяется как' Test_num'. –

Смежные вопросы