Программистика
Закрытый канал
Лучший канал про python Ссылка для друга: https://t.me/+Ai6ughKtf5g2ZmFi Купить рекламу: https://telega.in/c/+Ai6ughKtf5g2ZmFi Админ: @JeyRahol По рекламе: @ReivuManager
Больше5 791
Подписчики
-624 часа
+157 дней
-4130 дней
Архив постов
5 791
🗝 Секрет
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 сделает код проще и быстрее.
Программистика || #jobs5 791
🐧 Хочешь освоить Linux и Python, но без скучных лекций и боли?
В PyLinux всё по-другому:
🔵 Простые объяснения, даже сложных тем
🔵 Полезные скрипты и примеры
🔵 Книги, шпаргалки, гайды
🔵 и многое другое....
👉 Всё, чтобы ты рос в IT без стресса и хаоса!
5 791
🎨 ASCII Art Generator: Преврати свой текст в гигантские буквы за секунду
Скучно смотреть на обычный текст в терминале? Хочется сделать приветствие эпичным или оформить скрипт как в киберпанке? ASCII-арт — это стильно, но рисовать его руками — занятие для терпеливых. Есть библиотека, которая делает это за тебя.
👉 Скрипт `ascii_art.py`:
#!/usr/bin/env python3
"""
ASCII Art Generator — превращает обычный текст в огромные буквы.
Использование: python ascii_art.py "Привет, мир!"
"""
import sys
from pyfiglet import Figlet
def main():
if len(sys.argv) < 2:
print("❌ Укажи текст: python ascii_art.py 'Твой текст'")
sys.exit(1)
text = ' '.join(sys.argv[1:])
fig = Figlet(font='slant') # можно сменить font='standard', 'big', 'bubble'...
ascii_art = fig.renderText(text)
print(ascii_art)
if __name__ == '__main__':
main()
🛠 Установка:
pip install pyfiglet
🚀 Запуск:
python ascii_art.py "Программистика рулит"
📋 Результат:
____ _ _ _ _ _ | _ \ _ __ _ __ ___ (_)_ __ ___ __ _ _ __ __ _ __| | | |_ _ _ | | |_ | |_) | '__| '_ ` _ \| | '_ ` _ \ / _` | '__/ _` |/ _` | | __| | | | | | __| | __/| | | | | | | | | | | | | | (_| | | | (_| | (_| | | |_| |_| | | | |_ |_| |_| |_| |_| |_|_|_| |_| |_|\__,_|_| \__,_|\__,_| \__|\__,_| |_|\__|➕ Бонус: версия с выбором шрифта и цветом
#!/usr/bin/env python3
import sys
from pyfiglet import Figlet
# Список доступных шрифтов
fonts = ['standard', 'slant', 'bubble', 'digital', 'isometric1', 'starwars']
def main():
if len(sys.argv) < 2:
print("❌ Использование: python ascii_art.py [шрифт] 'Текст'")
print("📋 Доступные шрифты:", ', '.join(fonts))
sys.exit(1)
# Если первый аргумент — шрифт, используем его
if sys.argv[1] in fonts:
font_name = sys.argv[1]
text = ' '.join(sys.argv[2:])
else:
font_name = 'standard'
text = ' '.join(sys.argv[1:])
try:
fig = Figlet(font=font_name)
print(fig.renderText(text))
except Exception as e:
print(f"❌ Ошибка: {e}")
if __name__ == '__main__':
main()
🧪 Пример с выбором шрифта:
python ascii_art.py starwars "Май"
Получишь надпись в стиле «Звёздных войн».
💎 Итог:
Теперь твой терминал может выглядеть как хакерский кинофильм. Бери скрипт, экспериментируй со шрифтами и удивляй коллег. Код настолько простой, что его можно добавить в любой проект за минуту.
Программистика || #scripts5 791
🔠 Слили 4 ТБ по IT, хакингу и разработке.
⚪️ Все лучшие инструкции, гайды, книги и инструменты — без воды.
🖥 Курсы & GitHub — 579GB
☁️ Хакинг & ИБ — 756GB
🤒 OSINT — 315GB
⌨️ Python — 955GB
🙃 Linux & Bash — 459GB
😦 Работа в IT — 278GB
🖥 Общий архив — 946GB
➡️ Присоединяйтесь и скачивайте.
Пост будет удален через 48 часов.
5 791
👀 Python. Уроки для начинающих
В книге 22 урока, более 40 практических упражнений и заданий для самостоятельной работы. Описан язык Python: его основы, типы данных, управляющие выражения, функции, объекты, классы, исключения, модули и пакеты. Рассмотрены более развитые инструменты языка: установка и применение дополнительных библиотек, многопоточное, многопроцессное и конкурентное программирование, аннотации типов. Рассказано о практическом применении Python и различных библиотек для загрузки данных из Интернета, парсинга веб-страниц, работы с базами данных, программирования графических и веб-приложений, математических расчетов, вывода графиков и работы с искусственным интеллектом. Электронный архив на сайте издательства содержит все примеры из книги.Программистика || #Книги
5 791
⚡️ Linux теперь в Telegram!
Ребята делают реально классный канал про IT - просто, понятно и без воды.
О Linux, DevOps, разработке, безопасности и инструментах, которые помогают работать эффективнее.
Подписывайтесь: @recura_tech
5 791
Подборка каналов IT от наших друзей:
🦥 Lazy_Programmer – Для ленивых
📲 Lazy_Programmer – В MAXе тоже есть место для лени
🤩 iwannabeprogrammer — IT-мемы
📲 iwannabeprogrammer – Мы в MAX
🎬 videos_it — База видеоуроков по IT
🐧 Linux_Club — Для Linuxоидов
📔 BOOKS — Читать не перечитать
🇷🇺 our_computer — У нас как в СССР
🔐 LazySecurity — Канал по ИБ
🔥 floppydisky — ITUMOR
📱 codebase_frontend — Красим кнопки
➡️ LazyDevOps — Канал для дев и псов
🐈⬛️ LazyTester — Протестируй канал!
5 791
💻 Вопрос с собеседования: Что такое генераторы в Python и чем они отличаются от обычных функций?
Генераторы — одна из самых мощных фич Python, но новички часто путают их с обычными функциями или списковыми включениями. На собеседовании хотят услышать не только определение, но и понимание, когда и зачем их использовать.
📌 Базовый ответ (которого ждут от джуна):
Генератор — это функция, которая использует
yield вместо return. Вместо того чтобы вернуть одно значение и завершиться, она возвращает итератор, который выдаёт значения по одному, сохраняя своё состояние между вызовами.
def countdown(n):
while n > 0:
yield n
n -= 1
for num in countdown(5):
print(num) # 5, 4, 3, 2, 1
В отличие от обычной функции, которая выполняется целиком и возвращает результат, генератор «замораживается» после каждого yield и возобновляется при следующем вызове.
🧱 Глубокий разбор (для мидла и сеньора):
1. Как это работает под капотом
Генератор — это особый вид итератора. Когда ты вызываешь функцию с yield, Python создаёт объект-генератор, который реализует протокол итерации (__iter__ и __next__).
def gen():
yield 1
yield 2
g = gen()
print(next(g)) # 1
print(next(g)) # 2
print(next(g)) # StopIteration
Всё состояние генератора (локальные переменные, текущая позиция) хранится в самом объекте. Это делает генераторы ленивыми: значения вычисляются только по запросу.
2. Генераторы vs списковые включения
# Список занимает память
squares_list = [x**2 for x in range(1000000)] # 8 МБ
# Генератор не занимает память
squares_gen = (x**2 for x in range(1000000)) # почти 0 байт
Генераторное выражение (круглые скобки) создаёт генератор, который выдаёт значения по одному. Это идеально для работы с большими данными, которые не помещаются в память.
3. Генераторы для бесконечных последовательностей
def fibonacci():
a, b = 0, 1
while True:
yield a
a, b = b, a + b
fib = fibonacci()
for _ in range(10):
print(next(fib)) # 0, 1, 1, 2, 3, 5, 8, 13, 21, 34
Обычная функция не может вернуть бесконечную последовательность, а генератор может.
4. Двусторонняя связь: `send()`, `throw()`, `close()`
Генераторы могут не только выдавать значения, но и принимать их извне.
def grep(pattern):
print(f"Ищу {pattern}")
while True:
line = yield
if pattern in line:
print(f"Найдено: {line}")
g = grep("python")
next(g) # активация
g.send("Java рулит") # ничего
g.send("Python рулит") # Найдено: Python рулит
g.close()
Это позволяет использовать генераторы как сопрограммы (до появления async/await они были основой для кооперативной многозадачности).
⚠️ Частые ошибки и ловушки
1. Генератор можно проитерировать только один раз
g = (x for x in range(5))
print(list(g)) # [0, 1, 2, 3, 4]
print(list(g)) # [] — генератор истощён!
2. Не путать генератор с функцией, возвращающей список
def get_numbers():
return [1, 2, 3] # функция, возвращает список
def gen_numbers():
yield 1
yield 2
yield 3 # генератор
3. Генератор не знает свою длину
g = (x for x in range(10))
print(len(g)) # TypeError: object of type 'generator' has no len()
4. Побочные эффекты в генераторе могут быть неочевидны
Генератор выполняется только когда его итерируют. Если у тебя есть код до первого yield, он выполнится только при первой итерации.
👉Запомни: генераторы — это не просто «экономия памяти», это способ мышления о данных как о потоке, а не как о коллекции. Умение использовать генераторы — признак зрелого разработчика.
🔥Удачи на собеседованиях! 🔥
Программистика || #jobs5 791
Как бы я учила Python в 2024 году, если бы начинала с нуля. БЫСТРЫЙ СПОСОБ
🎥 ПервоисточникПрограммистика|| #video
5 791
⚡️Слита База из 1000+ топовых курсов и материалов для айтишников
Отсортировали их для вашего удобства и выложили в телеграм-каналы по категориям:
🤖 Нейросети – 855+ материалов
🖥 Python — 1558+ материалов
👩💻 Frontend — 1241+ материалов
👩💻 Backend — 1095+ материалов
⚙️ Программы — 978+ материалов
📚 Книги по IT — 779+ материалов
Всё лучшее про IT бесплатно — уже на Базе 🚀
5 791
📦 shallow copy vs deep copy: Когда копировать — это сложно
Казалось бы, что сложного в копировании? Взял один объект, сделал второй. Но в Python всё не так просто. Поверхностная копия может создать иллюзию независимости, а глубокая — удивить производительностью. Разбираемся, как не утонуть в вложенных структурах.
🧱 Почему это важно
Представь, что у тебя есть список списков. Ты копируешь его, меняешь внутренний список в копии и обнаруживаешь, что изменился оригинал. Это не баг Python, это особенности копирования.
original = [[1, 2], [3, 4]]
copy = original[:] # это shallow copy!
copy[0][0] = 99
print(original) # [[99, 2], [3, 4]] — сюрприз!
🧠 Что такое shallow copy (поверхностная копия)
Shallow copy создаёт новый объект, но не копирует вложенные объекты. Вместо этого она копирует ссылки на них.
import copy
original = [[1, 2], [3, 4]]
shallow = copy.copy(original)
# Проверяем
print(shallow is original) # False — это разные объекты
print(shallow[0] is original[0]) # True — но внутренние списки общие!
Способы сделать shallow copy:
- list.copy()
- list[:]
- dict.copy()
- copy.copy()
🧠 Что такое deep copy (глубокая копия)
Deep copy создаёт полностью независимую копию: рекурсивно копирует все вложенные объекты. Изменения в копии не влияют на оригинал и наоборот.
deep = copy.deepcopy(original)
print(deep[0] is original[0]) # False — теперь всё независимо
🔍 Где это реально нужно
1. Когда у тебя есть вложенные структуры:
config = {
'db': {'host': 'localhost', 'port': 5432},
'cache': {'ttl': 300}
}
# Если нужно создать вариант конфига для теста
test_config = copy.deepcopy(config)
test_config['db']['port'] = 5433
# original['db']['port'] останется 5432
2. При работе с многопоточностью:
Передавая данные в потоки, лучше передавать глубокую копию, чтобы избежать гонок данных.
3. Для создания «снимков» состояния:
Например, перед опасной операцией можно сохранить глубокую копию объекта для отката.
⚡️ Производительность и подводные камни
Shallow copy быстрая: копирует только верхний уровень.
Deep copy медленная: рекурсивно обходит все объекты, может быть очень затратной для больших структур.
Ловушка: deep copy не всегда возможна. Некоторые объекты нельзя скопировать (файловые дескрипторы, сетевые соединения, потоки). Для них нужно писать свою логику через метод __deepcopy__.
class Connection:
def __init__(self):
self.socket = ... # нельзя скопировать
def __deepcopy__(self, memo):
# Создаём новый объект с новым соединением
new = Connection()
new.data = copy.deepcopy(self.data, memo)
return new
Программистика || #Статья5 791
🔥Стажировки и вакансии для IT специалистов
- Вакансии которых нет на джоб-агрегаторах
- Только прямые контакты HR в Telegram
🤖 ML & DS 👩💻 DevOps
👨✈️ ИБ & OSINT 👣 Go
👩💻 Mobile 👩💻 C#
👩💻 Node.js 👩💻 Python
🔎 QA 👩💻 Java
👩💻 UX/UI 👩💻 Frontend
🖼️ PHP 📋 Analyst
💼 1C 🖥 SQL
👩💻 IT HR
Пока другие листают джоб-сайты — ты уже пишешь HR в Telegram.
5 791
⚡️ Писать код руками больше не нужно!
Привет. Меня зовут Кирилл. Я создаю топовые подборки с уроками по AI и вайбкодингу:
— 60+ промптов для дебага: поиск ошибок, оптимизация кода
— 40 бесплатных курсов по вайбкодингу
— 150 гайдов, как использовать ChatGPT, Claude Code, Antigravity, Cursor, Perplexity, Lovable
— 100 готовых модулей: авторизация, админки, логирование, тесты, i18n
— 37 MCP серверов: дизайн, разработка, Тесты/QA, деплой
Всего 10 минут в день на канале и ты начнешь писать код на 85% быстрее и сможешь за пару дней закрывать спринты.
Подписывайся, чтобы получать подборки каждую неделю!
5 791
💻 Вопрос с собеседования: Чем отличается оператор `is` от `==` в Python?
Это один из тех вопросов, которые задают, чтобы проверить, понимает ли кандидат разницу между значениями объектов и их идентичностью. Новички часто путают эти операторы и используют их как попало, что может привести к трудноуловимым багам.
📌 Базовый ответ (которого ждут от джуна):
-
== сравнивает значения объектов. Он возвращает True, если содержимое объектов равно.
- is сравнивает идентичность объектов. Он возвращает True, если две переменные ссылаются на один и тот же объект в памяти.
a = [1, 2, 3]
b = [1, 2, 3]
c = a
print(a == b) # True — значения одинаковые
print(a is b) # False — это разные объекты
print(a is c) # True — это один и тот же объект
🧱 Глубокий разбор (для мидла и сеньора):
1. Как работает `==` под капотом
Оператор == вызывает магический метод __eq__() левого операнда. Для пользовательских классов можно переопределить __eq__, чтобы задать свою логику сравнения. По умолчанию __eq__ у object сравнивает по is (т.е. по идентичности).
class MyClass:
def __init__(self, x):
self.x = x
def __eq__(self, other):
return self.x == other.x
a = MyClass(10)
b = MyClass(10)
print(a == b) # True, потому что мы определили __eq__
print(a is b) # False — разные объекты
2. Интернирование и кэширование
Python кэширует некоторые неизменяемые объекты для экономии памяти. Например, малые целые числа (от -5 до 256) и короткие строки без пробелов могут быть интернированы. Это значит, что при создании таких значений может использоваться один и тот же объект.
x = 256
y = 256
print(x is y) # True (часто, но не гарантировано — зависит от реализации)
x = 257
y = 257
print(x is y) # False — числа вне диапазона кэширования обычно создаются заново
3. Особые случаи: `None`, `True`, `False`
Константы None, True, False — синглтоны. Существует только один объект None во всей программе. Поэтому их всегда сравнивают через is:
def func(x=None):
if x is None: # правильно
...
# if x == None: # работает, но менее идиоматично и может быть медленнее
4. Ловушка с плавающей точкой
NaN (not a number) не равен самому себе по ==, но по is может сбивать с толку:
import math
nan = float('nan')
print(nan == nan) # False! Так определен стандартом IEEE 754
print(nan is nan) # True (но это потому что это один объект)
Поэтому для проверки на NaN лучше использовать math.isnan().
⚠️ Когда `is` использовать правильно:
- Для сравнения с синглтонами: None, True, False.
- Для проверки, являются ли две переменные одним и тем же объектом (редко нужно в прикладном коде, чаще в отладке или при работе с кэшами).
Когда `is` использовать опасно:
Для сравнения чисел, строк, списков, словарей — там, где важны значения, а не идентичность. Иначе код может неожиданно сломаться при изменении данных или на другом интерпретаторе.
💡 Итоговый ответ для собеседования:
1. == сравнивает значения, is — идентичность объектов.
2. == можно переопределить в пользовательских классах через __eq__.
3. Для неизменяемых типов (int, str) Python иногда кэширует объекты, поэтому is может случайно сработать, но полагаться на это нельзя.
4. Константы None, True, False всегда сравниваются через is (это идиоматично).
5. В 99% случаев в коде нужно ==, кроме проверки на None.
Запомни: если ты используешь is для сравнения строк или чисел, ты создаёшь потенциальный баг. Всегда спрашивай себя: «Мне нужно сравнить содержимое или удостовериться, что это тот же самый объект?»
Удачи на собеседованиях! 🔥🔥
Программистика || #doc5 791
🔥 ПОЛУЧИТЕ БЕСПЛАТНЫЙ ДОСТУП К ПРАКТИКУМУ ПО СОЗДАНИЮ AI-АГЕНТОВ
🚀 AI-агенты - это системы, которые принимают решения, работают с данными, обращаются к сервисам и выполняют реальные задачи бизнеса
🦾🦾 И самое главное - сегодня их можно создавать быстро и без жёсткого кодинга, через vibe-coding
В практикум входит 5 занятий:
🔹 Основы Google AI Studio. Создание AI-секретаря по совещаниям
🔹 Основы промт-инжиниринга. Создание AI-продажника абонементов в фитнес-центр
🔹 Создание AI-ветеринара на Google AI Studio
🔹 Разбор самых востребованных AI-ассистентов и ключевых технологий 2026 года
🔹 AI-сервис по аренде автомобилей на базе N8N и weweb
💡 То, что раньше требовало команды разработчиков, теперь можно собрать быстрее, если понимаешь архитектуру и умеешь работать через AI
Если хотите начать создавать полноценные AI-системы - приходите 👇
🤖 Получить доступ
5 791
Как сделать цветные кнопки в Telegram боте | Aiogram + TeleBot
🎥 ПервоисточникПрограммистика|| #video
