7.2. Практикум

Примечание

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

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

7.2.1. Простая отладка программ

Для задач 7.2.1-7.2.5 приведено условие задачи и ее решение (ошибочное).

Для каждой задачи:

  • используя визуальный просмотр кода, простое журналирование, проверку PEP8 или отладчик в IDE:

    • разберитесь в алгоритме решения;

    • найдите номера строк, в которых есть ошибки, и укажите их в строке документации;

  • исправьте ошибки, минимально изменив код (как правило, заменив строчку на строчку); ошибки исправляются по ходу программы, сверху вниз.

Пример.

Исходная программа:

"""
Ошибки (номера строк через пробел): !!!
"""


def even_mult(nums):
    """Вернуть произведение четных чисел в списке 'nums'."""
    p = 0
    for item in nums:
        if item % 2 != 0:
            p *= item

    return p

Исправленная программа:

"""
Ошибки (номера строк через пробел): 8 10
"""


def even_mult(nums):
    """Вернуть произведение четных чисел в списке 'nums'."""
    p = 1
    for item in nums:
        if item % 2 == 0:
            p *= item

    return p

№ 7.2.1 - № 7.2.5

7.2.2. Обработка исключений и утверждения

Программы 7.2.6-7.2.11 написаны верно, однако содержат места потенциальных ошибок.

Для каждой задачи:

  • найдите потенциальные источники ошибок (укажите номера строк в строке документации);

  • используя конструкцию try добавьте в код обработку соответствующих исключений.

Пример.

Исходная программа:

"""
Ошибки (номера строк через пробел): !!!
"""


def avg(a, b):
    """Вернуть среднее геометрическое чисел 'a' и 'b'.

    Параметры:
        - a, b (int или float).

    Результат:
        - float.
    """
    return (a * b) ** 0.5


a = float(input("a = "))
b = float(input("b = "))
c = avg(a, b)
print("Среднее геометрическое = {:.2f}".format(c))

Исправленная программа:

"""
Ошибки (номера строк через пробел): 15 18 19
"""


def avg(a, b):
    """Вернуть среднее геометрическое чисел 'a' и 'b'.

    Параметры:
        - a, b (int или float).

    Результат:
        - float.

    Исключения:
        - ValueError: вычисление не возможно.
    """
    if a * b >= 0:
        return (a * b) ** 0.5
    else:
        raise ValueError("Невозможно определить среднее геометрическое "
                         "введенных чисел.")


try:
    a = float(input("a = "))
    b = float(input("b = "))
    c = avg(a, b)
    print("Среднее геометрическое = {:.2f}".format(c))
except ValueError as err:
    print("Ошибка:", err, ". Проверьте введенные числа.")
except Exception as err:
    print("Ошибка:", err)

№ 7.2.6 - № 7.2.11