👾 — Ann Zoe Bob
👍 — Ann Bob Zoe
🥰 — Zoe Bob Ann
⚡️ — Zoe Ann Bob
Ответ: 👾 — Ann Zoe Bob.
sorted сортирует только по ключу p[1], то есть по баллам. Сортировка стабильна: при равных ключах сохраняется исходный порядок записей. Поэтому после Ann с 5 баллами идут Zoe и Bob с 10 баллами именно в таком порядке. По именам дополнительная сортировка не выполняется.
def build():
result = [1]
try:
return result
finally:
result.append(2)
print(build())
👾 — [1]
👍 — None
🥰 — [1, 2]
⚡️ — Ошибка: после return код не выполняется
Ответ: 🥰 — [1, 2].
return выбирает объект, который нужно вернуть, но до фактического выхода из функции выполняется finally. Он изменяет тот же список, поэтому вызывающий код получает [1, 2]. Нового списка здесь не создаётся, и значение return не заменяется.
❓ Сработает ли match, если в словаре есть лишние ключи?
Python 3.13. Что выведет код?
payload = {"kind": "ping", "debug": True}
match payload:
case {"kind": kind}:
print(kind)
case _:
print("no match")
👾 — no match
👍 — ping
🥰 — Ошибка из-за ключа debug
⚡️ — Ошибка: kind должен быть объявлен заранее
Ответ: 👍 — ping.
Шаблон словаря требует наличия указанных ключей, но не запрещает дополнительные. Ключ kind найден, а его значение связывается с переменной kind. Ключ debug совпадению не мешает. Чтобы собрать остальные пары, можно добавить в шаблон захват остатка словаря.
❓ Когда генератор выбирает источник, а когда проверяет условие?
Python 3.13. Что выведет код?
source = [1, 2, 3]
limit = 1
selected = (x for x in source if x > limit)
source = [9]
limit = 2
print(list(selected))
👾 — [2, 3]
👍 — [9]
🥰 — []
⚡️ — [3]
Ответ: ⚡️ — [3].
Для самого левого for генераторного выражения источник и его итератор выбираются при создании генератора. Поэтому переназначение source не переключает selected на список [9]. Условие x > limit проверяется во время обхода, когда limit уже равен 2. Из исходного списка проходит только 3.
❓ Создаст ли defaultdict новый ключ при вызове get?
Python 3.13. Что выведет код?
from collections import defaultdict
groups = defaultdict(list)
print(groups.get("new"), len(groups))
groups["new"].append(1)
print(groups["new"], len(groups))
👾 — None 0, затем [1] 1
👍 — [] 1, затем [1] 1
🥰 — None 1, затем [1] 1
⚡️ — KeyError
Ответ: 👾 — None 0, затем [1] 1.
get работает как у обычного dict: без указанного значения по умолчанию возвращает None и ничего не вставляет. Фабрика list вызывается при обращении к отсутствующему ключу через квадратные скобки. Тогда создаётся список, в который append добавляет 1.