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

Примечание

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

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

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

№4.5.1

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

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

  • устраните дублирование кода при выводе списка объектов, используя циклы;

  • добавьте меню с пунктами:

    • список объектов;

    • фильтр по атрибуту (одному или нескольким) объекта;

    • средний показатель по атрибуту объекта.

  • перенесите вывод списка объектов в соответствующий пункт меню и реализуйте два новых.

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