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

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

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

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

Другие наши проекты: https://tprg.ru/media
Download Telegram
Развёрнутое пояснение

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 тоже участвует в цепочке, и без понимания этого правила легко неправильно предсказать результат.
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥4
Что выведет код?
Anonymous Quiz
22%
True True
31%
True False
23%
False True
23%
False False
👍1
Развёрнутое пояснение

1️⃣Переменная 𝚡 получает специальное значение 𝚖𝚊𝚝𝚑.𝚗𝚊𝚗 — «Not a Number», которое используется для обозначения неопределённых или невычислимых результатов (например, 0/0 в вещественной арифметике).

2️⃣Стандарт IEEE 754 предписывает, что любое сравнение с NaN, кроме !=, должно возвращать False, включая сравнение NaN с самим собой.​

3️⃣Поэтому 𝚡 == 𝚡 даёт False, а 𝚡 != 𝚡 даёт True — единственный случай в Python, когда объект не равен сам себе.

4️⃣Функция print выводит оба результата через пробел: False True.

Почему это важно
Проверка 𝚡 == 𝚏𝚕𝚘𝚊𝚝('𝚗𝚊𝚗') никогда не сработает; для обнаружения NaN нужно использовать 𝚖𝚊𝚝𝚑.𝚒𝚜𝚗𝚊𝚗(𝚡) — это частый источник багов при обработке данных.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍6🙏2
Что выведет код в Python 3?
Anonymous Quiz
43%
1 2 3
30%
0 2 2
10%
1 1 2
16%
0 1 2
👍1
Встроенная функция 𝚛𝚘𝚞𝚗𝚍() в 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% для равномерного набора данных. Подробнее можно почитать
в этой статье, например.
Please open Telegram to view this post
VIEW IN TELEGRAM
3👍1