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
50%
2 2
11%
2 3
25%
2 4
14%
4 4
👏5
Развёрнутое пояснение

1️⃣Строка 𝚜 содержит: пробел, 𝚊, пробел, 𝚋, пробел — всего 5 символов.

2️⃣Метод 𝚜.𝚜𝚙𝚕𝚒𝚝() воспринимает любую последовательность пробелов как один разделитель и игнорирует ведущие/завершающие, поэтому результат — ['𝚊', '𝚋'], длина 𝟸.​​

3️⃣Метод 𝚜.𝚜𝚙𝚕𝚒𝚝(' ') разбивает ровно по каждому пробелу: пробел в начале даёт '', затем '𝚊', затем '𝚋', пробел в конце даёт ''; итого ['', '𝚊', '𝚋', ''] — длина 𝟺.

Почему это важно
Многие разработчики интуитивно считают, что 𝚜𝚙𝚕𝚒𝚝(' ') и 𝚜𝚙𝚕𝚒𝚝() — это одно и то же, но на практике разница критична при парсинге данных: логи, CSV-файлы или пользовательский ввод часто содержат лишние пробелы в начале/конце строк или двойные пробелы между словами. Если использовать 𝚜𝚙𝚕𝚒𝚝(' ') для такой строки, в результате появятся пустые элементы '', которые могут сломать дальнейшую обработку — например, 𝚒𝚗𝚝('') выбросит ошибку, а 𝚕𝚎𝚗(𝚛𝚎𝚜𝚞𝚕𝚝) покажет неверное количество «слов». Правило простое: если нужно разбить текст на слова — используй 𝚜𝚙𝚕𝚒𝚝() без аргументов; если нужно точное разбиение по конкретному символу с сохранением структуры — тогда 𝚜𝚙𝚕𝚒𝚝(' ').
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥41👍1
Разбор по шагам

1️⃣Переменная 𝚡 имеет значение False.

2️⃣В условии 𝚢 := 𝚡 𝚘𝚛 𝚃𝚛𝚞𝚎 сначала вычисляется правая часть: 𝚡 𝚘𝚛 𝚃𝚛𝚞𝚎 → False or True → True.​

3️⃣Затем walrus-оператор присваивает это значение переменной 𝚢, то есть 𝚢 = 𝚃𝚛𝚞𝚎.

4️⃣Условие if истинно (𝚢 равно True), поэтому выполняется print(y) и на экран выводится True.

Почему это важно
Если бы разработчик хотел присвоить 𝚢 значение 𝚡, а потом проверить 𝚢 𝚘𝚛 𝚃𝚛𝚞𝚎, нужны скобки: (𝚢 := 𝚡) 𝚘𝚛 𝚃𝚛𝚞𝚎. Без понимания приоритета легко получить неожиданный результат.
Please open Telegram to view this post
VIEW IN TELEGRAM
3
Развёрнутое пояснение

1️⃣Вызов 𝚜𝚞𝚖(𝚒𝚝𝚎𝚛𝚊𝚋𝚕𝚎, 𝚜𝚝𝚊𝚛𝚝) эквивалентен последовательному сложению: 𝚜𝚝𝚊𝚛𝚝 + 𝚒𝚝𝚎𝚖𝟷 + 𝚒𝚝𝚎𝚖𝟸 + ....

2️⃣Здесь 𝚜𝚝𝚊𝚛𝚝 = [] (пустой список), а элементы итерируемого — [𝟷, 𝟸] и [𝟹, 𝟺].

3️⃣Первый шаг: [] + [𝟷, 𝟸] → [𝟷, 𝟸].

4️⃣Второй шаг: [𝟷, 𝟸] + [𝟹, 𝟺] → [𝟷, 𝟸, 𝟹, 𝟺].

5️⃣Переменная 𝚛𝚎𝚜𝚞𝚕𝚝 получает этот список, и print выводит [1, 2, 3, 4].

Почему это важно
Это «хакерский» способ сгладить список списков, но он неэффективен (квадратичная сложность из-за создания промежуточных списков); для реальных задач лучше использовать 𝚒𝚝𝚎𝚛𝚝𝚘𝚘𝚕𝚜.𝚌𝚑𝚊𝚒𝚗.𝚏𝚛𝚘𝚖_𝚒𝚝𝚎𝚛𝚊𝚋𝚕𝚎() или list comprehension.
Please open Telegram to view this post
VIEW IN TELEGRAM
3
Что выведет код?
Anonymous Quiz
53%
10
18%
20
9%
10 20
19%
Error
🤝2
Развёрнутое пояснение

1️⃣Глобальная переменная 𝚡 получает значение 𝟷𝟶.

2️⃣При компиляции функции 𝚏𝚘𝚘 Python видит строку 𝚡 = 𝟸𝟶 и помечает 𝚡 как локальную переменную для всего тела функции.​

3️⃣Когда функция вызывается и выполняется 𝚙𝚛𝚒𝚗𝚝(𝚡), Python ищет 𝚡 в локальной области видимости, но присваивание ещё не произошло — переменная существует, но не связана со значением.​

4️⃣Выбрасывается UnboundLocalError: local variable 'x' referenced before assignment.

Почему это важно
Эта ошибка часто сбивает с толку начинающих: кажется, что глобальная переменная должна быть видна, но наличие присваивания ниже по коду «перетягивает» её в локальную область. Решение — либо использовать 𝚐𝚕𝚘𝚋𝚊𝚕 𝚡, либо не переиспользовать имя глобальной переменной.
Please open Telegram to view this post
VIEW IN TELEGRAM
11
Что выведет код?
Anonymous Quiz
33%
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
👍4
Что выведет код в Python 3?
Anonymous Quiz
47%
[5, 5, 5]
24%
[0, 1, 2]
19%
NameError
10%
SyntaxError