Python Ninja | Программирование
6.92K subscribers
1.08K photos
99 videos
917 links
Канал для всех кто хочет освоить или прокачать навыки программирования на Python. Присоединяйся, чтобы стать настоящим Python Ninja!

Связь: @sfoninja
Download Telegram
Если вы новичок в Python остановитесь и внимательно посмотрите 👇

НИКОГДА не изменяйте список во время итерации по нему

Когда вы изменяете список в процессе обхода, итератор «теряется». Он не понимает, что список изменился прямо во время его работы.

Например, этот код работает неправильно:
items = [1, 2, 2, 3, 4]
for item in items:
if item == 2:
items.remove(item)

print(items)
# Output: [1, 2, 3, 4]


Мы используем метод remove(), чтобы удалить все двойки из списка. Но, как видно из результата, одна 2 всё равно остаётся.

Почему так происходит? Когда вы удаляете элемент из списка, все элементы сдвигаются влево. Но цикл продолжает идти вперёд по индексам. В итоге происходит следующее:
первая 2 находится и удаляется

вторая 2 сдвигается на её место

цикл переходит к следующему индексу

и эта 2 просто пропускается


Правильный способ итерироваться по копии списка:
for item in items[:]:
if item == 2:
items.remove(item)

print(items)
# Output: [1, 3, 4]


Когда вы проходите по копии (поверхностной копии), индексы исходного списка не «сбиваются».

🔥 Ещё лучше использовать генератор списка (list comprehension):
items = [x for x in items if x != 2]


👑 Запомните: никогда не изменяйте список (или любую другую коллекцию) во время прямой итерации по нему. Итератор не умеет корректно работать со структурными изменениями:

он может пропускать элементы

обрабатывать один и тот же элемент дважды

или даже вызывать ошибку RuntimeError (например, в словарях)


Это плохая практика

✈️ Python Ninja
Please open Telegram to view this post
VIEW IN TELEGRAM
5🏆3
Принёс поиграться «Tetris» прямо в терминале

Нашёл недавно залипательный проект любителей консоли классический Tetris, который работает прямо в терминале. Никаких окон и графики: только клава, минимализм и чистый геймплей

Написано на Rust, запускается быстро и отлично передаёт дух «олдскульных» игр. Идеально, чтобы отвлечься на пару минут (которые внезапно превращаются в час) или подсмотреть, как делаются TUI-приложения 🎮

☝️ Ссылка источник

✈️ Python Ninja
Please open Telegram to view this post
VIEW IN TELEGRAM
2
В сети появился мощный инструмент для изучения алгоритмов «alg0dev»

Нашёл сервис который превращает сложные алгоритмы в наглядное шоу: сортировки, графы и поиск оживают прямо на экране

Каждый шаг здесь визуализирован и синхронизирован с кодом его можно остановить, прокрутить и разобраться, что происходит под капотом

Просто запускаешь и начинаешь понимать алгосы как не в себя 🐙

☝️ Ссылка источник

✈️ Python Ninja
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2
Основные операторы Python: сложение, вычитание и не только

Разбираем базовые операторы Python арифметические действия, деление с остатком и целочисленное деление. Простые примеры кода с результатами помогут быстро понять их работу.


✈️ Python Ninja
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥6
Изменение атрибута экземпляра в методе класса

Что выведет код? 👍

✈️ Python Ninja
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3
Варианты
Anonymous Quiz
66%
A
12%
B
12%
C
10%
D
Жирный подгон новичкам «Coddy» широкая подборка курсов и задач

На этой страничке «Coddy» собрано всё самое вкусное по Python: курсы, задачки, проекты и челленджи. Хотите научиться с нуля или подтянуть конкретную тему тут есть и основы, и тонкости, и куча примеров для тренировки

Ставь лайк и погнали учиться🏃‍♂️

☝️ Ссылка источник

✈️ Python Ninja
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥5
Ага... понятно 😧

✈️ Python Ninja
Please open Telegram to view this post
VIEW IN TELEGRAM
🤝72
Совет по Python: Использование setdefault

Метод setdefault() позволяет заменить 4 строки традиционного кода, избавляя от необходимости использовать условие if и ручную инициализацию.

setdefault() чётко передаёт намерение: «Если ключ отсутствует, установить для него пустой список. Затем добавить элемент в список». Это одновременно делает код короче и понятнее

Есть ли причины использовать это вместо collections.defaultdict? 🤔


Хороший вопрос. Думаю, основное различие в том, что с setdefault можно указывать разное значение по умолчанию при каждом вызове, тогда как у defaultdict одно общее значение для всех отсутствующих ключей. Метод setdefault также удобен тем, что не требует импорта

✈️ Python Ninja
Please open Telegram to view this post
VIEW IN TELEGRAM
👍41
Принёс полезное «CSES Problem Set» тренажёр по алгоритмам

Невероятно огромная подборка задач для тренировки алгоритмов. Подойдёт и новичкам (простые ввод-вывод и базовые структуры), и тем, кто готов копать глубже (динамика, графы, числа)

Отличная площадка чтобы писать код на Python, оттачивать алгоритмическое мышление и готовиться к собесам 🔍

☝️ Ссылка источник

✈️ Python Ninja
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5
Перестаньте использовать if obj == None и используйте if obj is None

В Python, когда вы пишете:
obj == None


Вы на самом деле не спрашиваете напрямую, является ли obj значением None; вместо этого вы проверяете, равен ли объект None. Хотя во многих случаях результат будет таким же, как у следующего кода:

obj is None


Поведение этих двух вариантов отличается и это важно. Когда вы используете:

obj == None


Python вызывает метод eq у объекта. Это значит, что сам объект решает, что означает «равенство с None». А этот метод можно переопределить. Если obj это экземпляр класса, который реализует eq так, что он возвращает True при сравнении с None (даже если это не None), тогда obj == None может вернуть неверный результат

Например:
class Weird:
def __eq__(self, other):
return True # Всегда считает себя равным

obj = Weird()

print(obj == None) # True
print(obj is None) # False


Здесь видно, что obj == None возвращает True из-за переопределённого поведения оператора eq. Это означает, что при использовании obj == None результат может быть непредсказуемым.

С другой стороны, когда вы пишете:

obj is None


Вы используете оператор is, который нельзя переопределить. Это означает, что результат всегда будет надёжным. Оператор is проверяет идентичность объектов, то есть указывают ли две переменные на один и тот же объект. Поскольку None это singleton (единственный экземпляр), obj is None это правильный и самый эффективный способ проверки

👑 Поэтому всегда рекомендуется и считается лучшей практикой использовать obj is None вместо obj == None это обеспечивает предсказуемость и эффективность

✈️ Python Ninja
Please open Telegram to view this post
VIEW IN TELEGRAM
👍32
Проверка списка на пустоту через сравнение с True

Что выведет код? 🥁

✈️ Python Ninja
Please open Telegram to view this post
VIEW IN TELEGRAM
3