📝 Практические задания

⚡ Задания в двух словах

  1. Тестовые вопросы по регулярным выражениям и замыканиям.
  2. Удалить все HTML-теги из строки.
  3. Создать замыкание для подсчёта уникальных IP-адресов.

Тестовые вопросы

Вопрос 1. Что делает следующий код?

import re
text = "Version 3.10, Build 2023-04-01, Update 12.5.1"
matches = re.findall(r"\d+\.\d+", text)
print(matches)
  1. Находит только целые числа.
  2. Находит все группы вида число.число.
  3. Находит все группы вида число.число.число.
  4. Находит все группы вида число любой символ число.

Вопрос 2. Что напечатает следующий код?

import re
text = "ID123, ID56, ID, ID78910"
print(re.findall(r"ID\d{2,4}", text))
  1. ['ID123', 'ID56']
  2. ['ID123', 'ID56', 'ID7891']
  3. ['ID123', 'ID56', 'ID', 'ID78']

Вопрос 3. Какой из шаблонов найдёт ВСЁ, кроме букв?

  1. \D+
  2. [^a-zA-Z]+
  3. \W+
  4. [^\s]+

Вопрос 4. Что найдёт шаблон \B\d+\B?

  1. Все числа в начале строки.
  2. Числа, не стоящие на границе слова.
  3. Все числа.
  4. Числа, стоящие в начале слова.

Вопрос 5. Что делает re.compile()?

  1. Запускает регулярное выражение.
  2. Сохраняет шаблон для повторного использования.

Вопрос 6. Что выведет следующий код?

def outer():
    text = "Привет"
    def inner():
        print(text)
    return inner

hello = outer()
  1. Ошибка: text is not defined.
  2. Ничего не выведет.
  3. Привет
  4. Привет Привет

Вопрос 7. Укажи верные утверждения:

  1. nonlocal может изменять глобальные переменные.
  2. Замыкание не сохраняет переменные, если внешняя функция завершена.
  3. Вложенные функции видят переменные enclosing-области.
  4. В Python нельзя возвращать функцию как значение.

Вопрос 8. Укажи, какие конструкции создают замыкание:

  1. Возвращаемая вложенная функция, использующая переменные внешней функции.
  2. Возвращаемая вложенная функция, не использующая переменные внешней функции.
  3. Использование global в функции.
  4. Простая функция без вложенности.

Вопрос 9. Какой вывод будет у следующего кода?

def outer():
    text = "Оригинал"
    def inner():
        text = "Копия"
    inner()
    print(text)

outer()
  1. Оригинал
  2. Копия
  3. Ничего не выведет.

Вопрос 10. Найди ошибку в декораторе:

def my_decorator(func):
    def wrapper:
        print("До")
        func()
        print("После")
    return wrapper

Вопрос 11. Сопоставь часть декоратора с его назначением:

1. def decorator(func)
2. def wrapper()
3. func()
4. return wrapper

a. Определение вложенной функции
b. Возврат новой функции вместо оригинальной
c. Вызов исходной функции внутри новой
d. Получение функции как аргумента

Задание 1. Удаление HTML-тегов

Условие: реализуйте программу, которая удаляет все HTML-теги из строки.

Данные:

text = "<div>Hello, <strong>world</strong>!</div>"

Пример вывода:

Hello, world!

Подсказка: используйте re.sub и шаблон, который находит текст между < и >.

Задание 2. Уникальные IP-адреса

Условие: создайте функцию, которая возвращает другую функцию — обработчик IP-адресов. Обработчик принимает IP-адрес в виде строки и возвращает количество уникальных адресов, которые были переданы ранее. Используйте вложенную функцию и замыкание.

Пример вызова:

tracker = make_ip_tracker()
print(tracker("192.168.0.1"))
print(tracker("10.0.0.1"))
print(tracker("192.168.0.1"))
print(tracker("8.8.8.8"))

Пример вывода:

1
2
2
3

Проверка понимания

Выберите один вариант ответа. После клика правильный ответ подсветится зелёным.

Вопрос 1

Как лучше использовать summary-урок?

Вопрос 2

Что показывает хороший результат после повторения блока?

Вопрос 3

Какой вопрос стоит задать себе после каждого ответа?

Вопрос 4

Какой стиль имён переменных обычно рекомендует PEP 8?

Вопрос 5

Зачем использовать f-strings в современном Python?

Вопрос 6

Когда полезен ранний возврат из функции?

Вопрос 7

Что делает аннотация типа в Python?

Вопрос 8

Как лучше обрабатывать ожидаемую ошибку преобразования?