Для-цикла внутри функции

#python-3.x #list #function #loops #for-loop

#python-3.x #Список #функция #циклы #для цикла

Вопрос:

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

Задача состоит в том, чтобы создать функцию, которая принимает список имен и отметок, например, [Студент 1, 35, студент 2, 78] и т.д. в качестве аргумента и выводит оценку на основе схемы маркировки.

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

 data = ["Fozzie", 34, "Kermit", 78, "Miss Piggy", 23, "Gonzo", 55, "Beaker", 88, "Honeydew", 59, "Animal", 10, "Rowlf", 54]

def assign_grades(source):
    student_name = str(source[student])
    mark = int(source[student   1])
    grade = str("")
  
        
    if mark < 40:
        grade = "Fail"
    elif mark < 60:
        grade = "Pass"
    elif mark < 70:
        grade = "Merit"
    elif mark >= 70:
        grade = "Distinction"
    else:
        grade = "Error"


    return("---------------------------------------------"
           "nStudent Name: "
           str(student_name)
            "nMark: "
            str(mark)
            "nGrade: "   str(grade)
           "n---------------------------------------------")


for student in range(0, len(data), 2):
    print(assign_grades(data))


 
  

Комментарии:

1. Отметка: -37465, вероятно, должна перейти к ошибке… но будет сбой

2. мы не видим, как выглядят данные, понятия не имеем, выполняет ли ваш код то, что должен

3. Попробуйте передать аргументы вместо использования глобальных значений, функция должна возвращать результаты, а не изменять их. Также предварительно обработайте список для получения (name, mark) вместо чередования типов в списке, что может привести к ошибкам

4. Спасибо за быстрые ответы, я отредактировал код, чтобы включить небольшой набор данных. Я изучаю python всего пару недель, поэтому я новичок в этом. Я не думаю, что функция изменяет что-либо, кроме добавления результатов в новый список, я удалил это сейчас для ясности

Ответ №1:

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

 def get_marks():
    # get marks from database or user input
    # for testing, just return list
    mks = [("Fozzie", 34), ("Kermit", 78), ("Miss Piggy", 23), ("Gonzo", 55), ("Beaker", 88), ("Honeydew", 59), ("Animal", 10), ("Rowlf", 54)]
    return mks

def assign_grade(mark): # convert mark to grade
    lmts = [(40,'Fail'),(60,'Pass'),(70,'Merit'),(200,'Distinction')] # mark never over 200
    return [x[1] for x in lmts if x[0] >= mark][0]  # return first matching range

marks = get_marks()  # get name/mark data
grades = [assign_grade(m[1]) for m in marks] # pass/fail/...

for g in zip(marks,grades):  # merge name/mark/grade
    print ("---------------------------------------------"
        "nStudent Name: "
        str(g[0][0])
         "nMark: "
         str(g[0][1])
         "nGrade: "   str(g[1])
        "n---------------------------------------------")
          
  

Вывод

 ---------------------------------------------
Student Name: Fozzie
Mark: 34
Grade: Fail
---------------------------------------------
---------------------------------------------
Student Name: Kermit
Mark: 78
Grade: Distinction
---------------------------------------------
.......
  

Комментарии:

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