Python: задачки и вопросы
7.46K subscribers
1.3K photos
1 video
1 file
120 links
Вопросы и задачки для подготовки к собеседованиям и прокачки навыков

Разместить рекламу: @tproger_sales_bot

Правила общения: https://tprg.ru/rules

Другие каналы: @tproger_channels

Другие наши проекты: https://tprg.ru/media
Download Telegram
Что выведет код?
Anonymous Quiz
34%
2 2
35%
1 2
23%
2 1
9%
1 1
👍2
Развёрнутое пояснение

1️⃣Глобальные 𝚐 = 𝟶 и 𝚗 = 𝟶.

2️⃣Вызывается 𝚘𝚞𝚝𝚎𝚛(): создаются локальные 𝚐 = 𝟷 и 𝚗 = 𝟷, которые перекрывают глобальные в этой области.

3️⃣В 𝚒𝚗𝚗𝚎𝚛 инструкция 𝚐𝚕𝚘𝚋𝚊𝚕 𝚐 привязывает 𝚐 к глобальной области (где 𝚐 = 𝟶), а 𝚗𝚘𝚗𝚕𝚘𝚌𝚊𝚕 𝚗 — к локальной 𝚗 из 𝚘𝚞𝚝𝚎𝚛.

4️⃣Присваивание 𝚐, 𝚗 = 𝟸, 𝟸: глобальная 𝚐 становится 𝟸, локальная 𝚗 из 𝚘𝚞𝚝𝚎𝚛 становится 𝟸. Локальная 𝚐 в 𝚘𝚞𝚝𝚎𝚛 остаётся 𝟷.

5️⃣𝚙𝚛𝚒𝚗𝚝(𝚐, 𝚗) внутри 𝚘𝚞𝚝𝚎𝚛 выводит локальную 𝚐 = 𝟷 и 𝚗 = 𝟸 → 1 2.

Почему это важно
Симметричная структура кода (обе переменные инициализируются одинаково на всех уровнях) создаёт иллюзию, что 𝚐𝚕𝚘𝚋𝚊𝚕 и 𝚗𝚘𝚗𝚕𝚘𝚌𝚊𝚕 работают одинаково — но 𝚐𝚕𝚘𝚋𝚊𝚕 игнорирует промежуточную область 𝚘𝚞𝚝𝚎𝚛, а 𝚗𝚘𝚗𝚕𝚘𝚌𝚊𝚕 работает именно с ней.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3
Развёрнутое пояснение

1️⃣Выражение 𝚊 = 𝚋 = [𝟷, 𝟸] вычисляет список один раз и присваивает ссылку на него обеим переменным 𝚊 и 𝚋 — они указывают на один и тот же объект.​

2️⃣Вызов 𝚊.𝚊𝚙𝚙𝚎𝚗𝚍(𝟹) модифицирует этот список на месте: теперь он содержит [𝟷, 𝟸, 𝟹], и обе переменные видят это изменение.

3️⃣Выражение 𝚋 = 𝚋 + [𝟺] создаёт новый список из элементов 𝚋 плюс элемент 𝟺, и перепривязывает переменную 𝚋 к этому новому списку [𝟷, 𝟸, 𝟹, 𝟺]; переменная 𝚊 продолжает указывать на старый объект.​

4️⃣Функция 𝚙𝚛𝚒𝚗𝚝(𝚊, 𝚋) выводит [1, 2, 3] [1, 2, 3, 4].

Почему это важно
Задача демонстрирует разницу между мутацией объекта (𝚊𝚙𝚙𝚎𝚗𝚍, +=) и созданием нового объекта (+). При цепочке присваиваний с изменяемыми объектами легко получить неожиданное разделение состояния между переменными.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍6
Что выведет код в Python 3?
Anonymous Quiz
48%
[5, 5, 5]
24%
[0, 1, 2]
18%
NameError
9%
SyntaxError
Развёрнутое пояснение

1️⃣Внутри тела класса 𝙰 создаётся атрибут 𝚡 = 𝟻.

2️⃣Затем начинается list comprehension [𝚡 𝚏𝚘𝚛 𝚒 𝚒𝚗 𝚛𝚊𝚗𝚐𝚎(𝟹)]; в Python 3 это выражение компилируется как отдельная вложенная функция со своей областью видимости.

3️⃣Итерируемый объект 𝚛𝚊𝚗𝚐𝚎(𝟹) вычисляется в области видимости класса (это работает), но выражение 𝚡 внутри comprehension ищется в локальной области comprehension, затем в глобальной — область класса пропускается.

4️⃣Поскольку 𝚡 не найден ни локально, ни глобально, выбрасывается NameError: name 'x' is not defined.

Почему это важно
Это неочевидное поведение часто ломает код при портировании с Python 2 на 3. Решение — вынести значение в итерируемое: [𝚡 𝚏𝚘𝚛 𝚡 𝚒𝚗 [𝚡] 𝚏𝚘𝚛 𝚒 𝚒𝚗 𝚛𝚊𝚗𝚐𝚎(𝟹)] или использовать значение по умолчанию в лямбде.
Please open Telegram to view this post
VIEW IN TELEGRAM
🙈2👍1