Python: задачки и вопросы
Kanalga Telegram’da o‘tish
Вопросы и задачки для подготовки к собеседованиям и прокачки навыков Разместить рекламу: @tproger_sales_bot Правила общения: https://tprg.ru/rules Другие каналы: @tproger_channels Другие наши проекты: https://tprg.ru/media
Ko'proq ko'rsatish7 131
Obunachilar
-124 soatlar
+77 kunlar
Ma'lumot yo'q30 kunlar
Postlar arxiv
Развёрнутое пояснение
1️⃣Вызов 𝚍𝚒𝚌𝚝.𝚏𝚛𝚘𝚖𝚔𝚎𝚢𝚜(['𝚊', '𝚋', '𝚌'], []) создаёт словарь с тремя ключами, но второй аргумент (пустой список) вычисляется один раз, и все три значения указывают на этот единственный список.
2️⃣Когда выполняется 𝚍['𝚊'].𝚊𝚙𝚙𝚎𝚗𝚍(𝟷), элемент 𝟷 добавляется в тот самый общий список.
3️⃣Поскольку 𝚍['𝚋'] и 𝚍['𝚌'] ссылаются на тот же объект, при печати видно {'a': [1], 'b': [1], 'c': [1]}.
Почему это важно
Это классическая ловушка при инициализации словарей со значениями-списками; правильный способ — использовать dict comprehension: {𝚔: [] 𝚏𝚘𝚛 𝚔 𝚒𝚗 𝚔𝚎𝚢𝚜} или 𝚍𝚎𝚏𝚊𝚞𝚕𝚝𝚍𝚒𝚌𝚝(𝚕𝚒𝚜𝚝).
Развёрнутое пояснение
🔘Функция 𝚊𝚕𝚕(𝚒𝚝𝚎𝚛𝚊𝚋𝚕𝚎) проверяет, все ли элементы истинны; внутри она перебирает элементы и возвращает False, как только встречает ложный; если цикл завершился без такого элемента — возвращает True.
🔘Для пустого списка цикл не выполняется ни разу, поэтому сразу возвращается True — переменная 𝚊 получает значение True.
🔘Функция 𝚊𝚗𝚢(𝚒𝚝𝚎𝚛𝚊𝚋𝚕𝚎) работает наоборот: возвращает True, как только встречает истинный элемент; если таких нет — возвращает False.
🔘Для пустого списка нет ни одного истинного элемента, поэтому 𝚋 получает False, и print(a, b) выводит True False.
Почему это важно
Это поведение часто ломает логику валидации: проверка 𝚊𝚕𝚕(𝚌𝚘𝚗𝚍𝚒𝚝𝚒𝚘𝚗𝚜) пройдёт, даже если список условий пуст, что может быть не тем, что ожидалось.
Repost from Типичный программист
Летим зимовать ✈️
Когда холодает, айтишники пакуют чемоданы, а мы разыгрываем ваучер на 50 000 рублей в Островке.
Поехать к морю или остаться среди снежных пейзажей — выбирайте сами!
Чтобы участвовать, нужно оставить любую реакцию под этим постом и подписаться на каналы ниже:
😎 Типичный программист
🐸 Библиотека программиста
🟢 Ostrovok! Tech
Теперь осталось нажать на кнопку участия под этим постом и вы в игре!
Итоги подведём 12 декабря. Победителя выберем с помощью бота. Подробнее с правилами можно ознакомиться здесь.
Всем удачи!
Участников: 27
Призовых мест: 1
Дата розыгрыша: 19:00, 12.12.2025 MSK (4 дня)
Встроенная функция 𝚛𝚘𝚞𝚗𝚍() в Python 3 округляет до ближайшего чётного числа. В английском это называют «banker's rounding» т.е. банковское округление.
Развёрнутое пояснение
1️⃣Значение 𝟶.𝟻 находится ровно посередине между 𝟶 и 𝟷; ближайшее чётное — 𝟶, поэтому 𝚊 получает 𝟶.
2️⃣Значение 𝟷.𝟻 находится посередине между 𝟷 и 𝟸; ближайшее чётное — 𝟸, поэтому 𝚋 получает 𝟸.
3️⃣Значение 𝟸.𝟻 находится посередине между 𝟸 и 𝟹; ближайшее чётное — 𝟸, поэтому 𝚌 тоже получает 𝟸.
4️⃣Функция print(a, b, c) выводит 0 2 2.
Почему это важно
Многие ожидают «школьного» округления (0.5 → 1), но Python 3 намеренно использует банковское, чтобы минимизировать накопление ошибки при суммировании большого количества округлённых значений. Если нужно классическое округление, придётся писать свою функцию или использовать модуль 𝚍𝚎𝚌𝚒𝚖𝚊𝚕.
А почему ошибка меньше накапливается то?
Я тоже не сразу понял, вот объяснение.
При обычном округлении цифра 5 всегда округляется вверх, и из-за этого возникает перекос — из 10 возможных дробных частей (0,0–0,9) пять округляются вверх (5, 6, 7, 8, 9) и только четыре вниз (1, 2, 3, 4), а ноль не меняется. Когда суммируются тысячи таких округлённых значений, этот небольшой сдвиг накапливается.
Банковское округление решает проблему тем, что числа с дробной частью ровно 0,5 округляются то вверх, то вниз — в зависимости от чётности целой части. Поскольку чётные и нечётные числа встречаются примерно одинаково часто, округления вверх и вниз статистически компенсируют друг друга.
На практике разница существенная: в примере с 1000 числами обычное округление даёт погрешность ~0,1%, а банковское ~0,01% для равномерного набора данных. Подробнее можно почитать в этой статье, например.
Развёрнутое пояснение
1️⃣Переменная 𝚡 получает специальное значение 𝚖𝚊𝚝𝚑.𝚗𝚊𝚗 — «Not a Number», которое используется для обозначения неопределённых или невычислимых результатов (например, 0/0 в вещественной арифметике).
2️⃣Стандарт IEEE 754 предписывает, что любое сравнение с NaN, кроме !=, должно возвращать False, включая сравнение NaN с самим собой.
3️⃣Поэтому 𝚡 == 𝚡 даёт False, а 𝚡 != 𝚡 даёт True — единственный случай в Python, когда объект не равен сам себе.
4️⃣Функция print выводит оба результата через пробел: False True.
Почему это важно
Проверка 𝚡 == 𝚏𝚕𝚘𝚊𝚝('𝚗𝚊𝚗') никогда не сработает; для обнаружения NaN нужно использовать 𝚖𝚊𝚝𝚑.𝚒𝚜𝚗𝚊𝚗(𝚡) — это частый источник багов при обработке данных.
Развёрнутое пояснение
1️⃣Выражение False == False in [False] выглядит так, будто сначала вычисляется False == False → True, а затем True in [False] → False, но это не так.
2️⃣Python трактует цепочки сравнений особым образом: выражение 𝚊 == 𝚋 in 𝚌 эквивалентно (𝚊 == 𝚋) and (𝚋 in 𝚌), при этом 𝚋 вычисляется только один раз.
3️⃣Подставляем: (False == False) and (False in [False]) → True and True → True.
4️⃣Переменная 𝚛𝚎𝚜𝚞𝚕𝚝 получает значение True, и именно оно выводится на экран.
Почему это важно
Задача учит не полагаться на интуицию при чтении сложных выражений со сравнениями: оператор in тоже участвует в цепочке, и без понимания этого правила легко неправильно предсказать результат.
Учитесь новому так, как удобно вам, вместе с Академией Топ
Академия Топ — это крупнейшая образовательная сеть с филиалами в 230 городах, в которой вы можете изучать множество разнообразных IT-профессий.
По итогам обучения выпускники Академии получают государственный диплом, признанный в 7 странах мира.
Выбирайте курс по душе:
• «Разработка на Python»
• «Разработчик программного обеспечения»
• «Кибербезопасность и сетевые технологии»
• и многое другое
Академия регулярно проводит бесплатные дни открытых дверей «Старт в IT» для тех, кто мечтает о карьере в IT, но не знает, с чего начать.
Вы сможете познакомиться с преподавателями, получить индивидуальную консультацию, увидеть работы студентов и посетить экскурсию по Академии.
А для тех, кто уже выбрал своим направлением Python-разработку, в Академии Топ проводят пробные занятия «Python с нуля: создаём чат-бота», где вы на практике изучите основы универсального языка программирования и создадите свой первый проект.
Выбирайте свой курс с подходящим вам форматом обучения!
Реклама. Филиал «АКАДЕМИЯ ТОП КУТУЗОВСКИЙ», ИНН 7730257499, erid: 2W5zFK5c4jS
Развёрнутое пояснение
1️⃣Переменная 𝚝 указывает на кортеж с одним элементом — списком [𝟷, 𝟸]; сам кортеж неизменяем, но список внутри него — изменяемый объект.
2️⃣Выражение t[0] += [3] разворачивается примерно в t[0] = t[0].__iadd__([3]): сначала вызывается метод __iadd__ у списка, который добавляет элемент 𝟹 на месте и возвращает тот же самый изменённый список.
3️⃣Затем интерпретатор пытается выполнить присваивание t[0] = ..., но кортеж не поддерживает присваивание элементов, поэтому выбрасывается TypeError: 'tuple' object does not support item assignment.
4️⃣Однако к моменту исключения список уже был изменён методом __iadd__, поэтому если после ошибки проверить значение 𝚝, оно будет ([1, 2, 3],) — мутация произошла, несмотря на ошибку.
Почему это важно
Задача показывает, что составные операторы вроде += — это не атомарная операция, а последовательность из нескольких шагов, и сбой на одном из них не откатывает предыдущие. Это учит быть осторожнее при работе с вложенными изменяемыми объектами внутри неизменяемых контейнеров и помнить, что «неизменяемость» кортежа распространяется только на его структуру, а не на содержимое элементов.
Endi mavjud! Telegram Tadqiqoti 2025 — yilning asosiy insaytlari 
