5.5. Самостоятельная работа

Примечание

При выполнении заданий используйте заготовки решений: -> Репозиторий.

Подробнее: см. Цикл выполнения и защиты заданий.

5.5.1. Комплексная задача

№5.5.1

Продолжите решение задачи № 4.5.1.

Используя результаты предыдущего решения, а также заготовку и Листинг 5.5.1, создайте функции для:

  • печати объекта;

  • «загрузки» базы объектов;

  • действий для каждого пункта меню.

Для каждой функции:

  • продумайте набор входных/выходных параметров, а также результат и типы значений;

  • добавьте строку документации;

  • проверьте отсутствие побочного эффекта (за исключением функции печати объекта).

Листинг 5.5.1 - Пример «перевода» задачи № 4.5.1 на функции
  1# Это пример кода, он может быть произвольно усложнен
  2# в рамках ограничений темы
  3#
  4# Требования:
  5#
  6# Создайте функции для:
  7# * печати объекта;
  8# * "загрузки" базы объектов;
  9# * действий для каждого пункта меню.
 10#
 11# Для каждой функции:
 12#
 13# * продумайте набор входных/выходных параметров,
 14#   а также результат и типы значений;
 15# * добавьте строку документации;
 16# * проверьте отсутствие побочного эффекта
 17#   (за исключением функции печати объекта).
 18
 19
 20# Замените атрибуты словаря и др. на соответствующие своему варианту
 21
 22def load_db():
 23    """Загрузить данные.
 24
 25    Результат: list of dict.
 26    """
 27    db = [
 28        {
 29            "name": "Иванов Иван",
 30            "birthday": "01/12/2000",
 31            "height": 170,
 32            "weight": 70.5,
 33            "car": True,
 34            "languages": ["С++", "Python"]
 35        },
 36
 37        ...
 38    ]
 39    return db
 40
 41
 42def print_employee(item):
 43    """Вывести объект 'item' на экран со всеми атрибутами."""
 44    print("Имя: {}".format(i, item["name"]))
 45
 46    ...
 47
 48
 49def employees_filter(db, lang):
 50    """Вернуть отфильтрованную базу 'db' (список сотрудников), у которых
 51    в качестве языка программирования имеется 'lang'.
 52
 53    Аргументы:
 54        - db (list of dict): база данных;
 55        - lang (str): язык программирования.
 56
 57    Результат:
 58        - (list of dict): отфильтрованная база данных.
 59    """
 60    # res - копия db, с сотрудниками, удовлетворяющими условию по языку
 61    res = []
 62    for item in db:
 63        if lang in item["languages"]:
 64            res.append(item)
 65
 66    return res
 67
 68
 69def employee_employee_avg_height(db, younger_than):
 70    """Вернуть средний рост среди сотрудников 'db', у которых
 71    год рождения не менее 'younger_than'.
 72
 73    Аргументы:
 74        - db (list of dict): база данных;
 75        - younger_than (int): минимальный год рождения.
 76
 77    Результат:
 78        - (float): если такие сотрудники есть;
 79          (None): если таких сотрудников нет.
 80    """
 81
 82    r_sum = 0
 83    r_col = 0
 84    for item in db:
 85        year = int(item["birthday"][-4:])
 86        if year >= younger_than:
 87            r_sum += item["height"]
 88            r_col += 1
 89
 90    if r_col > 0:
 91        return r_sum / r_col
 92
 93
 94db = load_db()
 95while True:
 96
 97    print("\n-----")
 98    print("Меню")
 99    print("-----")
100    print("1. Список сотрудников.")
101    print("2. Фильтр по языку программирования.")
102    print("3. Средний рост сотрудников, моложе указанного г.р.")
103    print("\nВыберите пункт меню или нажмите ENTER для выхода: ", end="")
104
105    answer = input()
106
107    if answer == "1":
108        print("Содержимое базы данных ({}):".format(len(db)))
109        for i, item in enumerate(db, start=1):
110            print("{}.".format(i))
111            print_employee(item)
112
113    elif answer == "2":
114        lang = input("Введите язык программирования: ")
115        # "Нормализация" наименования языка на случай ошибки при вводе
116        lang = lang.capitalize()
117
118        res = employees_filter(db, lang)
119
120        if len(res) > 0:
121            print("Список сотрудников со знанием "
122                  "языка программирования {} ({}):".format(lang, len(res)))
123            for i, item in enumerate(res, start=1):
124                print("{}.".format(i))
125                print_employee(item)
126        else:
127            print("Таких сотрудников нет.")
128
129    elif answer == "3":
130        younger_than = int(input("Введите год рождения сотрудника: "))
131
132        res = employee_employee_avg_height(db, younger_than)
133
134        if res is not None:
135            print("Средний рост сотрудников, {} г.р. и моложе: ({:.1f}) см.".
136                  format(younger_than, res))
137        else:
138            print("Таких сотрудников нет.")
139
140    else:
141        break
142
143
144# --------------
145# Пример вывода:
146#
147# -----
148# Меню
149# -----
150# 1. Список сотрудников.
151# 2. Фильтр по языку программирования.
152# 3. Средний рост сотрудников, моложе указанного г.р.
153#
154# Выберите пункт меню или нажмите ENTER для выхода: 1
155# Содержимое базы данных (3):
156# 1.
157# Имя: Иванов Иван
158# День рождения: 01/12/2000
159# Рост (см.): 170
160# Вес (кг.): 70.5
161# Есть машина: True
162# Языки программирования: ['С++', 'Python']
163# 2.
164# Имя: Сергеев Сергей
165# День рождения: 01/06/2001
166# Рост (см.): 180
167# Вес (кг.): 110.4
168# Есть машина: False
169# Языки программирования: ['Pascal', 'Delphi']
170# 3.
171# Имя: Николаева Мария
172# День рождения: 14/07/1998
173# Рост (см.): 180
174# Вес (кг.): 66.9
175# Есть машина: True
176# Языки программирования: ['C#', 'C++', 'C']
177#
178# -----
179# Меню
180# -----
181# 1. Список сотрудников.
182# 2. Фильтр по языку программирования.
183# 3. Средний рост сотрудников, моложе указанного г.р.
184#
185# Выберите пункт меню или нажмите ENTER для выхода: 2
186# Введите язык программирования: Python
187# Список сотрудников со знанием языка программирования Python (1):
188# 1.
189# Имя: Иванов Иван
190# День рождения: 01/12/2000
191# Рост (см.): 170
192# Вес (кг.): 70.5
193# Есть машина: True
194# Языки программирования: ['С++', 'Python']
195# Результат поиска сохранен в файл.
196#
197# -----
198# Меню
199# -----
200# 1. Список сотрудников.
201# 2. Фильтр по языку программирования.
202# 3. Средний рост сотрудников, моложе указанного г.р.
203#
204# Выберите пункт меню или нажмите ENTER для выхода: 3
205# Введите год рождения сотрудника: 2000
206# Средний рост сотрудников, 2000 г.р. и моложе: (175.0) см.