Модуль 28. Задача 3. Моделирование

Модуль 28. Задача 3. Моделирование

В проекте по 3D-моделированию используются две фигуры — куб и пирамида. Для моделирования этих фигур используются соответствующие 2D-фигуры, а именно квадрат и треугольник. Вся поверхность 3D-фигуры может храниться в виде списка. Например, для куба это будет [Square, Square, Square, Square, Square, Square].

Модуль 28. Задача 3. Моделирование

Квадрат инициализируется длинами сторон, а треугольник — основанием и высотой. Каждая из 2D-фигур умеет находить свои периметр и площадь, а 3D-фигуры, в свою очередь, могут находить площадь своей поверхности.

Используя входные данные о фигурах и знания математики, реализуйте соответствующие классы и методы. Для базовых классов также реализуйте геттеры и сеттеры.

ЧИТАТЬ ДАЛЕЕ …
Модуль 28. Задача 2. Математический модуль

Модуль 28. Задача 2. Математический модуль

Ирина использует в своей программе очень много различных математических вычислений, связанных с фигурами. Например, нахождение их площадей или периметров. Поэтому, чтобы не захламлять код огромным количеством функций, она решила выделить для них отдельный класс, подключить как модуль и использовать по аналогии с модулем math.

Реализуйте класс MyMath, состоящий как минимум из следующих методов (можете бонусом добавить и другие методы):

  • вычисление длины окружности,
  • вычисление площади окружности,
  • вычисление объёма куба,
  • вычисление площади поверхности сферы.

Пример основного кода:

res_1 = MyMath.circle_len(radius=5)
res_2 = MyMath.circle_sq(radius=6)
print(res_1)
print(res_2)

Результат:

31.41592653589793
113.09733552923255
ЧИТАТЬ ДАЛЕЕ …
Модуль 28. Задача 1. Работа с файлом 2

Модуль 28. Задача 1. Работа с файлом 2

Реализуйте модернизированную версию контекст-менеджера File:

  • теперь при попытке открыть несуществующий файл менеджер автоматически создаёт и открывает этот файл в режиме записи;
  • на выходе из менеджера подавляются все исключения, связанные с файлами.

Решение:

Решение можно скачать с Boosty.to


Как можно отблагодарить:

  • Оформить удобную для вас подписку на Boosty.to
  • Разово поддержать через DonationAlerts
Модуль 27. Задача 5. Счётчик
Модуль 27. Задача 4. Дебаг

Модуль 27. Задача 4. Дебаг

Напишите декоратор debug, который при каждом вызове декорируемой функции выводит её имя (вместе со всеми передаваемыми аргументами), а затем — какое значение она возвращает. После этого выводится результат её выполнения.

Пример декорируемой функции:

def greeting(name, age=None):
    if age:
        return "Ого, {name}! Тебе уже {age} лет, ты быстро растёшь!".format(name=name, age=age)
    else:
        return "Привет, {name}!".format(name=name)

Основной код:

greeting("Том")
greeting("Миша", age=100)
greeting(name="Катя", age=16)

Результат:

Вызывается greeting('Benjamin')
'greeting' вернула значение 'Привет, Том!'
Привет, Том!

Вызывается greeting('Richard', age=100)
'greeting' вернула значение 'Ого, Миша! Тебе уже 100 лет, ты быстро растёшь!'
Ого, Миша! Тебе уже 100 лет, ты вырос!

Вызывается greeting(name='Dorrisile', age=16)
'greeting' вернула значение 'Ого, Катя! Тебе уже 16 лет, ты быстро растёшь!'
Ого, Катя! Тебе уже 16 лет, ты быстро растешь!

Совет: попробуйте самостоятельно изучить функцию repr. Это поможет в решении задачи.

ЧИТАТЬ ДАЛЕЕ …
Модуль 27. Задача 3. Логирование

Модуль 27. Задача 3. Логирование

Реализуйте декоратор logging, который будет отвечать за логирование функций. На экран выводится название функции и её документация. Если во время выполнения декорируемой функции возникла ошибка, то в файл function_errors.log записываются названия функции и ошибки.

Также постарайтесь сделать так, чтобы программа не завершалась после обнаружения первой же ошибки, а обрабатывала все декорируемые функции и сразу записывала все ошибки в файл.

Дополнительно: запишите дату и время возникновения ошибки, используя модуль datetime.

ЧИТАТЬ ДАЛЕЕ …
Модуль 27. Задача 2. Замедление кода

Модуль 27. Задача 2. Замедление кода

В программировании иногда возникает ситуация, когда работу функции нужно замедлить. Типичный пример — функция, которая постоянно проверяет, изменились ли данные на веб-странице или её код.

Реализуйте декоратор, который перед выполнением декорируемой функции ждёт несколько секунд.

ЧИТАТЬ ДАЛЕЕ …
Модуль 27. Задача 1. Как дела?

Модуль 27. Задача 1. Как дела?

Ваня что-то совсем заскучал на работе и решил побаловаться с кодом проекта. Он написал надоедливый декоратор, который при вызове декорируемой функции спрашивает у пользователя «Как дела?», вне зависимости от ответа отвечает что-то вроде «А у меня не очень!» и только потом запускает саму функцию. Правда, после такой выходки его чуть не уволили с работы.

Реализуйте такой же декоратор и проверьте его работу на нескольких функциях.

Пример кода:

@how_are_you
def test():
    print('<Тут что-то происходит...>')

test()

Результат:

Как дела? Хорошо.
А у меня не очень! Ладно, держи свою функцию.
<Тут что-то происходит...>
ЧИТАТЬ ДАЛЕЕ …
Модуль 26. Задача 6. Односвязный список

Модуль 26. Задача 6. Односвязный список

Мы продолжаем тему структур данных и алгоритмов. И в этот раз вам нужно реализовать односвязный список.

Связный список — это структура данных, которая состоит из элементов, называющихся узлами. В узлах хранятся данные, а между собой узлы соединены связями. Связь — это ссылка на следующий или предыдущий элемент списка.

Модуль 26. Задача 6. Односвязный список

В односвязном списке связь — это ссылка только на следующий элемент, то есть в нём можно передвигаться только в сторону конца списка. Узнать адрес предыдущего элемента, опираясь на содержимое текущего узла, невозможно.

Реализуйте такую структуру данных без использования стандартных структур Python (list, dict, tuple и прочие) и дополнительных модулей. Для структуры реализуйте следующие методы:

  • append — добавление элемента в конец списка;
  • get — получение элемента по индексу;
  • remove — удаление элемента по индексу.

Дополнительно: сделайте так, чтобы по списку можно было итерироваться с помощью цикла.

Пример основной программы:

my_list = LinkedList()
my_list.append(10)
my_list.append(20)
my_list.append(30)
print('Текущий список:', my_list)
print('Получение третьего элемента:', my_list.get(2))
print('Удаление второго элемента.')
my_list.remove(1)
print('Новый список:', my_list)

Результат:

Текущий список: [10 20 30]
Получение третьего элемента: 30
Удаление второго элемента.
Новый список: [10 30]
ЧИТАТЬ ДАЛЕЕ …
Модуль 26. Задача 5. Количество строк
Модуль 26. Задача 4. Последовательность Хофштадтера

Модуль 26. Задача 4. Последовательность Хофштадтера

Реализуйте генерацию последовательности Q Хофштадтера (итератором или генератором). Сама последовательность выглядит так:

Q(n)=Q(n−Q(n−1))+Q(n−Q(n−2))

В итератор (или генератор) передаётся список из двух чисел. Например, QHofstadter([1, 1]) генерирует точную последовательность Хофштадтера. Если передать значения [1, 2], то последовательность должна немедленно завершиться.

ЧИТАТЬ ДАЛЕЕ …
Модуль 26. Задача 3. Пути файлов

Модуль 26. Задача 3. Пути файлов

Реализуйте функцию gen_files_path, которая рекурсивно проходит по всем каталогам указанной директории (по умолчанию — корневой диск), находит указанный пользователем каталог и генерирует пути всех встреченных файлов.

Подсказка:

Существует функция, которая может получать все имена файлов в дереве каталогов. Попробуйте найти ее самостоятельно.

ЧИТАТЬ ДАЛЕЕ …
Модуль 26. Задача 2. Рефакторинг

Модуль 26. Задача 2. Рефакторинг

После различных вопросов про различия итераторов, генераторов и генераторных выражений на собеседовании вам дали небольшой пример кода и попросили «провести рефакторинг». Вот сам код:

# Нужно найти, какие два числа из списков в результате попарного перемножения дадут число 56.
list_1 = [2, 5, 7, 10]
list_2 = [3, 8, 4, 9]
to_find = 56
can_continue = True
for x in list_1:
    for y in list_2:
        result = x * y
        print(x, y, result)
        if result == to_find:
            print('Found!!!')
            can_continue = False
            break
    if not can_continue:
        break

Проблема кода состоит в некрасивом выходе из циклов (два break и флаг). Реализуйте более красивый выход из циклов, используя генератор. Сам алгоритм решения (попарное перемножение) и списки трогать нельзя.

ЧИТАТЬ ДАЛЕЕ …
Модуль 26. Задача 1. Квадраты чисел

Модуль 26. Задача 1. Квадраты чисел

Пользователь вводит число N. Напишите программу, которая генерирует последовательность из квадратов чисел от 1 до N (1 ** 2, 2 ** 2, 3 ** 2 и так далее). Реализацию напишите тремя способами: класс-итератор, функция-генератор и генераторное выражение.

Таблица квадратов натуральных чисел от 1 до 120
ЧИТАТЬ ДАЛЕЕ …
Модуль 25. Задача 7. Стек

Модуль 25. Задача 7. Стек

Мы уже говорили, что в программировании нередко необходимо создавать свои собственные структуры данных на основе уже существующих. Одной из таких «базовых» структур является стек.

Стек — это абстрактный тип данных, представляющий собой список элементов, организованных по принципу LIFO (англ. last in — first out, «последним пришёл — первым вышел»).

Простой пример: стек из книг на столе. Единственной книгой, чья обложка видна, является самая верхняя. Чтобы получить доступ к, например, третьей снизу книге, нам нужно убрать все книги, лежащие сверху, одну за другой.

Напишите класс, который реализует стек и его возможности (достаточно будет добавления и удаления элемента).

После этого напишите ещё один класс — «Менеджер задач». В менеджере задач можно выполнить команду «новая задача», в которую передаётся сама задача (str) и её приоритет (int). Сам менеджер работает на основе стека (не наследование!). При выводе менеджера в консоль все задачи должны быть отсортированы по приоритету: чем меньше число, тем выше задача.

Вот пример основной программы:

manager = TaskManager()
manager.new_task("сделать уборку", 4)
manager.new_task("помыть посуду", 4)
manager.new_task("отдохнуть", 1)
manager.new_task("поесть", 2)
manager.new_task("сдать дз", 2)
print(manager)

Результат:
1 отдохнуть
2 поесть; сдать дз
4 сделать уборку; помыть посуду

Дополнительно: реализуйте также удаление задач и подумайте, что делать с дубликатами.

ЧИТАТЬ ДАЛЕЕ …