Ответы на тестовые вопросы
| Вопрос | Ответ | Пояснение |
|---|---|---|
| 1 | b | \d+\.\d+ ищет группу «одна или более цифр, точка, одна или более цифр». |
| 2 | b | ID\d{2,4} берёт от 2 до 4 цифр; последний фрагмент ID78910 обрезается до 4 цифр. |
| 3 | b | [^a-zA-Z]+ исключает все буквы. \D+ исключает цифры, \W+ — словесные символы, [^\s]+ — пробелы. |
| 4 | b | \B означает «не граница слова». |
| 5 | b | re.compile сохраняет шаблон для повторного использования. |
| 6 | b | outer() возвращает функцию inner, но не вызывает её, поэтому ничего не печатается. |
| 7 | c | Вложенные функции видят переменные enclosing-области. |
| 8 | a | Замыкание требует возвращаемой вложенной функции, использующей переменные внешней. |
| 9 | a | Присваивание внутри inner создаёт локальную переменную, внешняя не меняется. |
| 10 | — | Пропущены скобки после def wrapper; правильно: def wrapper():. |
| 11 | — | 1-d, 2-a, 3-c, 4-b. |
Решение 1. Удаление HTML-тегов
import re
def remove_html_tags(text: str) -> str:
return re.sub(r"<.*?>", "", text)
text = "<div>Hello, <strong>world</strong>!</div>"
print(remove_html_tags(text)) # Hello, world!
Логика: шаблон <.*?> находит текст от < до ближайшего > (ленивый квантификатор) и заменяет его пустой строкой. Для сложного HTML лучше использовать специализированный парсер, а не регулярные выражения.
Проверить по документации: для разбора реального HTML рекомендуется html.parser или сторонние библиотеки вроде BeautifulSoup.
Решение 2. Уникальные IP-адреса
def make_ip_tracker():
seen: set[str] = set()
def tracker(ip: str) -> int:
seen.add(ip)
return len(seen)
return tracker
track = make_ip_tracker()
print(track("192.168.0.1")) # 1
print(track("10.0.0.1")) # 2
print(track("192.168.0.1")) # 2
print(track("8.8.8.8")) # 3
Логика: множество seen хранится в замыкании. Вложенная функция добавляет каждый новый адрес и возвращает текущее количество уникальных адресов.