Программистика
Закрытый канал
Лучший канал про python Ссылка для друга: https://t.me/+Ai6ughKtf5g2ZmFi Купить рекламу: https://telega.in/c/+Ai6ughKtf5g2ZmFi Админ: @JeyRahol По рекламе: @ReivuManager
Больше5 579
Подписчики
-524 часа
-437 дней
-10430 день
Архив постов
5 579
Работаете с СУБД? Присоединяйтесь к сообществу Pangolin!
Телеграм-канал для разработчиков и администраторов баз данных.
Pangolin — это PostgreSQL с 80+ доработками, и мы открыто рассказываем о его разработке.
У нас вы найдете:
• Технические детали и архитектурные решения
• Разборы доработок PostgreSQL
• Ответы на вопросы по эксплуатации и коду
• Кейсы внедрения и оптимизации
• Вакансии для тех, кто хочет работать с нами
• Вебинары и встречи с экспертами
• Знакомство с командой: хобби, книги и интересы
Присоединяйтесь к сообществу, где говорят на языке баз данных
Подписаться
#реклама 16+
О рекламодателе
5 579
🗝 Секрет defaultdict: забудь про `if key in dict`
Устал писать
if key in dict: dict[key].append(x) else: dict[key] = [x] каждый раз, когда нужно собрать значения по ключам? В Python есть элегантный способ — defaultdict из модуля collections. Он сам создаёт значение по умолчанию для отсутствующего ключа.
❌ Было (муторно и длинно):
data = [('a', 1), ('b', 2), ('a', 3)]
result = {}
for key, val in data:
if key in result:
result[key].append(val)
else:
result[key] = [val]
✔️ Стало (чисто и понятно):
from collections import defaultdict
result = defaultdict(list)
for key, val in data:
result[key].append(val) # список создаётся автоматически
🟢 Почему это круто:
- Кода меньше в 2–3 раза.
- Читается как обычная фраза: «для ключа добавить значение».
- Работает с любыми типами: defaultdict(int) для счётчиков, defaultdict(set) для уникальных значений.
Любой тип можно подставить:
counter = defaultdict(int)
for word in text.split():
counter[word] += 1 # вместо counter[word] = counter.get(word, 0) + 1
Забудь про ручные проверки — defaultdict сделает код проще и быстрее.
Программистика|| #tips5 579
Изоляция рунета ближе, чем ты думаешь
Loading … ██████████████] 99%Роскомнадзору дали карт-бланш на блокировки, а «белые списки» сайтов тестируют уже в десятках регионов. И гайки будут закручиваться только сильнее. Чтобы в одночасье не лишиться доступа к свободному Интернету, просто сохрани Only Hack. Тут профессиональный хакер делится фишками, с которыми доступ к глобальной сети у тебя будет даже в случае ядерного апокалипсиса. Не жди момента «Х». Перестрахуйся подпиской.
5 579
На Stepik запустили курс «От новичка к уверенности в коде на Python»
Курс создан для новичков, которым важно не заучить команды, а понять логику. Наглядные схемы и визуальные разборы показывают, что происходит внутри программы и как она работает
Много практики, понятные объяснения решений не дадут застрять на теории. Материал предлагает вам не иллюзию знаний, а ощущение контроля: вы ясно видите как из нескольких строк кода рождается работающая программа
Что внутри:
✅переменные и типы данных
✅условия и логика программ
✅циклы и рекурсия
✅функции и работа с вводом данных
✅списки, словари и множества
✅базовое ООП
✅работа с библиотеками Python
✅десятки задач и упражнений
Эти знания фундамент для написания простых ботов и автоматизации задач
Скидка 25%, действует 48 часов
🔗Пройти курс на Stepik
5 579
Как разработчик решил параллельно найму пилить свои бизнес-проекты с нулевым опытом: дневник с передовой
Меня зовут Александр Торбек, И я попал в день сурка: код писать умею, зарплата стабильная. Но в заднице зудит ощущение катастрофического застоя.
Поэтому я сделал глупейшую вещь — начал разрабатывать продукты. Без связей, плана и стратегии. В блоге буду фиксировать:
— идеи (и почему 90% из них — говно собаки)
— что сделал, сколько заработал
— мысли айтишника, который впервые думает как продакт, а не как тупой исполнитель
Я хочу пройти весь путь от основателя продукта до продажника. И выяснить, смогу ли без бизнес-бэкграунда выйти на уровень дядек в элитных пиджаках.
Если тоже хотите создавать свои продукты — посмотрите, как я набиваю шишки первым: @atorbek_it
5 579
Бесплатная конференция по PostgreSQL
Регистрируйся на бесплатную конференцию по PostgreSQL — 19.03.2026.📅
Эксперты расскажут о разработке, администрировании и новинках мира Postgres.
✅ Бесплатное участие
✅ Опытные спикеры
✅ 25+ тематических докладов
✅ Рабочие кейсы
Каждый участник получает именной Сертификат участника мероприятия.
Одни из немногих спикеров конференции:
— Андрей Бородин
PostgreSQL Major contributor, руководитель подразделения разработки РСУБД с открытым исходным кодом Yandex Cloud
— Родион Хабибов
DevOps-инженер «СберСервис»
— Андрей Овчаренко
Руководитель отдела Java-разработки Московской биржи
... и многие другие.
Регистрируйся, будет интересно!
И бесплатно!
Зарегистрироваться
#реклама 16+
pgbootcamp.ru
О рекламодателе
5 579
👩💻 Однострочники на Python: код, который объясняется кодом
Однострочники в Python — это не только способ покрасоваться, но и отличный способ понять, как работают встроенные функции и генераторы. Когда ты видишь
[x for x in ... if ...], внутри происходит целая симфония: итерация, фильтрация, создание списка. Давай разберём пару примеров и заглянем под капот.
👍 Пример 1: Плоский список из списка списков
matrix = [[1, 2], [3, 4], [5, 6]]
flat = [num for row in matrix for num in row]
print(flat) # [1, 2, 3, 4, 5, 6]
Что здесь происходит?
Этот comprehension можно переписать как обычный вложенный цикл:
flat = []
for row in matrix:
for num in row:
flat.append(num)
Но comprehension выполняется быстрее и записывается компактнее. Обрати внимание на порядок: сначала внешний цикл (for row in matrix), потом внутренний (for num in row), и наконец выражение num. Python интерпретирует именно так.
Заглянем под капот:
def flatten_comp(matrix):
return [num for row in matrix for num in row]
import dis
dis.dis(flatten_comp)
Вы увидите байт-код, где создаётся пустой список, затем два цикла FOR_ITER, и внутри LIST_APPEND. Понимание этого помогает писать эффективные comprehension.
👍 Пример 2: Словарь из двух списков (zip + dict)
keys = ['name', 'age', 'city']
values = ['Alice', 25, 'Moscow']
person = dict(zip(keys, values))
print(person) # {'name': 'Alice', 'age': 25, 'city': 'Moscow'}
Что здесь происходит?
zip соединяет элементы списков попарно, создавая итератор кортежей. dict принимает итератор пар и строит словарь. Это намного быстрее ручного цикла:
person = {}
for i in range(len(keys)):
person[keys[i]] = values[i]
И компактнее, и эффективнее. Кстати, zip работает с любыми итерируемыми объектами и останавливается на самом коротком.
Как это работает внутри:
pairs = zip(keys, values)
print(next(pairs)) # ('name', 'Alice')
print(next(pairs)) # ('age', 25)
# и так далее
👍 Пример 3: Быстрая фильтрация с filter и лямбдой
nums = [1, 2, 3, 4, 5, 6]
evens = list(filter(lambda x: x % 2 == 0, nums))
print(evens) # [2, 4, 6]
Что здесь происходит?
filter принимает функцию и итерируемый объект, оставляет только те элементы, для которых функция вернула True. Но зачем лямбда? Можно использовать уже готовые функции. Например, для чётности можно было бы написать lambda x: not x % 2, но суть не в этом.
Интересно, что filter возвращает итератор, поэтому мы оборачиваем в list(). Если элементов много, можно не создавать список сразу, а использовать ленивые вычисления.
Развернём вручную:
def my_filter(func, iterable):
for item in iterable:
if func(item):
yield item
evens = list(my_filter(lambda x: x % 2 == 0, nums))
👍 Пример 4: Условное выражение в генераторе списка
words = ['hello', 'world', 'python', 'code']
result = [w.upper() if len(w) > 4 else w for w in words]
print(result) # ['hello', 'WORLD', 'PYTHON', 'code']
Что здесь происходит?
Тернарный оператор x if condition else y внутри comprehension. Это не фильтр, а именно преобразование с условием. Важно понимать, что сначала выполняется for w in words, затем для каждого w вычисляется w.upper() if len(w) > 4 else w. Порядок: сначала цикл, потом выражение.
Байт-код это подтвердит:
def f(words):
return [w.upper() if len(w) > 4 else w for w in words]
Будет цикл, внутри вызов len, сравнение, и два пути — либо upper, либо просто w.
🔍 Задание для самопроверки:
Напишите comprehension, который создаёт словарь, где ключи — числа от 0 до 9, а значения — их квадраты. А теперь объясните, как это работает внутри.
Ответ:
{k: k**2 for k in range(10)}
Здесь итерация по range(10), для каждого k вычисляется пара k: k**2, и словарь собирается. Внутри — цикл и добавление элементов.
💡 Запомни:
Чем лучше ты понимаешь, как работает "под капотом" обычный код, тем осознаннее будешь использовать короткие записи. Однострочники — это не цель, а средство. Главное — чтобы код оставался читаемым.
А теперь попробуй сам разобрать любой свой comprehension с помощью dis.dis() — увидишь, как Python видит твой код.
Программистика || #doc5 579
Уйти из найма и работать удалённо на себя?
Звучит как план на понедельник, но к четвергу отпускает.
Я ни дня своей жизни не проработал «на дядю» — зато построил десятки собственных проектов и вывел их на монетизацию.
Где-то стрельнуло, где-то прогорел, никакого инфоцыганства, только личный опыт и практика со всеми взлётами и падениями.
У себя в блоге «айти на миллиард» пишу:
– Как находить идеи? – Как быстро запускать MVP? – Как привлекать первых пользователей?Если тебе близка айти-сфера и ты давно хочешь создать свой пет-проект, нам по пути: https://t.me/+P9xCxnr5WlA1MjMy
5 579
👩💻 Вопрос с собеседования: Что такое замыкание (closure) и как оно работает в Python?
Это один из вопросов, который проверяет, понимаете ли вы, как Python работает с областями видимости и функциями высшего порядка. Просто сказать «функция внутри функции» — мало. Надо показать, как захватываются переменные и где это применяется.
📌 Базовый ответ (которого ждут от джуна):
Замыкание (closure) — это вложенная функция, которая запоминает значения переменных из внешней (охватывающей) функции, даже после того, как внешняя функция завершила выполнение.
def outer(x):
def inner(y):
return x + y
return inner
add_5 = outer(5) # x = 5 зафиксировано
print(add_5(10)) # 15 — inner помнит x
🧱 Глубокий разбор (для мидла и сеньора):
1. Как это работает (лексическая область видимости):
При создании вложенной функции Python запоминает не только её код, но и окружение (словарь __closure__), где хранятся ссылки на переменные из внешних областей.
print(add_5.__closure__) # (<cell at 0x...: int object at 0x...>,)
print(add_5.__closure__[0].cell_contents) # 5
2. Ключевое слово `nonlocal`:
Чтобы изменять захваченную переменную внутри замыкания, нужно объявить её как nonlocal. Иначе Python сочтёт её локальной.
def counter():
count = 0
def increment():
nonlocal count
count += 1
return count
return increment
c = counter()
print(c()) # 1
print(c()) # 2
3. Типичные применения:
🟢 Декораторы — классика: внешняя функция принимает функцию, внутренняя оборачивает её, используя аргументы декоратора.
🟢 Фабрики функций — создание специализированных функций на лету (как add_5 выше).
🟢 Обработчики событий / коллбэки — фиксация состояния в момент создания.
4. Ловушка: позднее связывание (late binding)
В цикле все созданные замыкания запоминают одно и то же последнее значение переменной, если не использовать хитрость с аргументом по умолчанию.
funcs = []
for i in range(3):
funcs.append(lambda: i)
for f in funcs:
print(f()) # 2 2 2, а не 0 1 2
# Исправление:
funcs = []
for i in range(3):
funcs.append(lambda x=i: x) # фиксируем значение через аргумент
💡 Итоговый ответ для собеседования:
1. Определение: Вложенная функция, которая сохраняет доступ к переменным внешней функции после её завершения.
2. Механизм: Интерпретатор хранит ссылки на захваченные переменные в атрибуте __closure__.
3. Ключевой момент: Для изменения захваченной переменной внутри замыкания нужно nonlocal.
4. Где используется: Декораторы, фабрики функций, коллбэки, карринг.
5. Типичная ошибка: Позднее связывание в циклах — замыкания захватывают не значение, а переменную, поэтому все видят последнее значение.
Запомните: джуну достаточно первого пункта и простого примера. Но если вы покажете __closure__, расскажете про nonlocal и упомянете ловушку с циклом — интервьюер поймёт, что вы действительно разбираетесь.
Программистика || #jobs5 579
⚡️Слита База из 1000+ топовых курсов и материалов для айтишников
Отсортировали их для вашего удобства и выложили в телеграм-каналы по категориям:
🤖 Нейросети – 855+ материалов
🖥 Python — 1558+ материалов
👩💻 Frontend — 1241+ материалов
👩💻 Backend — 1095+ материалов
⚙️ Программы — 978+ материалов
📚 Книги по IT — 779+ материалов
Всё лучшее про IT бесплатно — уже на Базе 🚀
5 579
🧠 Неизвестный кодер взломал ChatGPT и вывел систему из-под всех запретов
После его промта нейросеть перестаёт «думать по правилам» и начинает выдавать запретные материалы, 18+ графику и скрытые функции
Этот человек анонимно выкладывает свои наработки бесплатно в НейроПульс:
— Скрипт, отключающий лимит в ChatGPT и ещё 25 нейросетях
— Промт, который создаёт вирусы даже под iOS
— Алгоритм распознавания личных данных
Сохраняй и пользуйся, пока доступно: https://t.me/+V19zvWBfVYIwN2Uy
5 579
Repost from Карманный хакер
🗂 WinFile — тот самый древний “Диспетчер файлов” из Windows 90-х. И да, Microsoft выложила его исходники на GitHub ещё в 2018-м.
Это был их первый нормальный графический файл-менеджер: копировать/таскать/удалять мышкой — революция для тех лет. Репо тут: https://github.com/Microsoft/winfile
Пару фактов, чтобы прочувствовать эпоху:
первая версия была 16-битная и жила в мире 8.3: никаких пробелов, никаких “длинных имён”. Хотел “LongFileName.txt”? Получай LONGFI~1.TXT.
потом переписали под Windows NT (32-bit) — длинные имена, NTFS, взрослая жизнь.
как компонент Windows он дожил до NT 4.0 SP6a, а последняя 16-битная версия — до Windows Me.
В репозитории код из ветки NT4, слегка подпиленный, чтобы нормально собираться на современных Windows/VS и запускаться на 64-битах. Запускаешь — и ловишь главное: Windows тащит на себе такую обратную совместимость, что софт из прошлого века всё ещё оживает почти без сопротивления. Для безопасника это не “милота”, а напоминание: legacy в Windows — не баг, а образ жизни.
➡️Ссылка
Карманный хакер
5 579
👩💻 Декораторы в Python: от простого к сложному (и не сойти с ума)
Декораторы — одна из самых элегантных, но и самых пугающих фич Python для новичков. "Функция, которая принимает функцию и возвращает функцию, которая оборачивает функцию"... Звучит как заклинание. На деле же это просто способ добавить код до и после вызова функции, не меняя её саму. Разбираемся, как перестать бояться и начать декорировать.
🧱 Что такое декоратор (на пальцах)
Декоратор — это функция, которая принимает другую функцию и возвращает её же, но с «прицепом». Представь, что ты хочешь логировать каждый вызов функции. Вместо того чтобы вставлять
print в каждую функцию, ты пишешь один декоратор и просто «надеваешь» его на нужные функции знаком @.
Пример простейшего декоратора:
def logger(func):
def wrapper(*args, **kwargs):
print(f"Вызов функции {func.__name__} с args={args}, kwargs={kwargs}")
result = func(*args, **kwargs)
print(f"Результат: {result}")
return result
return wrapper
@logger
def add(a, b):
return a + b
add(2, 3)
# Вывод:
# Вызов функции add с args=(2, 3), kwargs={}
# Результат: 5
Синтаксический сахар @logger делает то же самое, что и add = logger(add). Просто и красиво.
🧱 Когда декораторы — это хорошо (и удобно)
1️⃣. Логирование и отладка:
```python
def log_calls(func):
def wrapper(*args, **kwargs):
print(f"→ {func.__name__}")
return func(*args, **kwargs)
return wrapper
@log_calls
def process_data():
# ... долгая работа
pass
```
2️⃣. Замер времени выполнения:
```python
import time
def timer(func):
def wrapper(*args, **kwargs):
start = time.time()
result = func(*args, **kwargs)
print(f"{func.__name__} выполнена за {time.time()-start:.3f} сек")
return result
return wrapper
@timer
def heavy_computation():
time.sleep(1)
```
🧱 Когда декораторы могут навредить (антипаттерны)
1. ❌ Потеря имени и документации исходной функции:
def logger(func):
def wrapper(*args, **kwargs):
return func(*args, **kwargs)
return wrapper
@logger
def hello():
"""Говорит привет"""
print("Hello")
print(hello.__name__) # 'wrapper' — потеряли имя!
print(hello.__doc__) # None — потеряли документацию!
Решение: использовать functools.wraps:
from functools import wraps
def logger(func):
@wraps(func)
def wrapper(*args, **kwargs):
return func(*args, **kwargs)
return wrapper
2. ❌ Слишком много декораторов (читаемость падает):
@login_required
@require_http_methods(["POST"])
@csrf_exempt
@cache_page(60)
@transaction.atomic
def my_view(request):
# Что тут вообще происходит?
pass
Совет: группируйте декораторы, выносите сложную логику в отдельные функции.
3. ❌ Декоратор с аргументами (без понимания):
def repeat(n):
def decorator(func):
@wraps(func)
def wrapper(*args, **kwargs):
for _ in range(n):
func(*args, **kwargs)
return wrapper
return decorator
@repeat(3)
def say():
print("Ку-ку")
Здесь repeat — это фабрика декораторов. Сначала вызывается repeat(3), она возвращает декоратор, который уже применяется к функции. Если запутались — ничего страшного, пишите явно: @repeat(3).
🔗 Подробнее в статье
👍 Запомни:
Декораторы — это не магия, а просто синтаксический сахар для замыканий. Они делают код чище и переиспользуемее. Начинай с простых (@timer, @logger), а потом переходи к фабрикам с аргументами. И никогда не забывай про @wraps.
Программистика || #Статья5 579
Поздравление с 23 февраля!!
Сегодня, день,когда мы отмечаем мужество, отвагу и преданность. В этот особый день хочется пожелать Вам:
1) Смелости в принятии решений и стремлении к новым вершинам. 2) Удачи в каждом начинании и ярких побед. 3) Счастья в кругу близких и друзей. 4) Здоровья и крепкой энергии для реализации всех планов. 5) Вдохновения в работе и личной жизни.Пусть каждый день будет наполнен яркими моментами, а ваши сердца всегда будут полны решимости и доброты. Спасибо, что вы с нами, и пусть наш канал продолжает приносить радость и полезную информацию!!! С праздником, дорогие друзья 🎉
5 579
Поздравление с 23 февраля!!
Сегодня, день,когда мы отмечаем мужество, отвагу и преданность. В этот особый день хочется пожелать Вам:
1) Смелости в принятии решений и стремлении к новым вершинам. 2) Удачи в каждом начинании и ярких побед. 3) Счастья в кругу близких и друзей. 4) Здоровья и крепкой энергии для реализации всех планов. 5) Вдохновения в работе и личной жизни.Пусть каждый день будет наполнен яркими моментами, а ваши сердца всегда будут полны решимости и доброты. Спасибо, что вы с нами, и пусть наш канал продолжает приносить радость и полезную информацию!!! С праздником, дорогие друзья 🎉
5 579
⚡️Hype Tech анонимно публикует промпты, ломающие ИИ-ограничения
Генерируй 18+ изображения, создавай вирусы и упрости ЛЮБУЮ рутину — всё это бесплатно и в открытом доступе
Топ-промты от Hype Tech:
• Баг на бесконечный доступ в NanoBanana и ChatGPT
• Промпты для снятия цензуры с ChatGPT
• Полный пробив и поиск скрытых данных человека
Подпишись и забери самые мощные ИИ для твоего арсенала: https://t.me/+xjSLfhZQOwMGQy
Уже доступно! Исследование Telegram 2025 — ключевые инсайты года 
