✍7
По шагам:
Почему это важно
Это неочевидное проявление лексической области видимости. Если нужно только прочитать глобальную переменную внутри локальной области, проблем не возникнет. Но для её изменения потребуется явно указать global x в начале функции.
Please open Telegram to view this post
VIEW IN TELEGRAM
✍4
✍4
Почему это важно
Это неочевидное различие регулярно приводит к падениям скриптов при парсинге логов или CSV-файлов. Если вы ожидаете получить список токенов, а получаете пустой список вместо [''], обращение по индексу (например, chars[0]) вызовет IndexError.
Please open Telegram to view this post
VIEW IN TELEGRAM
✍3
✍2
Почему это важно:
Проверку на None нужно писать только через is None и is not None. Иначе перегруженный __eq__ может дать неожиданный результат и сломать логику условий.
Please open Telegram to view this post
VIEW IN TELEGRAM
✍4
✍2
Почему это важно
Это полезно для производительности и для контроля побочных эффектов. Если функция дорогая или что-то печатает, пишет в лог, делает запросы, короткое замыкание может сильно изменить поведение программы.
Please open Telegram to view this post
VIEW IN TELEGRAM
✍2
Почему это важно
Это типичная ошибка при возврате кортежа из функции (return (value) вместо return (value,)). Если забыть запятую, функция вернёт не коллекцию, а одиночное значение, что ломает распаковку и всю downstream-логику.
Please open Telegram to view this post
VIEW IN TELEGRAM
✍2
Python: задачки и вопросы
Подробное объяснение:
1️⃣ Python использует банковское округление (round half to even), а не привычное школьное «в большую сторону».
2️⃣ Когда число ровно посередине между двумя целыми, округляется к ближайшему чётному.
3️⃣ round(2.5) → 2 (ближайшее чётное).
4️⃣ round(3.5) → 4 (ближайшее чётное).
5️⃣ round(4.5) → 4 (ближайшее чётное).
Почему это важно:
В финансовых расчётах и при подсчёте статистики это может привести к расхождениям с ожидаемыми результатами. Стандарт IEEE 754 так округляет, чтобы уменьшить систематическую ошибку при большом количестве операций. Для точных десятичных вычислений (деньги, налоги) используйте Decimal из модуля decimal.
Почему это важно:
В финансовых расчётах и при подсчёте статистики это может привести к расхождениям с ожидаемыми результатами. Стандарт IEEE 754 так округляет, чтобы уменьшить систематическую ошибку при большом количестве операций. Для точных десятичных вычислений (деньги, налоги) используйте Decimal из модуля decimal.
Please open Telegram to view this post
VIEW IN TELEGRAM
✍8
Подробное объяснение:
1️⃣ Цикл for i in range(3) запускается: i принимает значения 0, 1, 2.
2️⃣ На итерации i = 0 условие if i == 1 ложно — цикл продолжается.
3️⃣ На итерации i = 1 условие истинно — выполняется break.
4️⃣ break немедленно прерывает цикл.
5️⃣ Блок else цикла проверяется только при нормальном завершении (без break).
6️⃣ Поскольку был break, блок else пропускается.
7️⃣ Выполняется print("done") → на экране одно слово: done.
Почему это важно:
Многие разработчики (даже опытные) думают, что else в цикле — это "если условие в цикле не сработало". На самом деле это "если цикл дошёл до конца". Путаница приводит к багам в поиске и валидации данных. for/else — полезный паттерн, но с контринтуитивным синтаксисом.
2️⃣ На итерации i = 0 условие if i == 1 ложно — цикл продолжается.
3️⃣ На итерации i = 1 условие истинно — выполняется break.
4️⃣ break немедленно прерывает цикл.
5️⃣ Блок else цикла проверяется только при нормальном завершении (без break).
6️⃣ Поскольку был break, блок else пропускается.
7️⃣ Выполняется print("done") → на экране одно слово: done.
Почему это важно:
Многие разработчики (даже опытные) думают, что else в цикле — это "если условие в цикле не сработало". На самом деле это "если цикл дошёл до конца". Путаница приводит к багам в поиске и валидации данных. for/else — полезный паттерн, но с контринтуитивным синтаксисом.
✍2
Подробное объяснение
1️⃣ Выражение [0] * 3 создаёт список [0, 0, 0] — один объект в памяти.
2️⃣ Выражение [[0, 0, 0]] * 3 создаёт три ссылки на этот же объект, а не три независимых списка.
3️⃣ Переменная m содержит [[0,0,0] ref, [0,0,0] ref, [0,0,0] ref]. Все ref → один объект.
4️⃣ m[0][0] = 1 обращается к первой ссылке, находит тот же список и меняет его первый элемент.
5️⃣ Поскольку все три строки ссылаются на один список, изменение видно во всех строках.
6️⃣ Вывод: [[1, 0, 0], [1, 0, 0], [1, 0, 0]].
Почему это важно:
Классический баг при создании игровых полей, таблиц и матриц. Чтобы сделать независимые строки, используйте list comprehension: [[0]*3 for _ in range(3)] — тогда каждая строка будет своим объектом.
2️⃣ Выражение [[0, 0, 0]] * 3 создаёт три ссылки на этот же объект, а не три независимых списка.
3️⃣ Переменная m содержит [[0,0,0] ref, [0,0,0] ref, [0,0,0] ref]. Все ref → один объект.
4️⃣ m[0][0] = 1 обращается к первой ссылке, находит тот же список и меняет его первый элемент.
5️⃣ Поскольку все три строки ссылаются на один список, изменение видно во всех строках.
6️⃣ Вывод: [[1, 0, 0], [1, 0, 0], [1, 0, 0]].
Почему это важно:
Классический баг при создании игровых полей, таблиц и матриц. Чтобы сделать независимые строки, используйте list comprehension: [[0]*3 for _ in range(3)] — тогда каждая строка будет своим объектом.
✍3