Python 3.x 函数中的For循环

Python 3.x 函数中的For循环,python-3.x,list,function,loops,for-loop,Python 3.x,List,Function,Loops,For Loop,我目前正在上一门关于python的短期课程,在完成作业时遇到了一些麻烦 任务是创建一个函数,该函数将名称和分数列表(例如[Student 1、35、Student 2、78]等)作为参数,并根据评分方案输出分数 我有工作代码,但我觉得这不是很令人满意的问题。我定义了一个函数,该函数确定等级,然后使用for循环调用该函数并将其应用于列表中的每个项目。我觉得有一个更优雅的解决方案,函数正在执行循环,但我正在努力让它工作。我相信这与函数中的变量是局部变量而不是全局变量有关 data = ["

我目前正在上一门关于python的短期课程,在完成作业时遇到了一些麻烦

任务是创建一个函数,该函数将名称和分数列表(例如[Student 1、35、Student 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))


 
data=[“Fozzie”,34,“Kermit”,78,“Piggy小姐”,23,“Gonzo”,55,“烧杯”,88,“蜜露”,59,“动物”,10,“Rowlf”,54]
def分配等级(来源):
学生姓名=str(来源[学生])
分数=整数(来源[学生+1])
等级=str(“”)
如果标记<40:
grade=“失败”
elif标记<60:
grade=“通过”
elif标记<70:
grade=“优点”
elif标记>=70:
grade=“优异”
其他:
grade=“错误”
返回(“----------------------------------------------------”
+“\n学生姓名:”
+str(学生姓名)
+“\n标记:”
+str(标记)
+“\n等级:”+str(等级)
+“\n------------------------------------------”)
对于范围(0,len(数据),2)内的学生:
打印(分配成绩(数据))

我不确定这是更简洁还是更神秘,但它使用的代码更少,没有全局变量

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
---------------------------------------------
.......

Mark:-37465可能会出错。。。但是将会失败我们看不到数据是什么样子,不知道你的代码是否做了它应该做的事情尝试传递参数而不是使用全局变量,函数应该返回结果,而不是修改它们。另外,对列表进行预处理以获取(名称、标记)而不是列表中的交替类型,这是一个错误PronethOK you for you speedy responses,我已经编辑了代码以包含一小部分数据。我只学了几周python,所以我对这方面很陌生。除了将结果添加到新列表之外,我不认为该函数正在修改任何内容,为了清晰起见,我现在删除了它。感谢您的回复,我喜欢使用列表定义一组标准的想法,我没有考虑到可以这样做。我写的版本的主要问题是函数中没有循环,对我来说,这似乎是作弊,因为这个问题要求我专门写一个以列表为参数的函数。我想我可能把事情复杂化了。