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
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
# Это пример кода, он может быть произвольно усложнен
# в рамках ограничений темы
#
# Требования:
#
# Создайте функции для:
# * печати объекта;
# * "загрузки" базы объектов;
# * действий для каждого пункта меню.
#
# Для каждой функции:
#
# * продумайте набор входных/выходных параметров,
#   а также результат и типы значений;
# * добавьте строку документации;
# * проверьте отсутствие побочного эффекта
#   (за исключением функции печати объекта).


# Замените атрибуты словаря и др. на соответствующие своему варианту

def load_db():
    """Загрузить данные.

    Результат: list of dict.
    """
    db = [
        {
            "name": "Иванов Иван",
            "birthday": "01/12/2000",
            "height": 170,
            "weight": 70.5,
            "car": True,
            "languages": ["С++", "Python"]
        },

        ...
    ]
    return db


def print_employee(item):
    """Вывести объект 'item' на экран со всеми атрибутами."""
    print("Имя: {}".format(i, item["name"]))

    ...


def employees_filter(db, lang):
    """Вернуть отфильтрованную базу 'db' (список сотрудников), у которых
    в качестве языка программирования имеется 'lang'.

    Аргументы:
        - db (list of dict): база данных;
        - lang (str): язык программирования.

    Результат:
        - (list of dict): отфильтрованная база данных.
    """
    # res - копия db, с сотрудниками, удовлетворяющими условию по языку
    res = []
    for item in db:
        if lang in item["languages"]:
            res.append(item)

    return res


def employee_employee_avg_height(db, younger_than):
    """Вернуть средний рост среди сотрудников 'db', у которых
    год рождения не менее 'younger_than'.

    Аргументы:
        - db (list of dict): база данных;
        - younger_than (int): минимальный год рождения.

    Результат:
        - (float): если такие сотрудники есть;
          (None): если таких сотрудников нет.
    """

    r_sum = 0
    r_col = 0
    for item in db:
        year = int(item["birthday"][-4:])
        if year >= younger_than:
            r_sum += item["height"]
            r_col += 1

    if r_col > 0:
        return r_sum / r_col


db = load_db()
while True:

    print("\n-----")
    print("Меню")
    print("-----")
    print("1. Список сотрудников.")
    print("2. Фильтр по языку программирования.")
    print("3. Средний рост сотрудников, моложе указанного г.р.")
    print("\nВыберите пункт меню или нажмите ENTER для выхода: ", end="")

    answer = input()

    if answer == "1":
        print("Содержимое базы данных ({}):".format(len(db)))
        for i, item in enumerate(db, start=1):
            print("{}.".format(i))
            print_employee(item)

    elif answer == "2":
        lang = input("Введите язык программирования: ")
        # "Нормализация" наименования языка на случай ошибки при вводе
        lang = lang.capitalize()

        res = employees_filter(db, lang)

        if len(res) > 0:
            print("Список сотрудников со знанием "
                  "языка программирования {} ({}):".format(lang, len(res)))
            for i, item in enumerate(res, start=1):
                print("{}.".format(i))
                print_employee(item)
        else:
            print("Таких сотрудников нет.")

    elif answer == "3":
        younger_than = int(input("Введите год рождения сотрудника: "))

        res = employee_employee_avg_height(db, younger_than)

        if res is not None:
            print("Средний рост сотрудников, {} г.р. и моложе: ({:.1f}) см.".
                  format(younger_than, res))
        else:
            print("Таких сотрудников нет.")

    else:
        break


# --------------
# Пример вывода:
#
# -----
# Меню
# -----
# 1. Список сотрудников.
# 2. Фильтр по языку программирования.
# 3. Средний рост сотрудников, моложе указанного г.р.
#
# Выберите пункт меню или нажмите ENTER для выхода: 1
# Содержимое базы данных (3):
# 1.
# Имя: Иванов Иван
# День рождения: 01/12/2000
# Рост (см.): 170
# Вес (кг.): 70.5
# Есть машина: True
# Языки программирования: ['С++', 'Python']
# 2.
# Имя: Сергеев Сергей
# День рождения: 01/06/2001
# Рост (см.): 180
# Вес (кг.): 110.4
# Есть машина: False
# Языки программирования: ['Pascal', 'Delphi']
# 3.
# Имя: Николаева Мария
# День рождения: 14/07/1998
# Рост (см.): 180
# Вес (кг.): 66.9
# Есть машина: True
# Языки программирования: ['C#', 'C++', 'C']
#
# -----
# Меню
# -----
# 1. Список сотрудников.
# 2. Фильтр по языку программирования.
# 3. Средний рост сотрудников, моложе указанного г.р.
#
# Выберите пункт меню или нажмите ENTER для выхода: 2
# Введите язык программирования: Python
# Список сотрудников со знанием языка программирования Python (1):
# 1.
# Имя: Иванов Иван
# День рождения: 01/12/2000
# Рост (см.): 170
# Вес (кг.): 70.5
# Есть машина: True
# Языки программирования: ['С++', 'Python']
# Результат поиска сохранен в файл.
#
# -----
# Меню
# -----
# 1. Список сотрудников.
# 2. Фильтр по языку программирования.
# 3. Средний рост сотрудников, моложе указанного г.р.
#
# Выберите пункт меню или нажмите ENTER для выхода: 3
# Введите год рождения сотрудника: 2000
# Средний рост сотрудников, 2000 г.р. и моложе: (175.0) см.