2015-07-11 24 views
1

scores_on_pretest功能发生故障。功能中的流量控制

如果我输入两个名字,说乔和鲍勃,当脚本达到此功能,它要求的分数问题#1乔,然后问题#1鲍勃,则问题2乔等

我想要做的就是首先为Joe提出所有问题,然后转向Bob。我知道它一定是在错误的地方表达,但似乎无法找到哪一个。

感谢您的任何建议!

students_pretest = [] 

print "First we will collect the student names on the pre-test." 

def student_names_pretest(): 
    while True: 
     name = raw_input("Type in a name or type 'done':") 
     if name == "done": 
      break 
     students_pretest.append(name) 

    students_pretest.sort() 
    print students_pretest 

student_names_pretest() 


pretest_scores = {} 

for name in students_pretest: 
    pretest_scores['%s' % name] = [] 

question_number = int(raw_input("How many questions are on this assessment?: ")) 

def scores_on_pretest(): 
    current_question = 1 
    while current_question <= question_number: 
     for student in pretest_scores: 
      print "Pre-test scores for %s" % student 
      score = int(raw_input("Enter a score for Question #%d: " % current_question)) 
      pretest_scores[student].append(score) 
     current_question =+ current_question + 1 


    print pretest_scores 

scores_on_pretest() 
+0

请将“python”标签添加到您的问题中。 – Bacon

+0

你是否尝试颠倒你的循环顺序?所以你迭代外循环中的学生然后迭代内循环中的问题?另外请注意,当您将学生存储在字典中时,它不会保留您输入学生姓名的顺序。 –

回答

0

您需要更改while和for循环的顺序。这里有一个工作重构你的代码:

students_pretest = [] 

    print "First we will collect the student names on the pre-test." 

    def student_names_pretest(): 
     while True: 
      name = raw_input("Type in a name or type 'done':") 
      if name == "done": 
       break 
      students_pretest.append(name) 

     students_pretest.sort() 
     print students_pretest 

    student_names_pretest() 


    pretest_scores = {} 

    for name in students_pretest: 
     pretest_scores['%s' % name] = [] 

    question_number = int(raw_input("How many questions are on this assessment?: ")) 

    def scores_on_pretest(): 
     current_question = 1 
     for student in pretest_scores: 
      print student 
      while current_question <= question_number: 
       print "Pre-test scores for %s" % student 
       score = int(raw_input("Enter a score for Question #%d: " % current_question)) 
       pretest_scores[student].append(score) 
       current_question =+ current_question + 1 
      current_question = 1                                              

     print pretest_scores 

    scores_on_pretest() 
0

只是颠倒你的两个循环的顺序。因此,您首先迭代学生,然后针对每个问题迭代每个学生。

print("First we will collect the student names on the pre-test.") 

def student_names_pretest(): 
    students_pretest = [] 
    while True: 
     name = raw_input("Type in a name or type 'done':") 
     if name == "done": 
      break 
     students_pretest.append(name) 

    students_pretest.sort() 
    return students_pretest 

def scores_on_pretest(num_questions): 
    pretest_scores = {} 

    for name in students_pretest: 
     pretest_scores[name] = [] 

    for student in pretest_scores: 
     print ("Pre-test scores for %s" % student) 
     for current_question in range(num_questions): 
      score = int(raw_input("Enter a score for Question #%d: " % (current_question + 1))) 
      pretest_scores[student].append(score) 

    return pretest_scores 

if __name__ == '__main__': 
    students_pretest = student_names_pretest() 
    print(students_pretest) 

    num_questions = int(raw_input("How many questions are on this assessment?: ")) 
    pretest_scores = scores_on_pretest(num_questions) 
    print(pretest_scores) 

注意遍历pretest_scoresdict,你会不会让学生早在您输入的顺序,如果该事项?如果是这样,您可以使用collections模块中的OrderedDict

+0

有意义 - 我知道它与订单有关。我对你输入的代码有一个问题。我明白你在改变函数的某些内容和清理东西方面所做的一切。你能否向我解释if _name_ =='_main_“开头的块?这是否引用了一个类? – George

+0

没有什么问题,这不是必须的,它可以被带走并且不会停止它的工作。脚本被用作模块或自包含脚本请参阅[这里](http://stackoverflow.com/questions/419163/what-does-if-name-main-do)的完整解释。看到这个脚本可能有限的重用值作为一个模块,它并没有增加太多的脚本。 –