Программистика
Закритий канал
Лучший канал про python Ссылка для друга: https://t.me/+Ai6ughKtf5g2ZmFi Купить рекламу: https://telega.in/c/+Ai6ughKtf5g2ZmFi Админ: @JeyRahol По рекламе: @ReivuManager
Показати більше5 579
Підписники
-524 години
-437 днів
-10430 день
Архів дописів
5 579
🤖 AI Commits: пусть нейросеть пишет осмысленные коммиты за тебя
Ты 100-й раз пишешь
git commit -m "fix", а потом коллеги и ты сам через месяц не понимаете, что именно было исправлено. Гуглить вклад — слишком лень, писать грамотные сообщения — времени жалко. А что, если это сделает нейросеть? Скрипт смотрит на изменения в коде, анализирует их и предлагает понятное сообщение коммита в стиле Conventional Commits.
👉 Скрипт `ai_commit.py`:
#!/usr/bin/env python3
"""
AI Commit — автоматически генерирует сообщение коммита по изменениям в коде.
Требует установленный и запущенный ollama (или можно заменить на API GPT).
"""
import subprocess
import sys
import argparse
import json
# Настройки: выбери модель из ollama
MODEL = "codellama:7b-instruct" # или "llama3.2", "mistral", "qwen2.5-coder"
# Если хочешь использовать OpenAI, раскомментируй и укажи ключ
# USE_OPENAI = False
# OPENAI_API_KEY = "sk-..."
def get_git_diff():
"""Возвращает diff текущих изменений"""
try:
diff = subprocess.check_output(
["git", "diff", "--cached", "--no-color"],
stderr=subprocess.DEVNULL,
text=True
)
if not diff.strip():
# Если нет изменений в staged, берём unstaged
diff = subprocess.check_output(
["git", "diff", "--no-color"],
stderr=subprocess.DEVNULL,
text=True
)
return diff
except subprocess.CalledProcessError:
print("❌ Не удалось получить diff. Вы в git-репозитории?")
sys.exit(1)
def generate_commit_message(diff, use_ollama=True):
"""Отправляет diff модели и получает сообщение коммита"""
prompt = (
"Ты — эксперт по Git. Напиши краткое сообщение коммита (одной строкой) в стиле Conventional Commits, "
"которое описывает следующие изменения в коде. Не добавляй лишних комментариев, только само сообщение.\n\n"
f"Изменения:\n{diff}"
)
if use_ollama:
try:
import ollama
response = ollama.chat(model=MODEL, messages=[{"role": "user", "content": prompt}])
return response['message']['content'].strip()
except Exception as e:
print(f"❌ Ошибка при обращении к ollama: {e}")
print("Убедитесь, что ollama запущен (ollama serve) и модель загружена.")
sys.exit(1)
else:
# Вариант с OpenAI API (раскомментируй при необходимости)
import openai
openai.api_key = OPENAI_API_KEY
response = openai.ChatCompletion.create(
model="gpt-3.5-turbo",
messages=[{"role": "user", "content": prompt}],
max_tokens=50
)
return response.choices[0].message.content.strip()
def main():
parser = argparse.ArgumentParser(description="Генератор сообщений коммита через AI")
parser.add_argument("-m", "--model", default=MODEL, help="Модель ollama")
parser.add_argument("--openai", action="store_true", help="Использовать OpenAI API вместо ollama")
args = parser.parse_args()
diff = get_git_diff()
if not diff.strip():
print("⚠️ Нет изменений для коммита. Добавьте файлы через git add.")
return
print("🤖 Генерирую сообщение коммита...")
msg = generate_commit_message(diff, use_ollama=not args.openai)
print("\n💡 Предлагаемое сообщение:\n")
print(msg)
print("\n✅ Если подходит, выполните:")
print(f' git commit -m "{msg}"')
print(" Или скопируйте сообщение и отредактируйте.")
if __name__ == "__main__":
main()
🛠 Установка и настройка:
1. Установи скрипт:
pip install ollama # или openai, если будешь использовать API
2. Установи и запусти ollama (бесплатно, локально):
# macOS/Linux
curl -fsSL https://ollama.com/install.sh | sh
# Windows — скачай с сайта
ollama serve &
ollama pull codellama:7b-instruct # или другую модель
3. Сделай скрипт исполняемым и добавь в PATH (опционально):
chmod +x ai_commit.py
sudo ln -s $(pwd)/ai_commit.py /usr/local/bin/ai-commit
Программистика || #scripts5 579
🤩 Реальный роадмап на Python Backend в 2026 году / с 0 до 500к в месяц
📱 ПервоисточникПрограммистика|| #video
5 579
Бесплатные нейронки, изменившие мою жизнь:
🤬 Обход цензуры в GPT, Deepseek, Gemini, Sora - Читать гайд
👀 Напишет за вас продающий рекламный креатив - Узнать название
💪 Помогает накачаться знает ВСЁ о питании - Узнать название
🎁 Решает домашку, по фотке твоего задания - Узнать название
💸 Генерирует идеи для заработка, без бюджета - Узнать название
📉 Мониторит сайты и уведомляет о падении цен - Узнать название
📹 Делает тиктоки на сотни тысяч просмотров - Узнать название
5 579
🔍 Mypy: Статическая типизация, которая не даст вам ошибиться
В Python всё динамично: переменные могут менять тип на лету, функции не знают, что им передают. Это удобно, но когда проект разрастается, опечатки в именах и несоответствие типов становятся причиной багов, которые всплывают только в runtime.
Mypy решает эту проблему, добавляя статическую проверку типов прямо в ваш Python-код. Он анализирует аннотации типов и ловит ошибки до того, как код попадёт в продакшн.
Зачем это нужно:
1. Раннее обнаружение ошибок: Mypy найдёт, что вы пытаетесь передать строку туда, где ожидается число, ещё до запуска программы.
2. Улучшение документации: Аннотации типов становятся живой документацией — IDE показывает их при автодополнении.
3. Безопасный рефакторинг: Смена сигнатуры функции или переименование атрибута — mypy подскажет, где код сломается.
Как использовать:
pip install mypy
mypy your_project/
Добавьте в pyproject.toml конфигурацию, например:
[tool.mypy]
python_version = "3.11"
warn_return_any = true
disallow_untyped_defs = true
Идеально для крупных проектов и команд, где надёжность важнее скорости написания кода.
🐱 Ссылка на GitHub
Программистика || #Library5 579
👩💻 Всем программистам посвящается!
Вот 14 авторских обучающих IT каналов по самым востребованным областям программирования:
Выбирай своё направление:
👩💻 Python — t.me/python_ready
🤔 InfoSec & Хакинг — t.me/hacking_ready
🖥 SQL & Базы Данных — t.me/sql_ready
👩💻 Linux — t.me/linux_ready
🤖 Нейросети — t.me/neuro_ready
👩💻 IT Новости — t.me/it_ready
👩💻 Frontend — t.me/frontend_ready
👩💻 C/C++ — https://t.me/cpp_ready
👩💻 C# & Unity — t.me/csharp_ready
👩💻 Java — t.me/java_ready
📖 IT Книги — t.me/books_ready
📱 JavaScript — t.me/javascript_ready
🖼️ DevOps — t.me/devops_ready
🖥 Design — t.me/design_ready
📌 Гайды, шпаргалки, задачи, ресурсы и фишки для каждого языка программирования!
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 сделает код проще и быстрее.
Программистика || #jobs5 579
🐧 Хочешь освоить Linux и Python, но без скучных лекций и боли?
В PyLinux всё по-другому:
🔵 Простые объяснения, даже сложных тем
🔵 Полезные скрипты и примеры
🔵 Книги, шпаргалки, гайды
🔵 и многое другое....
👉 Всё, чтобы ты рос в IT без стресса и хаоса!
5 579
🎨 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 579
🔠 Слили 4 ТБ по IT, хакингу и разработке.
⚪️ Все лучшие инструкции, гайды, книги и инструменты — без воды.
🖥 Курсы & GitHub — 579GB
☁️ Хакинг & ИБ — 756GB
🤒 OSINT — 315GB
⌨️ Python — 955GB
🙃 Linux & Bash — 459GB
😦 Работа в IT — 278GB
🖥 Общий архив — 946GB
➡️ Присоединяйтесь и скачивайте.
Пост будет удален через 48 часов.
5 579
👀 Python. Уроки для начинающих
В книге 22 урока, более 40 практических упражнений и заданий для самостоятельной работы. Описан язык Python: его основы, типы данных, управляющие выражения, функции, объекты, классы, исключения, модули и пакеты. Рассмотрены более развитые инструменты языка: установка и применение дополнительных библиотек, многопоточное, многопроцессное и конкурентное программирование, аннотации типов. Рассказано о практическом применении Python и различных библиотек для загрузки данных из Интернета, парсинга веб-страниц, работы с базами данных, программирования графических и веб-приложений, математических расчетов, вывода графиков и работы с искусственным интеллектом. Электронный архив на сайте издательства содержит все примеры из книги.Программистика || #Книги
5 579
⚡️ Linux теперь в Telegram!
Ребята делают реально классный канал про IT - просто, понятно и без воды.
О Linux, DevOps, разработке, безопасности и инструментах, которые помогают работать эффективнее.
Подписывайтесь: @recura_tech
5 579
Подборка каналов 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 579
💻 Вопрос с собеседования: Что такое генераторы в 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 579
Как бы я учила Python в 2024 году, если бы начинала с нуля. БЫСТРЫЙ СПОСОБ
🎥 ПервоисточникПрограммистика|| #video
5 579
⚡️Слита База из 1000+ топовых курсов и материалов для айтишников
Отсортировали их для вашего удобства и выложили в телеграм-каналы по категориям:
🤖 Нейросети – 855+ материалов
🖥 Python — 1558+ материалов
👩💻 Frontend — 1241+ материалов
👩💻 Backend — 1095+ материалов
⚙️ Программы — 978+ материалов
📚 Книги по IT — 779+ материалов
Всё лучшее про IT бесплатно — уже на Базе 🚀
5 579
📦 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
Программистика || #Статья
Вже доступно! Дослідження Telegram за 2025 — головні інсайти року 
