mirror of
https://github.com/Faridik/Carolyn.git
synced 2026-07-08 05:11:52 +00:00
80 lines
2.7 KiB
Python
80 lines
2.7 KiB
Python
from .student import Student
|
||
|
||
|
||
class StudentNotFound(Exception):
|
||
def __init__(self, message):
|
||
self.message = message
|
||
super().__init__(self.message)
|
||
|
||
|
||
class Group(dict):
|
||
"""Объект "Группа" для работы со списком студентов.
|
||
Используется для работы с множеством студентов.
|
||
"""
|
||
|
||
def __init__(self, group_id: str):
|
||
self._group_id: str = group_id
|
||
self._students: Student = []
|
||
|
||
dict.__init__(
|
||
self,
|
||
group_id=self.group_id,
|
||
students=self._students,
|
||
)
|
||
|
||
def __iter__(self):
|
||
"""Делегирует итератор на список студентов.
|
||
|
||
Так, можно использовать конструкцию
|
||
```python
|
||
for student in group
|
||
```
|
||
"""
|
||
return iter(self._students)
|
||
|
||
@property
|
||
def group_id(self):
|
||
return self._group_id
|
||
|
||
@group_id.setter
|
||
def group_id(self, value):
|
||
self["group_id"] = value
|
||
self._group_id = value
|
||
|
||
def add_student(self, student: Student):
|
||
"""Добавить студента в группу."""
|
||
self._students.append(student)
|
||
|
||
def get_student_by_number(self, number: int) -> Student:
|
||
"""Возвращает студента по его номеру, если номера нет, то поднимает
|
||
ошибку."""
|
||
f = lambda s: number == s.number
|
||
try:
|
||
return next(filter(f, self._students))
|
||
except StopIteration:
|
||
raise StudentNotFound("Не могу найти студента по номеру")
|
||
|
||
def find_students(self, name: str) -> list:
|
||
"""Найти студентов в группе по имени.
|
||
|
||
Возвращает список найденных студентов. Если никого не найдет, вернет
|
||
пустой список.
|
||
|
||
Arguments:
|
||
name (str): текстовое поле, часть имени.
|
||
"""
|
||
|
||
f = lambda s: name.lower() in s.name.lower()
|
||
return list(filter(f, self._students))
|
||
|
||
def top(self, n: int = None) -> list:
|
||
"""Топ N студентов группы по среднему баллу. Возвращает весь список,
|
||
если N не указано."""
|
||
n = len(self._students) if n is None else n
|
||
return sorted(self._students, key=lambda student: student.grade)[:n]
|
||
|
||
def between(self, a: float, b: float) -> list:
|
||
"""Список студентов, у которых оценка между [a, b]."""
|
||
f = lambda student: a < student.average < b
|
||
return list(filter(f, self._students))
|