Программистика
Canal cerrado
Лучший канал про python Ссылка для друга: https://t.me/+Ai6ughKtf5g2ZmFi Купить рекламу: https://telega.in/c/+Ai6ughKtf5g2ZmFi Админ: @JeyRahol По рекламе: @ReivuManager
Mostrar más5 580
Suscriptores
-524 horas
-437 días
-10430 días
Archivo de publicaciones
5 580
🧠 Загадка на ночь: что выведет этот код?
def func(x):
x = x + [1]
return x
a = [0]
b = func(a)
print(a, b)
Варианты:
1. [0] [0, 1]
2. [0, 1] [0, 1]
3. [0] [1]
4. Ошибка
Пиши свой вариант в комментарии! Ответ и разбор — через пару часов 🔥
Программистика|| #quiz5 580
Вы не пользуетесь даже 10% функциями нейросетей
Вы знали, что с помощью ChatGPT можно пересылать деньги с карты на карту? А слышали про режим в Claude, где он по голосовому сообщению создает 5-10 минутный ролик на YouTube?
Чтобы выжать из нейронок максимум, пользуйтесь каналом ИИнтеллигенция. Там узнаете:
➜ Как бесплатно активировать Pro-тариф в ChatGPT и Gemini
➜ Какая нейронка за вас пройдет собеседование на работу
➜ Как с помощью ИИ восстановить удалённые сообщения в ТГ
Подписывайтесь, потом сами себе спасибо скажете: https://t.me/+oyn1gm14ZwZhNDAy
5 580
🔍 Секрет `next()`: найди первый подходящий элемент без цикла
Нужно найти первый элемент в списке, удовлетворяющий условию? Вместо цикла с
break используйте next() с генератором.
❌ Было (цикл с флагом):
first = None
for item in items:
if item > 10:
first = item
break
✅ Стало (одна строка):
first = next((item for item in items if item > 10), None)
next(iterable, default) возвращает следующий элемент итератора или default, если элементов больше нет. Идеально для поиска без лишнего кода.
🟢 Где пригодится: поиск первого валидного элемента, чтение первой строки из файла по условию, получение первого значения из генератора.
Запомни: next() + генератор = чистый и быстрый поиск.Программистика|| #tips
5 580
🧰 Pelutils: швейцарский нож для Python-проектов
В каждом проекте рано или поздно появляется один и тот же набор утилит: удобный логгер с цветным выводом, парсер конфигов, таймер для замеров производительности, работа с JSON… Можно каждый раз писать это заново, а можно взять готовый инструмент, который уже всё умеет. Pelutils — это именно такой набор. Логгер с цветным выводом, стектрейсами и ротацией файлов, парсер, объединяющий CLI-аргументы и конфиги, таймер в стиле Matlab (tic/toc), профайлер, расширение для pydantic с сериализацией в человекочитаемый JSON, форматирование таблиц с поддержкой LaTeX и даже unique для массивов, работающий за линейное время.📦 Установка:
pip install pelutils
Поддерживается Python 3.9+.
🧪 Пример:
from pelutils import TT
# Замер времени
TT.tick()
# ... ваш код ...
print(f"Время: {TT.tock():.2f} сек")
# Профилирование
with TT.profile("Мой код"):
# ... код ...
print(TT) # Таблица с результатами
Программистика|| #Репозиторий5 580
🔠 Слили 4 ТБ по IT, хакингу и разработке.
⚪️ Все лучшие инструкции, гайды, книги и инструменты — без воды.
🖥 Курсы & GitHub — 579GB
☁️ Хакинг & ИБ — 756GB
🤒 OSINT — 315GB
⌨️ Python — 955GB
🙃 Linux & Bash — 459GB
😦 Работа в IT — 278GB
🖥 Общий архив — 946GB
➡️ Присоединяйтесь и скачивайте.
Пост будет удален через 48 часов.
5 580
💻 Вопрос из собеседования: Чем отличается `
__getattr__` от `__getattribute__`?
Этот вопрос проверяет, насколько глубоко вы понимаете механизм доступа к атрибутам в Python. Оба метода перехватывают обращение к атрибутам, но работают по‑разному и в разных ситуациях. Путаница в них может привести к трудноуловимым багам, особенно в прокси‑классах и ORM.
class Example:
def __getattr__(self, name):
print(f"__getattr__: {name}")
return None
def __getattribute__(self, name):
print(f"__getattribute__: {name}")
return super().__getattribute__(name)
obj = Example()
obj.x # __getattribute__: x → __getattr__: x → None
👉 Базовый ответ (которого ждут):
- __getattribute__ вызывается при любом обращении к атрибуту (даже если он существует).
- __getattr__ вызывается только если обычный поиск атрибута не удался (т.е. атрибут не найден ни в __dict__, ни в родителях, ни через дескрипторы).
👉 Глубокий разбор (для мидла+):
1. `__getattribute__` — это первая точка входа. Он перехватывает все обращения, включая доступ к self.__dict__, и если вы не будете осторожны, легко уйти в бесконечную рекурсию.
2. `__getattr__` — это «запасной аэродром». Он срабатывает только после того, как стандартный поиск провалился.
3. Порядок поиска атрибута:
- data‑дескриптор в классе → атрибут экземпляра → non‑data дескриптор → __getattr__ → AttributeError.
4. Где применяются:
- __getattr__ удобен для динамических атрибутов (например, в ORM, где поле может отсутствовать в модели, но быть в базе данных).
- __getattribute__ используется реже — для строгого контроля доступа (логирование, валидация), но требует аккуратной работы с super().
⚠️ Ловушки и частые ошибки:
1. Бесконечная рекурсия в `__getattribute__` — если внутри него обратиться к self.attr, он вызовет сам себя.
def getattribute(self, name):
return self.dict[name] # ❌ рекурсия!
Правильно: return super().__getattribute__(name).
2. Забыть, что `__getattr__` не сработает для существующих атрибутов — если вы динамически создаёте атрибут, он станет существующим, и __getattr__ больше не будет вызван.
3. Путаница с `__setattr__` — есть отдельный метод для перехвата записи атрибутов.
🧪 Пример: динамический доступ с `__getattr__`
class DynamicAttrs:
def __init__(self):
self.data = {'name': 'Алиса', 'age': 30}
def __getattr__(self, name):
if name in self.data:
return self.data[name]
raise AttributeError(f"Нет атрибута {name}")
obj = DynamicAttrs()
print(obj.name) # Алиса
print(obj.age) # 30
print(obj.city) # AttributeError
Пример: логирование через `__getattribute__`
class LoggedAttrs:
def __getattribute__(self, name):
value = super().__getattribute__(name)
print(f"Доступ к {name}: {value}")
return value
Программистика|| #jobs5 580
🚫 5 ошибок новичков в Python (и как их не допускать)
Каждый начинающий разработчик наступает на одни и те же грабли. Эти ошибки кажутся мелочами, но они могут стоить часов отладки. Вот список самых частых — и как их избежать.
1. Изменяемые объекты как аргументы по умолчанию
❌ Плохо:
def add_user(name, users=[]):
users.append(name)
return users
print(add_user("Алиса")) # ['Алиса']
print(add_user("Боб")) # ['Алиса', 'Боб'] — сюрприз!
✔️ Хорошо:
def add_user(name, users=None):
if users is None:
users = []
users.append(name)
return users
Почему: Аргумент по умолчанию создаётся один раз при определении функции, а не при каждом вызове. Список общий для всех вызовов.
2. `==` vs `is` — сравнение значений и идентичности
❌ Плохо:
if a is 5: # работает, но не гарантировано
print("Пять")
✔️ Хорошо:
if a == 5: # сравниваем значения
print("Пять")
Почему: is сравнивает идентичность объектов (адреса памяти), == — значения. Для чисел и строк Python иногда кэширует объекты, но полагаться на это нельзя. Используйте is только для None и констант.
3. Изменение списка во время итерации
❌ Плохо:
numbers = [1, 2, 3, 4, 5]
for x in numbers:
if x % 2 == 0:
numbers.remove(x)
print(numbers) # [1, 3, 5] — не все чётные удалены
✔️ Хорошо:
numbers = [1, 2, 3, 4, 5]
numbers = [x for x in numbers if x % 2 != 0]
print(numbers) # [1, 3, 5]
# Или итерация по копии:
for x in numbers[:]:
if x % 2 == 0:
numbers.remove(x)
Почему: При удалении элементов индексы сдвигаются, и итератор может пропускать элементы.
---
4. Конкатенация строк в цикле (`+` вместо `join`)
❌ Плохо:
result = ""
for word in ["A", "B", "C"]:
result += word
✅ Хорошо:
result = "".join(["A", "B", "C"])
Почему: Строки неизменяемы. Каждая операция += создаёт новую строку, что приводит к квадратичному росту сложности. Для больших данных это ощутимо.
5. `range(len(...))` вместо `enumerate`
❌ Плохо:
items = ['a', 'b', 'c']
for i in range(len(items)):
print(i, items[i])
✔️ Хорошо:
items = ['a', 'b', 'c']
for i, item in enumerate(items):
print(i, item)
Почему: Код с enumerate читается лучше, он меньше подвержен ошибкам и работает с любыми итерируемыми объектами, а не только с индексируемыми.
💡 Запомни:
🔴 Избегай изменяемых объектов как аргументов по умолчанию.
🔴 == для значений, is для идентичности (особенно с None).
🔴 Не изменяй список во время итерации — используй копию или списковое включение.
🔴 Для сборки строк используй ''.join().
🔴 В цикле с индексом и значением предпочти enumerate
Программистика|| #doc5 580
👩💻 Гайд по Python параллелизму: Async, Потоки, Процессы
📱 ПервоисточникПрограммистика|| #video
5 580
🧹 Лайфхак: `_` для игнорирования значений
При распаковке часто попадаются ненужные элементы. Не придумывайте имена для мусора — используйте подчёркивание.
# Берём только первый и последний
first, *_, last = [10, 20, 30, 40, 50]
print(first, last) # 10 50
# Игнорируем второй элемент
x, _, z = (1, 2, 3)
print(x, z) # 1 3
# В циклах, если индекс не нужен
for _ in range(5):
print("Привет")
🟢 Запомни: _ — обычная допустимая переменная, но по соглашению означает «значение не нужно». Экономит имена и показывает намерение.
Программистика|| #tips5 580
🖥 Cookiecutter — это кроссплатформенный инструмент командной строки для быстрого создания проектов на основе шаблонов!
Он используется для генерации проектов в различных языках программирования, включая Python, C и другие, упрощая настройку стандартных структур каталогов и файлов. 💡 Cookiecutter позволяет создавать проекты, используя как удалённые шаблоны (например, из GitHub), так и локальные, без необходимости знаний Python. Инструмент поддерживает пользовательские параметры, расширяемость, работу с любым форматом файлов, а также интеграцию с pipx для удобной установки.Программистика|| #Репозиторий
5 580
Решать технические задачи — самая простая часть работы в IT.
Сложности начинаются там, где нужно договариваться со смежниками, выстраивать процессы в хаосе и осознанно управлять карьерой.
В канале @ulshinblog Никита (руководитель разработки в Highload, 10+ лет в IT) разбирает эти темы через понятную логику и личный опыт:
📍 Как пройти секцию System Design? Пошаговый чек-лист от интервьюера;
📍 Как находить внутренние сайд-проекты, которые принесут пользу и бизнесу, и вашему карьерному росту;
📍 Защита от плохой обратной связи: как вежливо поставить на место коллегу с неконструктивным фидбеком;
📍 Инженерный конвейер самообучения: как перестать читать книги для галочки и внедрять знания в жизнь и карьеру;
📚 База 50+ авторских обзоров IT-литературы для сильного инженера: разработка, управление, архитектура, мышление.
👉 Присоединяйтесь
5 580
🧩 Распаковка (unpacking) по-взрослому: `*`, `` и всё, что вы могли пропустить**
Все знают
a, b = 1, 2. Но распаковка в Python гораздо глубже. Это мощный инструмент, который позволяет писать лаконичный и выразительный код без лишних индексов и временных переменных. Разбираем продвинутые приёмы.
📦 Распаковка с `*` (звёздочка) — остаток последовательности
Звёздочка забирает «всё остальное» в список.
first, *middle, last = [1, 2, 3, 4, 5]
print(first) # 1
print(middle) # [2, 3, 4]
print(last) # 5
Можно использовать в любом месте, но только один раз.
*_, last = [1, 2, 3] # игнорируем всё, кроме последнего
print(last) # 3
📦 Распаковка итераторов (не только списков)
Звёздочка работает с любым итерируемым объектом.
def gen():
yield 1
yield 2
yield 3
first, *rest = gen()
print(first, rest) # 1 [2, 3]
📦 Распаковка в вызовах функций: `func(*args)`
Передаём элементы списка как отдельные аргументы.
def add(a, b, c):
return a + b + c
nums = [10, 20, 30]
print(add(*nums)) # 60
Особенно полезно для print:
items = ['a', 'b', 'c']
print(*items, sep=', ') # a, b, c
📦 Распаковка словарей: `**kwargs`
Две звёздочки — для словарей. Передаёт пары ключ-значение как именованные аргументы.
def user_info(name, age):
print(f"{name}, {age} лет")
data = {'name': 'Алиса', 'age': 30}
user_info(**data) # Алиса, 30 лет
💡 Запомни:
- * — распаковывает последовательности (списки, кортежи, строки, генераторы).
- ** — распаковывает словари (в именованные аргументы или слияние).
- Можно комбинировать в одном выражении.
- Не злоупотребляй сложной вложенной распаковкой — читаемость важнее.
Программистика|| #doc5 580
👩💻 fastapi-injectable — расширение для FastAPI, которое улучшает систему внедрения зависимостей, делая её доступной за пределами HTTP-маршрутов!
Это особенно полезно для случаев, когда нужно использовать зависимости в контекстах, таких как фоновые задачи, команды CLI, или другие сценарии, не связанные с обработкой HTTP-запросов. Библиотека предоставляет возможность применения декоратора Depends для внедрения зависимостей в различных частях приложения, что упрощает повторное использование кода и делает архитектуру более гибкой.Программистика|| #Репозиторий
5 580
🧠 Загадка на ночь: что выведет этот код?
print(any([]))
print(all([]))
Варианты:
1. False и False
2. True и True
3. False и True
4. True и False
Пиши свой вариант в комментарии!
Программистика || #quiz5 580
🔥 Логируй как профи: что не так с
print() и как писать логи правильно
Логирование — это как чёрный ящик самолёта: пока всё работает, про него не думаешь. Но когда что-то ломается, без него — катастрофа.
И да, print() — это не логирование, даже если вы очень его любите.
🧱 Почему не print()?
🟢 print() не умеет разделять уровни сообщений (ошибка или просто инфо) 🟢 Его нельзя легко перенаправить в файл или на удалённый сервер 🟢 В продакшене вы не сможете отследить проблему, если логи разбросаны по консоли📌 Базовое логирование
import logging
logging.basicConfig(level=logging.INFO)
logging.info("Приложение запущено")
📎 basicConfig быстро включит логирование, но на продакшене лучше задавать формат и место хранения.
🎯 Уровни логов
🟢 DEBUG — детальная отладка 🟢INFO — обычная информация 🟢 WARNING — что-то подозрительное 🟢ERROR — ошибка, но система ещё жива 🟢CRITICAL — всё очень плохо📦 Логи в файл
logging.basicConfig(
filename='app.log',
level=logging.INFO,
format='%(asctime)s — %(levelname)s — %(message)s'
)
Теперь логи сохраняются в app.log с временем и уровнем.
🔄 Ротация логов
Чтобы файл логов не вырос до гигабайтов:
from logging.handlers import RotatingFileHandler
handler = RotatingFileHandler('app.log', maxBytes=2_000_000, backupCount=5)
logging.basicConfig(
handlers=[handler],
level=logging.INFO,
format='%(asctime)s - %(levelname)s - %(message)s'
)
📎 При достижении 2MB файл заменяется, и хранится 5 последних копий.
🧪 Логируем ошибки с трассировкой
try:
1 / 0
except ZeroDivisionError:
logging.exception("Ошибка деления на ноль")
➡️logging.exception() автоматически добавляет traceback в лог.
💡 Запомни:
🟢 Не логируй пароли и токены 🟢 Разделяй уровни — не пиши error там, где warning 🟢 Настрой логи под продакшен заранее, а не когда уже горитПрограммистика || #Статья
5 580
⚡️ Tyro — это инструмент для генерации CLI-интерфейсов из аннотированного по типам кода Python. В отличие от устаревшего
argparse, он позволяет определять аргументы стандартными аннотациями типов, значениями по умолчанию и строками документации (docstrings). Всё, что вам нужно — это определить функцию или датакласс и передать его в tyro.cli(). Инструмент отлично распознаётся IDE и статическими анализаторами (mypy, Pyright), поддерживает вложенные структуры, подкоманды и генерацию удобного текста помощи. Это лучший выбор для создания типобезопасных и хорошо документированных CLI-утилит.
🐱 Ссылка на GitHub
Программистика || #Репозиторий
¡Ya disponible! Investigación de Telegram 2025 — los principales insights del año 
