I wrote a "gradebook" program.  This takes in grades for various assignments. The assignments types are weighted differently and final grade is computed at the end.  The code works but I can't help but think I am being ham handed in my approach. Should I be using a dictionary instead of storing things like `hw_final`, `lab_final`, and `exam_final` as global variables?

    hw_tally = 0
    hw_weight_count = 0
    hw_final = 0
    lab_tally = 0
    lab_weight_count = 0
    lab_final = 0
    exam_tally = 0
    exam_weight_count = 0
    exam_final = 0


    def assignment(kind, grade, weight=1):
        global hw_tally, hw_weight_count, hw_final, lab_tally, lab_weight_count, lab_final, exam_tally, exam_weight_count, exam_final
        if kind == 'hw':
            hw_weight_count += weight
            hw_temporary = (grade * weight)     
            hw_tally += hw_temporary
            hw_final = hw_tally/hw_weight_count
        elif kind == 'lab':
            lab_weight_count += weight
            lab_temporary = (grade * weight)     
            lab_tally += lab_temporary
            lab_final = lab_tally/lab_weight_count
        elif kind == 'exam':
            exam_weight_count += weight
            exam_temporary = (grade * weight)   
            exam_tally += exam_temporary
            exam_final = exam_tally/exam_weight_count


    assignment('hw', 81)
    assignment('exam', 90, 4)
    assignment('hw', 100, 2)
    assignment('lab', 84, 3)
    assignment('lab', 90, 2)
    assignment('exam', 78)
    assignment('exam', 85)
    assignment('lab', 88)
    assignment('exam', 75)

    hw_weight_percent = 0.4
    lab_weight_percent = 0.1
    exam_weight_percent = 0.5

    final_grade = ((hw_final * hw_weight_percent) + (lab_final * 
    lab_weight_percent) + (exam_final * exam_weight_percent))
    print ("Final grade = ", final_grade)