Как передать список словарей в функцию?
Я работаю над системой оценок учителей на Django. Мне нужна функциональность, в которой есть некоторая запись типа subject id и marks ученика с фронтенда. Мое приложение на бэкенде берет эти два параметра и создает список словарей с subject id и marks и передает его другой функции, и эта функция суммирует все оценки и выдает мне общую сумму, среднее значение, процент и т.д. Но сейчас я застрял только на total, поэтому, когда я передаю этот список словарей в функцию, она выдает ошибку.
class Marks_entry:
def marks_entry(subject_id, marks):
try:
subject_id = int(input(f'Enter subject id: '))
marks=int(input(f'Enter marks: '))
except ValueError:
print(f'You can only try integers:')
marks_entry=[]
marks_entry.append({
"subject_id": subject_id,
"marks": marks
})
marks_calculation = marks_calculation(marks_entry)
return marks_calculation
def marks_calculation(marks_entry):
total = sum(item['marks'] for item in marks_entry)
return total
marks=0
subject_id= 0
b= Marks_entry
b.marks_calculation(marks, subject_id)
ошибка:
Enter subject id: 1003
Enter marks: 58
Traceback (most recent call last):
File "c:\Users\Lenovo\Documents\TGS\controller.py", line 53, in <module>
b.marks_entry(subject_id, marks)
File "c:\Users\Lenovo\Documents\TGS\controller.py", line 43, in marks_entry
marks_calculation = marks_calculation(marks_entry)
UnboundLocalError: local variable 'marks_calculation' referenced before assignment
Есть несколько проблем с вашим классом. Во-первых, поскольку вы использовали b.mark_calculation(), я предполагаю, что вы пытались определить эту функцию внутри класса, что сейчас не правильно! Поэтому вызов ее в классе был бы неправильным. Вы должны вызывать ее так:
class Marks_entry:
def marks_entry(subject_id, marks):
#...
def marks_calculation(marks_entry):
total = sum(item['marks'] for item in marks_entry)
return total
Во-вторых, вы вызвали marks_calculation без ссылки на класс. Если вы пытаетесь вызвать функцию класса, в большинстве случаев следует использовать self, чтобы вызвать функцию объекта прямо в нем самом. Это означает, что ваш код должен выглядеть примерно так:
class Marks_entry:
def marks_entry(subject_id, marks):
# rest of code
marks_calculation = self.marks_calculation(marks_entry)
return marks_calculation
def marks_calculation(self,marks_entry):
total = sum(item['marks'] for item in marks_entry)
return total
В-третьих, вы вызываете класс без (), что кажется неправильным. Вы должны использовать что-то вроде:
# Rest of code
b= Marks_entry()
В-четвертых, я не могу понять ваше намерение использовать b.marks_calculation(marks, subject_id), поскольку вы определили эту функцию для получения только одного аргумента (только marks, а не subject_id). Если вы хотите передать больше переменных в вашу функцию, вы должны определить их в функции перед вызовом функции.
Исходя из вашего нового отредактированного вопроса, существует несколько проблем с вашим текущим кодом -
- Отступы местами неправильные.
- Блок
try/exceptдолжен находиться под циклом while .
- Поскольку вы хотите сначала поместить все записи в блок
marks_entry, вам следует сначала инциализировать его, а затемappendпоместить в него данные. В настоящее время он сбрасывается обратно в[]после каждой новой записи, которую вы получаете. Таким образом, в нем всегда будет не более 1 элемента, когда вы пытаетесь просуммировать его. - Сумма должна быть вычислена в конце, когда вы выйдете из цикла
while.
Вот пример кода, построенного поверх вашего -
def marks_calculation(marks_entry):
total = sum(item['marks'] for item in marks_entry)
return total
class Student_marks:
def entry(subject_id, marks):
marks_entry=[]
while True:
value = input("Need to enter marks, Press 'y' for Yes, 'n' for No: ").lower()
if value == 'n':
break
try:
subject_id = int(input(f'Enter subject id: '))
marks=int(input(f'Enter marks: '))
except ValueError:
print(f'You can only try integers:')
continue
marks_entry.append({
"subject_id": subject_id,
"marks": marks
})
total_marks = marks_calculation(marks_entry)
return total_marks
marks=0
subject_id= 0
b = Student_marks
total = b.entry(marks, subject_id)
print(f'Your total marks are {total}')
Вывод образца:
Need to enter marks, Press 'y' for Yes, 'n' for No: y
Enter subject id: 1
Enter marks: 44
Need to enter marks, Press 'y' for Yes, 'n' for No: y
Enter subject id: 2
Enter marks: 23
Need to enter marks, Press 'y' for Yes, 'n' for No: y
Enter subject id: 3
Enter marks: 12
Need to enter marks, Press 'y' for Yes, 'n' for No: n
Your total marks are 79