Модуль 31. Задача 5. ПИН-код

Модуль 31. Задача 5. ПИН-код

Недавно Влад решил протестировать новый электронный замок и с его помощью запер свой чемодан. Правда, уже через час Влад забыл ПИН-код для открытия своего замка. Поэтому он решил пойти путём brute force, то есть просто перебрать все возможные коды.

ПИН-код состоит из четырёх цифр. На каждой позиции ПИН-кода находится цифра от 0 до 9. Позиции не зависят друг от друга.

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

ЧИТАТЬ ДАЛЕЕ …
Модуль 31. Задача 4. Телефонные номера

Модуль 31. Задача 4. Телефонные номера

В одной организации перед записью телефонного номера в базу данных его проверяют на соответствие следующим критериям:

  • Длина номера — ровно 10 знаков.
  • Номер начинается с цифры 8 или с цифры 9.
  • Остальные знаки — только цифры.

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

Пример списка:

['9999999999', '999999-999', '99999x9999']

Результат:

первый номер: всё в порядке
второй номер: не подходит
третий номер: не подходит
ЧИТАТЬ ДАЛЕЕ …
Модуль 31. Задача 3. Во все тяжкие

Модуль 31. Задача 3. Во все тяжкие

Фанаты сериала Breaking Bad («Во все тяжкие») написали собственный API по вселенной своего любимого сериала. Ссылка на документацию: Document At ion.

Внимательно изучите документацию этого API и напишите программу, которая выводит на экран (а также в JSON-файл) информацию о том, в каком эпизоде произошло больше всего смертей. Информация хранится в виде словаря, который содержит:

  1. ID эпизода.
  2. Номер сезона.
  3. Номер эпизода.
  4. Общее количество смертей.
  5. Список погибших.
ЧИТАТЬ ДАЛЕЕ …
Модуль 31. Задача 2. Регистрационные знаки

Модуль 31. Задача 2. Регистрационные знаки

В России для транспорта применяются регистрационные знаки нескольких видов.

Общее в них то, что они состоят из цифр и букв. Причём используются только 12 букв кириллицы, имеющих графические аналоги в латинском алфавите: А, В, Е, К, М, Н, О, Р, С, Т, У и Х.

У частных легковых автомобилей номера — это буква, три цифры, две буквы, затем две или три цифры с кодом региона.

У такси — две буквы, три цифры, затем две или три цифры с кодом региона.

Напишите программу, которая в перечне номеров находит номера частных автомобилей и номера такси:

Пример перечня:

А578ВЕ777 ОР233787 К901МН666 СТ46599 СНИ2929П777 666АМР666'

Результат:

Список номеров частных автомобилей: ['А578ВЕ777', 'К901МН666']
Список номеров такси: ['ОР233787', 'СТ46599']
ЧИТАТЬ ДАЛЕЕ …
Модуль 31. Задача 1. Lorem ipsum

Модуль 31. Задача 1. Lorem ipsum

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

text = """ Lorem ipsum dolor sit amet, consectetuer adipiscing elit. 
Aenean commodo ligula eget dolor. Aenean massa. Cum sociis natoque penatibus et magnis dis parturient montes, 
nascetur ridiculus mus. Donec quam felis, ultricies nec, pellentesque eu, pretium quis, sem. 
Nulla consequat massa quis enim. Donec pede justo, fringilla vel, aliquet nec, vulputate 
"""

Напишите программу, которая обрабатывает этот текст и выводит список слов, состоящих ровно из четырёх букв.

Результат:

['amet', 'elit', 'eget', 'quam', 'quis', 'quis', 'enim', 'pede']
ЧИТАТЬ ДАЛЕЕ …
Модуль 30. Задача 4. Палиндром: возвращение

Модуль 30. Задача 4. Палиндром: возвращение

Для Python существует множество различных библиотек для работы с данными, причём как встроенных, так и внешних. С некоторыми из них мы уже работали, например с модулем collections, когда использовали специальный класс OrderedDict, с помощью которого делали упорядоченный словарь. Конечно же, в этой библиотеке есть и другие возможности (на самом деле их совсем немного). Вот официальная документация: collections — Container datatypes.

Используя модуль collections и новые знания о функциях, реализуйте функцию can_be_poly, которая принимает на вход строку и проверяет, можно ли получить из неё палиндром.

Пример кода:

print(can_be_poly('abcba'))
print(can_be_poly('abbbc'))

Результат:

True
False
ЧИТАТЬ ДАЛЕЕ …
Модуль 30. Задача 3. Читабельность кода

Модуль 30. Задача 3. Читабельность кода

Необходимо вывести на экран список простых чисел от 0 до 1000. Реализуйте это двумя способами:

1) «однострочным» кодом, без объявления дополнительных функций;
1) обычным, «своим» кодом, который покажется вам наиболее красивым.

После этого ответьте себе (не куратору) на вопрос: какое из решений более читабельное?

ЧИТАТЬ ДАЛЕЕ …
Модуль 30. Задача 2. И снова zip

Модуль 30. Задача 2. И снова zip

Помните, как нам приходилось что-то выдумывать, чтобы создать аналог функции zip? Так вот, теперь вы знаете, как это сделать буквально в одну строку.

Даны список букв (letters) и список цифр (numbers). Каждый список состоит из N элементов. Создайте кортежи из пар элементов списков и запишите их в список results. Не используйте функцию zip. Решите задачу «в одну строку» (не считая print(results)).

Пример списков:

letters: List[str] = ['a', 'b', 'c', 'd', 'e']
numbers: List[int] = [1, 2, 3, 4, 5, 6, 7, 8]

Результат работы программы:

[('a', 1), ('b', 2), ('c', 3), ('d', 4), ('e', 5)]
ЧИТАТЬ ДАЛЕЕ …
Модуль 30. Задача 1. Новые списки

Модуль 30. Задача 1. Новые списки

Даны три списка:

from typing import List

floats: List[float] = [12.3554, 4.02, 5.777, 2.12, 3.13, 4.44, 11.0001]
names: List[str] = ["Vanes", "Alen", "Jana", "William", "Richards", "Joy"]
numbers: List[int] = [22, 33, 10, 6894, 11, 2, 1]

Напишите код, который создаёт три новых списка. Вот их содержимое:

  1. Каждое число из списка floats возводится в третью степень и округляется до трёх знаков после запятой.
  2. Из списка names берутся только те имена, в которых есть минимум пять букв.
  3. Из списка numbers берётся произведение всех чисел.
ЧИТАТЬ ДАЛЕЕ …
Модуль 29. Задача 5. Синглтон

Модуль 29. Задача 5. Синглтон

Синглтон — это порождающий паттерн проектирования, который гарантирует, что у класса есть только один экземпляр, и предоставляет к нему глобальную точку доступа. Синглтонами мы уже пользовались, к ним относятся, например, None, True и False. Именно потому, что None является синглтоном, мы можем использовать оператор is — он возвращает True только для объектов, представляющих одну и ту же сущность.

Реализуйте декоратор singleton, который превращает класс в одноэлементный. То есть при множественной инициализации объекта этого класса будет сохранён только первый инстанс, а все остальные попытки создания будут возвращать первый экземпляр.

Пример кода:

@singleton
class Example:
    pass

my_obj = Example()
my_another_obj = Example()

print(id(my_obj))
print(id(my_another_obj))

print(my_obj is my_another_obj)

Результат:

1986890616688
1986890616688
True
ЧИТАТЬ ДАЛЕЕ …
Модуль 29. Задача 4. Весь мир — декоратор…

Модуль 29. Задача 4. Весь мир — декоратор…

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

Пример использования:

@decorator_with_args_for_any_decorator
def decorated_decorator(func: Callable, *args, **kwargs):... # отсюда уже сами!

@decorated_decorator(100, 'рублей', 200, 'друзей')
def decorated_function(text: str, num: int) -> None:
    print("Привет", text, num)

decorated_function("Юзер", 101)

Результат:

Переданные арги и кварги в декоратор: (100, 'рублей', 200, 'друзей') {}
Привет, Юзер 101
ЧИТАТЬ ДАЛЕЕ …
Модуль 29. Задача 3. Логирование в формате

Модуль 29. Задача 3. Логирование в формате

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

Пример кода, передаётся формат «Месяц День Год - Часы Минуты Секунды»:

@log_methods("b d Y - H:M:S")
class A:
    def test_sum_1(self) -> int:
        print('test sum 1')
        number = 100
        result = 0
        for _ in range(number + 1):
            result += sum([i_num ** 2 for i_num in range(10000)])

        return result

@log_methods("b d Y - H:M:S")
class B(A):
    def test_sum_1(self):
        super().test_sum_1()
        print("Наследник test sum 1")

    def test_sum_2(self):
        print("test sum 2")
        number = 200
        result = 0
        for _ in range(number + 1):
            result += sum([i_num ** 2 for i_num in range(10000)])

        return result

my_obj = B()
my_obj.test_sum_1()
my_obj.test_sum_2()

Результат:

- Запускается 'B.test_sum_1'. Дата и время запуска: Apr 23 2021 - 21:50:37 
- Запускается 'A.test_sum_1'. Дата и время запуска: Apr 23 2021 - 21:50:37 
Тут метод test_sum_1
- Завершение 'A.test_sum_1', время работы = 0.187s 
Тут метод test_sum_1 у наследника
- Завершение 'B.test_sum_1', время работы = 0.187s 
- Запускается 'B.test_sum_2'. Дата и время запуска: Apr 23 2021 - 21:50:37 
Тут метод test_sum_2 у наследника
- Завершение 'B.test_sum_2', время работы = 0.370s

Совет: внимательно пересмотрите видео 29.4, если сталкиваетесь с трудностями при решении этой задачи.

ЧИТАТЬ ДАЛЕЕ …
Модуль 29. Задача 2. Функция обратного вызова

Модуль 29. Задача 2. Функция обратного вызова

При работе с сетью и веб-сервисами иногда используется функция callback, так называемая функция обратного вызова. Это функция, которая вызывается при срабатывании определённого события (переходе на страницу, получении сообщения или окончании обработки процессором). В неё можно передать функцию, чтобы она выполнилась после определённого события. Это используется, например, в HTTP-серверах в ответ на URL-запросы. Реализуйте такую функцию.

Пример функции:

@callback('//')
def example():
    print('Пример функции, которая возвращает ответ сервера')
    return 'OK'

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

route = app.get('//')
if route:
    response = route()
    print('Ответ:', response)
else:
    print('Такого пути нет')

Ожидаемый результат:

Пример функции, которая возвращает ответ сервера
Ответ: OK
ЧИТАТЬ ДАЛЕЕ …
Модуль 29. Задача 1. Права доступа

Модуль 29. Задача 1. Права доступа

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

Напишите декоратор check_permission, который проверяет, есть ли у пользователя доступ к вызываемой функции, и если нет, то выдаёт исключение PermissionError.

Пример кода:

user_permissions = ['admin']

@check_permission('admin')
def delete_site():
    print('Удаляем сайт')

@check_permission('user_1')
def add_comment():
    print('Добавляем комментарий')

delete_site()
add_comment()

Результат:

Удаляем сайт
PermissionError: У пользователя недостаточно прав, чтобы выполнить функцию add_comment
ЧИТАТЬ ДАЛЕЕ …
Модуль 28. Задача 4. Дата

Модуль 28. Задача 4. Дата

Реализуйте класс Date, который должен:

  • проверять числа даты на корректность;
  • конвертировать строку даты в объект класса Date, состоящий из соответствующих числовых значений дня, месяца и года.

Оба метода должны получать на вход строку вида dd-mm-yyyy.

При тестировании программы объект класса Date должен инициализироваться исключительно через метод конвертации, например:

date = Date.from_string('10-12-2077')

Неверный вариант: date = Date(10, 12, 2077)

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

date = Date.from_string('10-12-2077')
print(date)
print(Date.is_date_valid('10-12-2077'))
print(Date.is_date_valid('40-12-2077'))

Результат:

День: 10    Месяц: 12   Год: 2077
True
False
ЧИТАТЬ ДАЛЕЕ …