uk
Feedback
Программистика

Программистика

Закритий канал

Лучший канал про python Ссылка для друга: https://t.me/+Ai6ughKtf5g2ZmFi Купить рекламу: https://telega.in/c/+Ai6ughKtf5g2ZmFi Админ: @JeyRahol По рекламе: @ReivuManager

Показати більше
5 579
Підписники
-524 години
-437 днів
-10430 день
Архів дописів
🤖 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
   
Программистика || #scripts

🤩 Реальный роадмап на Python Backend в 2026 году / с 0 до 500к в месяц
📱 Первоисточник
Программистика|| #video

Бесплатные нейронки, изменившие мою жизнь: 🤬 Обход цензуры в GPT, Deepseek, Gemini, Sora - Читать гайд 👀 Напишет за вас продающий рекламный креатив - Узнать название 💪 Помогает накачаться знает ВСЁ о питании - Узнать название 🎁 Решает домашку, по фотке твоего задания - Узнать название 💸 Генерир‌‎ует идеи для заработка, без бюджета - Узнать название 📉 Мониторит сайты и уведомляет о падении цен - Узнать название 📹 Делает тиктоки на сотни тысяч просмотров - Узнать название

🔍 Mypy: Статическая типизация, которая не даст вам ошибиться В Python всё динамично: переменные могут менять тип на лету, фу
🔍 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 Программистика || #Library

👩‍💻 Всем программистам посвящается! Вот 14 авторских обучающих IT каналов по самым востребованным областям программирования
👩‍💻 Всем программистам посвящается! Вот 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 🖼️ DevOpst.me/devops_ready 🖥 Design — t.me/design_ready 📌 Гайды, шпаргалки, задачи, ресурсы и фишки для каждого языка программирования!

🗝 Секрет 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 сделает код проще и быстрее. Программистика || #jobs

🐧 Хочешь освоить Linux и Python, но без скучных лекций и боли? В PyLinux всё по-другому: 🔵 Простые объяснения, даже сложных
🐧 Хочешь освоить Linux и Python, но без скучных лекций и боли? В PyLinux всё по-другому: 🔵 Простые объяснения, даже сложных тем 🔵 Полезные скрипты и примеры 🔵 Книги, шпаргалки, гайды 🔵 и многое другое.... 👉 Всё, чтобы ты рос в IT без стресса и хаоса!

🎨 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 "Май"
Получишь надпись в стиле «Звёздных войн». 💎 Итог: Теперь твой терминал может выглядеть как хакерский кинофильм. Бери скрипт, экспериментируй со шрифтами и удивляй коллег. Код настолько простой, что его можно добавить в любой проект за минуту. Программистика || #scripts

🔠 Слили 4 ТБ по IT, хакингу и разработке. ⚪️ Все лучшие инструкции, гайды, книги и инструменты — без воды. 🖥 Курсы & GitHub
🔠 Слили 4 ТБ по IT, хакингу и разработке. ⚪️ Все лучшие инструкции, гайды, книги и инструменты — без воды. 🖥 Курсы & GitHub — 579GB ☁️ Хакинг & ИБ — 756GB 🤒 OSINT — 315GB ⌨️ Python — 955GB 🙃 Linux & Bash — 459GB 😦 Работа в IT — 278GB 🖥 Общий архив — 946GB ➡️ Присоединяйтесь и скачивайте. Пост будет удален через 48 часов.

👀 Python. Уроки для начинающих В книге 22 урока, более 40 практических упражнений и заданий для самостоятельной работы. Опис
👀 Python. Уроки для начинающих
В книге 22 урока, более 40 практических упражнений и заданий для самостоятельной работы. Описан язык Python: его основы, типы данных, управляющие выражения, функции, объекты, классы, исключения, модули и пакеты. Рассмотрены более развитые инструменты языка: установка и применение дополнительных библиотек, многопоточное, многопроцессное и конкурентное программирование, аннотации типов. Рассказано о практическом применении Python и различных библиотек для загрузки данных из Интернета, парсинга веб-страниц, работы с базами данных, программирования графических и веб-приложений, математических расчетов, вывода графиков и работы с искусственным интеллектом. Электронный архив на сайте издательства содержит все примеры из книги.
Программистика || #Книги

⚡️ Linux теперь в Telegram! Ребята делают реально классный канал про IT - просто, понятно и без воды. О Linux, DevOps, разраб
+4
⚡️ Linux теперь в Telegram! Ребята делают реально классный канал про IT - просто, понятно и без воды. О Linux, DevOps, разработке, безопасности и инструментах, которые помогают работать эффективнее. Подписывайтесь: @recura_tech

Подборка каналов 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 — Протестируй канал!

💻 Вопрос с собеседования: Что такое генераторы в 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, он выполнится только при первой итерации. 👉Запомни: генераторы — это не просто «экономия памяти», это способ мышления о данных как о потоке, а не как о коллекции. Умение использовать генераторы — признак зрелого разработчика. 🔥Удачи на собеседованиях! 🔥 Программистика || #jobs

Как бы я учила Python в 2024 году, если бы начинала с нуля. БЫСТРЫЙ СПОСОБ
🎥 Первоисточник
Программистика|| #video

⚡️Слита База из 1000+ топовых курсов и материалов для айтишников Отсортировали их для вашего удобства и выложили в телеграм-каналы по категориям: 🤖 Нейросети – 855+ материалов 🖥 Python — 1558+ материалов 👩‍💻 Frontend — 1241+ материалов 👩‍💻 Backend — 1095+ материалов ⚙️ Программы — 978+ материалов 📚 Книги по IT — 779+ материалов Всё лучшее про IT бесплатно — уже на Базе 🚀

📦 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
Программистика || #Статья