在Python中循环以减少重复

在Python中循环以减少重复,python,python-3.x,Python,Python 3.x,我有一个包含学生分数的文本文件,格式如下: 7,5,10,25,32 9,15,25,39,18 等 上面根据位置(1、2、3、4或5)对标记进行分组,然后有一个例程“编写”直方图以显示标记的分布。我写的东西非常笨拙和重复,但我无法找出循环函数来传递数据,这些数据按每个问题的分数分组,然后是直方图中每个范围的数字。有人能帮我解释一下逻辑吗。你知道你可以把参数传递给你的函数,对吗?五个打开标记[1-5]功能可以概括如下: def open_marks(): N = (int(input('

我有一个包含学生分数的文本文件,格式如下: 7,5,10,25,32 9,15,25,39,18 等
上面根据位置(1、2、3、4或5)对标记进行分组,然后有一个例程“编写”直方图以显示标记的分布。我写的东西非常笨拙和重复,但我无法找出循环函数来传递数据,这些数据按每个问题的分数分组,然后是直方图中每个范围的数字。有人能帮我解释一下逻辑吗。

你知道你可以把参数传递给你的函数,对吗?五个
打开标记[1-5]
功能可以概括如下:

def open_marks():
    N = (int(input('how many students? '))* 5)
    students = []
    for line in open('marks.txt').readlines():
       datafile = (line.strip().split('\t')[0].split(','))  
       for n in datafile:
          students.append(int(n))
    students=students[:N]
    return students
def open_marks1():
    students = open_marks()
    students1=students[0::5]#set to return only the first(lowest) marks drawn
    return students1
def open_marks2():
    students = open_marks()
    students2=students[1::5]#set to return only the second marks drawn
    return students2
def open_marks3():
    students = open_marks()
    students3=students[2::5]#set to return only the third marks drawn
    return students3
def open_marks4():
    students = open_marks()
    students4=students[3::5]#set to return only the fourth marks drawn
    return students4
def open_marks5():
    students = open_marks()
    students5=students[4::5]#set to return only the fifth(highest) marks drawn
    return students5


def count_ranges_one():

    students1 = open_marks1()
    print('first number: ',students1)
    range_counts1 = [0] * 12
    for num in students1[:]:#change number to select number of draws
        which_range=int(num//5)
        range_counts1[which_range] = range_counts1[which_range] + 1
    return range_counts1
def count_ranges_two():
    students2 = open_marks2()
    print('second number: ',students2)
    range_counts2 = [0] * 12
    for num in students2[:]:#change number to select number of draws
        which_range=int(num//5)
        range_counts2[which_range] = range_counts2[which_range] + 1
    return range_counts2
def count_ranges_three():
    students3 = open_marks3()
    print('third number: ',students3)
    range_counts3 = [0] * 12
    for num in students3[:]:#change number to select number of draws
        which_range=int(num//5)
        range_counts3[which_range] = range_counts3[which_range] + 1
    return range_counts3
def count_ranges_four():
    students4 = open_marks4()
    print('fourth number: ',students4)
    range_counts4 = [0] * 12
    for num in students4[:]:#change number to select number of draws
        which_range=int(num//5)
        range_counts4[which_range] = range_counts4[which_range] + 1
    return range_counts4
def count_ranges_five():
    students5 = open_marks5()
    print('fifth number: ',students5)
    range_counts5 = [0] * 12
    for num in students5[:]:#change number to select number of draws
        which_range=int(num//5)
        range_counts5[which_range] = range_counts5[which_range] + 1
    return range_counts5
如果您现在将例如3传递给该函数,您将获得与旧open_marks3函数相同的结果:

def open_marks_for_student(n):
    students = open_marks()
    return students[n-1::5]
同样的原理也适用于
count\u ranges
函数,只需编写一个广义函数并将标记作为参数传递即可:

open_marks_for_student(3)
现在像这样使用它:

def count_ranges(marks):
    range_counts = [0] * 12
    for num in marks[:]: #change number to select number of draws
        which_range=int(num//5)
        range_counts[which_range] = range_counts1[which_range] + 1
    return range_counts

仍然可以进行一些优化,例如,只打开标记文件一次,而不是每个学生打开一次,或者在
count\u ranges
中删除循环中
marks
的切片(如果您计划修改循环中的原始列表,则只需迭代副本),但这应该足以让您开始。

非常感谢。我会仔细考虑你的建议,并试着按照你的建议去做。出现的问题是,当打开IDLE时,系统会询问学生人数,在键入get_range_counts()后,程序会再询问五次此信息,然后给出正确的回答。这显然是因为函数调用open_标记五次。这是我无法改变的
def get_range_counts():
    range_counts = []
    student_nums = [1,2,3,4,5] #or range(1,6)
    for n in student_nums:
        marks = open_marks_for_student(n)
        range_counts.append(count_ranges(marks)) #create histogram, append to list
    return range_counts