Синтаксис и типы данных: вопросы для собеседования (часть 8)
Базовые типы (int, float, str, bool), присваивание, f-строки, type hints — первое, что проверяют на собеседовании по Python. Спрашивают про мутабельность, разницу между is и ==, приведение типов. Без уверенного знания основ синтаксиса невозможно перейти к более сложным темам.
Вопросы 36–40 из 40
36Что вернёт выражение `'П'.encode('utf-8')`?
AРезультат `b'\xd0'`: `encode()` берёт первый байт исходного символа
BРезультат `b'\xd0\x9f'`: двухбайтовое представление `'П'` в `utf-8` как `bytes`
CРезультат `b'П'`: `encode()` добавляет префикс `b` к строке без преобразования
DИсключение `UnicodeError`: кириллица в `utf-8` не кодируется без подмены
Ответ: Метод `encode()` преобразует строку `str` в последовательность байтов `bytes` в указанной кодировке.
Кириллический символ `'П'` в кодировке UTF-8 занимает два байта: `\\xd0` и `\\x9f`. Результат `'П'.encode('utf-8')` — объект `bytes`: `b'\\xd0\\x9f'`. Тип `bytes` хранит именно сырые байты, а не символы. Обратная операция — `b'\\xd0\\x9f'.decode('utf-8')` — вернёт строку `'П'`.
Подробный разбор → 37Пусть `fs = frozenset([1, 2, 3])`. Что произойдёт при вызове `fs.add(4)`?
AМетод `.add(4)` сработает: `frozenset` поддерживает добавление элементов как обычный `set`
BБудет `AttributeError`: у `frozenset` нет метода `.add()`, объект неизменяемый
CМетод `.add(4)` молча вернёт `None`: ничего не изменится, исключения тоже не будет
DЭлемент добавится: при изменении `frozenset` автоматически становится обычным `set`
Ответ: `frozenset` — неизменяемая версия множества, которая не поддерживает методы изменения и поднимает `AttributeError` при попытке вызвать `.add()`.
`frozenset` отличается от `set` тем, что его нельзя изменить после создания: у него нет методов `add()`, `remove()`, `discard()` и `update()`. Поэтому вызов `fs.add(4)` поднимает `AttributeError: 'frozenset' object has no attribute 'add'`. Зато именно из-за неизменяемости и хэшируемости `frozenset` можно использовать как ключ словаря или элемент другого множества — обычный `set` для этого не годится. Чтобы «добавить» элемент, создают новое множество: `fs | {4}`.
Подробный разбор → 38Что вернёт вызов `'a,,b,,c'.split(',')` в Python?
AСписок `['a', 'b', 'c']`: пустые строки между разделителями игнорируются
BСписок `['a', 'b', 'c', '']`: пустая строка появляется только в конце результата
CИсключение `ValueError`: два разделителя подряд считаются недопустимым форматом
DСписок `['a', '', 'b', '', 'c']`: пустые строки сохраняются между разделителями
Ответ: Метод `.split()` с явным разделителем сохраняет пустые строки между подряд идущими разделителями.
Когда `.split()` вызывается с явным разделителем, каждое его вхождение создаёт границу. Два разделителя подряд дают пустую строку `''` между ними. Поэтому `'a,,b,,c'.split(',')` вернёт `['a', '', 'b', '', 'c']`. А вот `.split()` без аргументов ведёт себя иначе — группирует подряд идущие пробелы и не создаёт пустых строк, что часто путает новичков.
Подробный разбор → 39Пусть `a = 'привет'`, `b = 'мир'`. Что произойдёт после выполнения `a, b = b, a`?
AПеременные поменяются местами: `a` станет `'мир'`, а `b` станет `'привет'`
BБудет исключение `TypeError`: строки нельзя обменивать через распаковку `a, b = b, a`
CОбе переменные станут `'мир'`: правый `b` присвоится в `a` первым по порядку
DОбе переменные станут `'привет'`: левый `a` присвоится в `b` первым по порядку
Ответ: Запись `a, b = b, a` использует кортежную распаковку и одновременно меняет значения переменных.
Python сначала вычисляет всю правую часть выражения `b, a` — создаёт кортеж `('мир', 'привет')`. Затем распаковывает его в левую часть: `a` получает `'мир'`, `b` получает `'привет'`. Промежуточная переменная не нужна, и порядок «слева направо» здесь не работает: правая часть берётся целиком до присваивания. Это работает с любыми типами данных, не только со строками.
Подробный разбор → 40Пусть `d1 = {'a': 1, 'b': 2}` и `d2 = {'b': 3, 'c': 4}`. Что вернёт `{**d1, **d2}`?
AСловарь `{'a': 1, 'b': 2, 'b': 3, 'c': 4}` с двумя записями по ключу `'b'`
BИсключение `KeyError` из-за конфликта ключа `'b'` при распаковке `**`
CСловарь `{'a': 1, 'b': 3, 'c': 4}`: значение из `d2` перезаписало значение из `d1`
DСловарь `{'a': 1, 'b': 2, 'c': 4}`: значение ключа `'b'` сохранилось из `d1`
Ответ: При распаковке `**` совпадающие ключи перезаписываются значениями из более позднего словаря.
Выражение `{**d1, **d2}` создаёт новый словарь, последовательно распаковывая `d1`, затем `d2`. Ключ `'b'` присутствует в обоих словарях: сначала записывается `'b': 2` из `d1`, затем перезаписывается на `'b': 3` из `d2`. Итог — `{'a': 1, 'b': 3, 'c': 4}`. Побеждает тот словарь, который распаковывается последним. Дубликат ключа здесь не вызывает `KeyError`: словарь не может содержать два одинаковых ключа.
Подробный разбор →