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

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

Closed channel

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

Show more
5 579
Subscribers
-524 hours
-437 days
-10430 days
Posts Archive
🔥 Подписка на easyoffer PRO на 1 год со скидкой 70% easyoffer – сайт для подготовки к собеседованию на программиста, тестиро
🔥 Подписка на easyoffer PRO на 1 год со скидкой 70% easyoffer – сайт для подготовки к собеседованию на программиста, тестировщика и другие IT-профессии становится еще доступнее со скидкой 70% до 10 марта. ⚙️ Актуальные функции: 1. База вопросов из реальных технических собеседований с вероятностью встречи и примерами ответов. 2. База задач с этапа live-coding. 3. База видеозаписей 1100+ реальных собеседований, в том числе в топовые компании (Сбер, Авито, Яндекс, WB, OZON, МТС и др.) на позиции Junior/Middle/Senior. 4. База 400+ тестовых заданий от компаний. 5. Аналитика ТОП-требований из вакансий для лучшего написания резюме по ключевым словам. 6. Тренажеры для подготовки к собеседованию. В том числе тренажер «Реальное собеседование» со сценарием вопросов под конкретную компанию. Акция до 10 марта (включительно) на PRO-тариф. – Подписка действует 1 год – Доступ ко всем профессиями сразу 👉 Смотри подробности тарифа и покупай на easyoffer

💻 Вопрос с собеседования: Что будет, если использовать изменяемый объект (например, список) в качестве аргумента по умолчанию в функции? Это один из самых коварных вопросов для новичков. Код выглядит безобидно, но ведёт себя странно. Половина джунов проваливается именно на нём, потому что не понимают, когда создаются аргументы по умолчанию. 📌 Базовый ответ (которого ждут от джуна): Аргументы по умолчанию создаются один раз в момент определения функции, а не каждый раз при её вызове. Если использовать изменяемый объект (список, словарь), то он будет общим для всех вызовов.
def add_user(name, user_list=[]):
    user_list.append(name)
    return user_list

print(add_user("Алиса"))  # ['Алиса']
print(add_user("Боб"))    # ['Алиса', 'Боб'] — сюрприз!
Ожидание новичка: каждый вызов создаёт новый пустой список. Реальность: список создаётся один раз и переиспользуется. 🧱 Почему так происходит и как это работает под капотом: В Python аргументы по умолчанию хранятся в атрибуте функции __defaults__. Они вычисляются в момент определения функции, а не вызова.
print(add_user.__defaults__)  # (['Алиса', 'Боб'],)
При каждом вызове без аргумента user_list используется тот же самый объект из __defaults__. Как это исправить: Правильный паттерн — использовать None как значение по умолчанию и создавать новый список внутри функции:
def add_user(name, user_list=None):
    if user_list is None:
        user_list = []
    user_list.append(name)
    return user_list

print(add_user("Алиса"))  # ['Алиса']
print(add_user("Боб"))    # ['Боб'] — теперь работает как ожидалось!
🧪 Другие примеры-ловушки: 1. Словарь в качестве аргумента по умолчанию:
def add_to_dict(key, value, cache={}):
    cache[key] = value
    return cache

print(add_to_dict("a", 1))  # {'a': 1}
print(add_to_dict("b", 2))  # {'a': 1, 'b': 2} — кеш общий!
2. Объекты datetime (будьте осторожны!):
from datetime import datetime

def log_message(msg, timestamp=datetime.now()):
    print(f"{timestamp}: {msg}")

log_message("Старт")  # 2024-03-09 10:00:00
log_message("Финиш")  # 2024-03-09 10:00:00 — время не обновилось!
datetime.now() вычисляется один раз при определении функции, а не при каждом вызове. ⚠️ Когда это особенно опасно:
🔴 В рекурсивных функциях с накоплением данных 🔴 В кэширующих функциях (неявное кеширование может привести к утечкам памяти) 🔴 В библиотечном коде, который будут вызывать другие разработчики 🔴 При работе с mutable объектами в классах (если забыть про копирование)
💡 Запомните: 1. Аргументы по умолчанию создаются один раз в момент определения функции. 2. Никогда не используйте изменяемые объекты (list, dict, set) как значения по умолчанию. 3. Правильный паттерн: def func(arg=None): if arg is None: arg = default_value. 4. Это касается любых объектов, которые могут изменяться: списки, словари, множества, экземпляры классов. 5. Исключение: если вам нужно разделяемое состояние между вызовами (редкий кейс), то можно использовать, но документируйте это явно. На собеседовании этот вопрос задают, чтобы проверить, понимаете ли вы, когда создаются объекты в Python. Джуны часто лепят [] в аргументах по умолчанию, а опытные разработчики всегда используют None. Программистика || #jobs

Ассемблер и Python - Дао общих интересов
📱 Первоисточник
Программистика|| #video

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

🌸 Программистика поздравляет с 8 Марта! Пусть код всегда компилируется с первого раза, баги обходят стороной, а вдохновение
🌸 Программистика поздравляет с 8 Марта!
Пусть код всегда компилируется с первого раза, баги обходят стороной, а вдохновение приходит чаще, чем новые фичи в Python. Желаем, чтобы в жизни было больше радостных моментов, тёплых улыбок и приятных сюрпризов. Оставайтесь такими же яркими и неповторимыми, как ваш любимый язык программирования.
С праздником, девчонки! 🔥💐

🔄 Меняем значения переменных без временной переменной Часто нужно поменять местами значения двух переменных. Новички обычно пишут так:
temp = a
a = b
b = temp
Три строки, временная переменная — работает, но в Python есть элегантный способ в одну строку:
a, b = b, a
Как это работает? Python сначала создаёт кортеж (b, a), а затем распаковывает его в переменные a и b. Всё происходит одновременно, без временной переменной и без риска потерять значение. Бонус: можно менять местами больше двух переменных:
a, b, c = c, a, b
🟢 Почему это круто: Короче и читаемее - Не нужно придумывать имя для временной переменной - Работает для любых типов данных Ещё один лайфхак: множественное присваивание можно использовать для разделения строки на части:
first, second = "Hello World".split()
Запомни: в Python обмен значений — это не боль, а одна строчка кода. Программистика|| #tips

📊 Генератор фейковых данных: создай 1000 пользователей за секунду Тестируешь приложение, а база данных пустая? Нужно заполнить таблицу пользователями, но вводить вручную "Иван Иванов" 50 раз — тоска зелёная? Пора автоматизировать создание тестовых данных. Этот скрипт генерирует сколько угодно вымышленных пользователей с реалистичными именами, адресами, телефонами и email. Данные сохраняются в CSV — готовый набор для загрузки в БД или тестов. 👉 Скрипт `fake_users_generator.py`:
#!/usr/bin/env python3
"""
Генератор фейковых пользователей для тестирования.
Сохраняет данные в CSV или JSON.
"""

import csv
import json
import argparse
from faker import Faker
from datetime import datetime

def generate_users(count=100, locale='ru_RU', output_file='users.csv', file_format='csv'):
    """
    Генерирует указанное количество фейковых пользователей
    и сохраняет в файл.
    """
    fake = Faker(locale)
    users = []
    
    print(f"👥 Генерирую {count} пользователей...")
    
    for _ in range(count):
        user = {
            'id': _ + 1,
            'first_name': fake.first_name(),
            'last_name': fake.last_name(),
            'email': fake.email(),
            'phone': fake.phone_number(),
            'address': fake.address().replace('\n', ', '),
            'city': fake.city(),
            'country': fake.country(),
            'birthdate': fake.date_of_birth(minimum_age=18, maximum_age=80).isoformat(),
            'created_at': datetime.now().isoformat()
        }
        users.append(user)
    
    # Сохраняем в файл
    if file_format == 'csv':
        with open(output_file, 'w', newline='', encoding='utf-8') as f:
            writer = csv.DictWriter(f, fieldnames=users[0].keys())
            writer.writeheader()
            writer.writerows(users)
        print(f"✅ CSV сохранён: {output_file}")
    
    elif file_format == 'json':
        with open(output_file, 'w', encoding='utf-8') as f:
            json.dump(users, f, ensure_ascii=False, indent=2)
        print(f"✅ JSON сохранён: {output_file}")
    
    return users

if __name__ == "__main__":
    parser = argparse.ArgumentParser(description="Генератор фейковых пользователей")
    parser.add_argument('-n', '--number', type=int, default=100, help='Количество пользователей (по умолчанию 100)')
    parser.add_argument('-l', '--locale', default='ru_RU', help='Локаль: ru_RU, en_US, uk_UA и др.')
    parser.add_argument('-o', '--output', default='users.csv', help='Имя выходного файла')
    parser.add_argument('-f', '--format', choices=['csv', 'json'], default='csv', help='Формат файла')
    
    args = parser.parse_args()
    
    generate_users(
        count=args.number,
        locale=args.locale,
        output_file=args.output,
        file_format=args.format
    )
🛠 Установка зависимостей:
pip install faker
🚀 Запуск:
# 100 пользователей по-русски (по умолчанию)
python fake_users_generator.py

# 500 пользователей на английском в JSON
python fake_users_generator.py -n 500 -l en_US -o users.json -f json

# Украинские пользователи
python fake_users_generator.py -l uk_UA -o uk_users.csv
📋 Пример сгенерированных данных:
id,first_name,last_name,email,phone,address,city,country,birthdate,created_at
1,Иван,Петров,petrov@example.com,+7 (495) 123-4567,ул. Ленина 10, кв. 5,Москва,Россия,1990-05-15,2024-03-07T14:30:00
2,Анна,Смирнова,smirnova@example.com,+7 (812) 987-6543,пр. Невский 25,Санкт-Петербург,Россия,1985-11-23,2024-03-07T14:30:00
Программистика|| #scripts

Забудь про ChatGPT. Это как просить калькулятор нарисовать картину. Пока массы гоняют одни и те же скучные запросы в зацензур
Забудь про ChatGPT. Это как просить калькулятор нарисовать картину. Пока массы гоняют одни и те же скучные запросы в зацензуренные боты, реальная революция ИИ в канале «Техноразум»: — Нейросети, которые не боятся запретных тем ( 🔞) — Скрытые функции, которые другие ИИ прячут за платную подписку или цензурой — Настоящие инструкции и промты для взлома творческих шаблонов Переходи к настоящим возможностям, забудь про детский сад нейросетей: https://t.me/+7dOPAyODQ6

👩‍💻 Переменные в Python: это не коробки, а ярлыки Новички часто представляют переменную как коробку, в которую можно положить значение. Идут дальше: a = 5, b = a — и думают, что теперь в двух коробках лежат одинаковые числа. А потом меняют b и удивляются, почему a не изменилось. Или наоборот — меняют список через одну переменную, а вторая тоже меняется. Пора разобраться, как всё на самом деле. 🧱 Переменная — это имя, а не место хранения В Python переменная — это просто имя (ярлык), которое прикрепляется к объекту в памяти. У объекта есть тип и значение, а переменная только ссылается на него.
a = 5
b = a
Что происходит: 1. Создаётся объект int со значением 5. 2. Ярлык a вешается на этот объект. 3. b = a — берём объект, на который указывает a, и вешаем на него ещё один ярлык b. Теперь два имени указывают на один и тот же объект. Проверим через id() — адрес в памяти:
print(id(a))  # 12345678 (условно)
print(id(b))  # 12345678 — тот же объект!
🧱 Неизменяемые типы: числа, строки, кортежи Когда мы «меняем» неизменяемый объект, на самом деле создаётся новый объект, а старый ярлык перевешивается.
a = 5
b = a
a = a + 1

print(a)  # 6
print(b)  # 5 — b всё ещё смотрит на старый объект!
Частая ошибка: думать, что b должно было тоже измениться. ✔️ Правильно: a теперь ссылается на новый объект 6, а b остался на старом 5. 🧱 Изменяемые типы: списки, словари, множества Здесь объект можно изменить, не создавая нового. Тогда все ярлыки, ведущие на этот объект, увидят изменения.
list_a = [1, 2, 3]
list_b = list_a      # оба ярлыка на один список
list_a.append(4)

print(list_a)  # [1, 2, 3, 4]
print(list_b)  # [1, 2, 3, 4] — потому что это тот же список!
Ловушка: новички думают, что list_b — независимая копия. ✔️ Как создать реальную копию: list_b = list_a.copy() или list_b = list_a[:]. 🧱 Проверка: изменяемый или нет?
x = 10
y = x
print(x is y)  # True — один объект

x = 20
print(x is y)  # False — x перевесили на новый объект

lst1 = [1, 2]
lst2 = lst1
print(lst1 is lst2)  # True

lst1.append(3)
print(lst1 is lst2)  # True — объект тот же
🧱 Аргументы функций — тоже ярлыки При передаче в функцию копируется ссылка, а не объект. Поэтому:
def add_one(x):
    x += 1
    return x

a = 5
add_one(a)
print(a)  # 5 — число неизменяемо, x был локальной копией ссылки

def add_to_list(lst):
    lst.append(100)

my_list = [1, 2, 3]
add_to_list(my_list)
print(my_list)  # [1, 2, 3, 100] — список изменился!
💡 Запомни: 🟢 Переменные в Python — это ярлыки на объекты, а не ячейки памяти. 🟢 Присваивание b = a не копирует данные, а вешает ещё один ярлык. 🟢 Неизменяемые типы (int, float, str, tuple) при попытке изменения создают новый объект. 🟢 Изменяемые типы (list, dict, set) можно менять, и все ярлыки увидят изменения. 🟢 Для создания независимой копии изменяемого объекта используй .copy() или deepcopy() (для вложенных структур).
Понимание этой разницы убережёт тебя от часов отладки и неожиданных багов. Помни: в Python всё — объект, а переменные — просто имена.
Программистика|| #article

⏰ Библиотека Python: Arrow Arrow — это интуитивная библиотека для работы с датами и временем, предлагающая простой API для со
Библиотека Python: Arrow Arrow — это интуитивная библиотека для работы с датами и временем, предлагающая простой API для создания, форматирования и манипуляции датами. Она поддерживает часовые пояса, человекочитаемые интервалы и значительно упрощает код по сравнению со стандартным datetime. ✔️ Установка:
pip install arrow
🐱 Ссылка на репозиторий Программистика|| #Library

😒 Подборка каналов по информационной безопасности Проверенные каналы по безопасности, которые реально помогают расти. 👍 Zer
😒 Подборка каналов по информационной безопасности Проверенные каналы по безопасности, которые реально помогают расти. 👍 ZeroDay — Уроки, эксплуатация уязвимостей с нуля 👍 Белый Хакер — Свежие новости из мира ИБ 😎 Бункер Хакера — Статьи, книги, шпаргалки и хакинг 👨‍💻 Серверная Админа — Настройка и уроки по компьютерным сетям 📂 Подписывайся

Переменные, функции, типы данных... Сразу хочется закрыть вкладку 🥲 Первый шаг в Python - самый страшный. Открываешь урок, а там термины сыплются один за другим. Кажется, что это какая-то сложная система для посвященных. И ты сидишь и думаешь: "Может, программирование - это вообще не мое?" ⁉️ На самом деле проблема не в тебе, а в подаче. Когда теория висит в воздухе без практики - мозг ее просто не принимает. ❇️ Ребята из Merion Academy (того самого YouTube-канала про IT) на бесплатных вводных уроках по Python сделали иначе. Сначала - воркшоп с ментором. Ты просто пишешь код руками и сразу видишь результат. А уже потом - термины и теория, когда есть понимание, зачем это нужно. Что еще внутри: ✔️ Основы Python (переменные, типы, функции) - не скучно, а с примерами ✔️ Твоя первая программа - воркшоп с ментором ✔️ Тест - проверишь, правда ли понял ➡️ Запишись на бесплатные вводные уроки Сначала напишешь код, потом разберешься с терминами.

Как финский гик ВЫНЕС Майкрософт
📱 Первоисточник
Linux Administration ||#Видеоt

💻 8 ключевых концепций в DDD(предметно-ориентированное проектирование) ⬇️ Наглядная шпаргалка на русском. Сохраняем, пригоди
💻 8 ключевых концепций в DDD(предметно-ориентированное проектирование) ⬇️ Наглядная шпаргалка на русском. Сохраняем, пригодится!

Программисты, это вам 👇 Держите 5 каналов, которые реально помогают изучать программирование и IT с полного нуля: 🖥 Easy Co
Программисты, это вам 👇 Держите 5 каналов, которые реально помогают изучать программирование и IT с полного нуля: 🖥 Easy Coder — все направления IT. 👩‍💻 Easy Python — всё о Python. 🌐 Easy WebDev — Frontend, Backend. 🔠 Easy InfoSec — ИБ, Хакинг. 🖥 Easy GitHub — лучшее с GitHub. Тонны бесплатной инфы для любого уровня подготовки ✔️

🔍 Duplicate Finder: Найди и уничтожь файлы-клоны (и освободи место) У каждого на диске валяются копии фоток, документов, музыки — случайные дубликаты, старые версии, одинаковые файлы в разных папках. Руками искать — себя не уважать. Этот скрипт просканирует папку, найдёт все файлы-дубликаты по содержимому и покажет, что можно смело удалить. 👉 Скрипт `find_duplicates.py`:
#!/usr/bin/env python3
"""
Duplicate Finder — ищет дубликаты файлов по содержимому (хеш SHA256).
Использование: python find_duplicates.py /путь/к/папке [--delete]
"""

import os
import sys
import argparse
import hashlib
from collections import defaultdict
from pathlib import Path

def get_file_hash(filepath, chunk_size=8192):
    """Вычисляет SHA256 хеш файла"""
    hash_obj = hashlib.sha256()
    with open(filepath, 'rb') as f:
        for chunk in iter(lambda: f.read(chunk_size), b''):
            hash_obj.update(chunk)
    return hash_obj.hexdigest()

def find_duplicates(root_dir, exclude_dirs=None):
    """Сканирует root_dir и возвращает словарь {хеш: [список путей]}"""
    if exclude_dirs is None:
        exclude_dirs = {'.git', '__pycache__', 'venv', 'node_modules'}
    
    files_by_hash = defaultdict(list)
    root = Path(root_dir).resolve()
    
    for filepath in root.rglob('*'):
        if not filepath.is_file():
            continue
        # Пропускаем исключённые директории
        if any(part in exclude_dirs for part in filepath.parts):
            continue
        
        try:
            file_hash = get_file_hash(filepath)
            files_by_hash[file_hash].append(str(filepath))
        except (PermissionError, OSError):
            continue
    return {h: paths for h, paths in files_by_hash.items() if len(paths) > 1}

def print_duplicates(duplicates):
    """Выводит найденные дубликаты в читаемом виде"""
    if not duplicates:
        print("✅ Дубликатов не найдено.")
        return
    
    total_size = 0
    print(f"\n🔁 Найдено групп дубликатов: {len(duplicates)}\n")
    
    for hash_val, paths in duplicates.items():
        size = os.path.getsize(paths[0])
        total_size += size * (len(paths) - 1)
       print(f"📄 Хеш: {hash_val[:8]}... ({size} байт)")
        for i, path in enumerate(paths):
            marker = "🗑  (можно удалить)" if i > 0 else "📌 (оригинал)"
            print(f"  {i+1}. {path} {marker}")
        print()
     print(f"💾 Потенциально можно освободить: {total_size / (1024*1024):.2f} МБ")

def delete_duplicates(duplicates, dry_run=True):
    """Удаляет дубликаты (все, кроме первого)"""
    deleted = 0
    for paths in duplicates.values():
        for path in paths[1:]:  # первый оставляем
            if dry_run:
                print(f"[dry-run] Удалил бы: {path}")
            else:
                try:
                    os.remove(path)
                    print(f"✅ Удалён: {path}")
                    deleted += 1
                except OSError as e:
                    print(f"❌ Ошибка удаления {path}: {e}")
    if dry_run:
        print("🔸 Это был пробный запуск. Добавьте --delete для реального удаления.")
    else:
        print(f"🗑 Удалено {deleted} файлов.")

if __name__ == "__main__":
    parser = argparse.ArgumentParser(description="Поиск дубликатов файлов")
    parser.add_argument('directory', help='Корневая папка для поиска')
    parser.add_argument('--delete', action='store_true', help='Удалить дубликаты (без этого только показ)')
    args = parser.parse_args()
     if not os.path.isdir(args.directory):
        print(f"❌ Папка {args.directory} не существует")
        sys.exit(1)
    
    print(f"🔍 Сканирую {args.directory} ...")
    duplicates = find_duplicates(args.directory)
    print_duplicates(duplicates)
    
    if args.delete and duplicates:
        confirm = input("\n⚠️  Точно удалить все дубликаты? (yes/no): ")
        if confirm.lower() == 'yes':
            delete_duplicates(duplicates, dry_run=False)
        else:
            print("❌ Удаление отменено.")
    elif duplicates and not args.delete:
        delete_duplicates(duplicates, dry_run=True)
Программистика|| #article

Хакеры слили бесплатные версии дорогих нейросетей Пока одни платят свою зарплату на подписки, другие уже пользуются этими нейросетями бесплатно
Trends.Vc — находит схемы заработка и реализовывает всё за тебя 💸 • Youper — ии психолог помогает понять себя и избавляет от апатии 🧠 • DeepFaceLab — создаёт фейкового персонажа любого пола, повторяя твои эмоция и движения 🤭 • Socratic — решает за вас экзамены, курсовые, по фотке вашего задания 🎓
 Лазейку скоро закроют. Успей скачать, пока доступ открыт: https://t.me/+Zbu9UqdaU7g4M2Ji

⏳ tqdm: Прогресс-бары для тех, кто устал ждать и гадать Запустил долгий цикл, ушёл пить кофе, вернулся — а он всё ещё работае
tqdm: Прогресс-бары для тех, кто устал ждать и гадать Запустил долгий цикл, ушёл пить кофе, вернулся — а он всё ещё работает. Сколько осталось? Непонятно. Успеешь ли сходить в магазин? Тоже непонятно. Пора добавить визуальную обратную связь в свои скрипты. tqdm — это самая популярная библиотека для создания прогресс-баров в Python. Она оборачивает любой итерируемый объект и мгновенно показывает красивый индикатор выполнения с оценкой времени. ❌ Было (скучно и непонятно):
import time

for i in range(100):
    time.sleep(0.1)  # какая-то работа
    # и никакой информации о прогрессе
✔️ Стало (красиво и информативно):
from tqdm import tqdm
import time

for i in tqdm(range(100)):
    time.sleep(0.1)  # теперь видно: 45% | ████▌     | 45/100 [00:04<00:05]
Почему tqdm — это маст-хэв: 🟢 Одна строка кода: Просто оберни свой итерируемый объект в tqdm(). 🟢 Автоматика: Сам определяет общее количество, частоту обновления, оставшееся время. 🟢 Настраиваемость: Можно менять описание, формат, цвет (в Jupyter), добавлять вложенные бары. 🟢 Универсальность: Работает с циклами, pandas (.progress_apply), запросами, файлами. Особенности: ➖ В некоторых терминалах может мигать, если обновлять слишком часто. ➖ При параллельных процессах нужно использовать tqdm аккуратно (есть tqdm.contrib.concurrent). 🧪 Продвинутые примеры: 1. Ручное обновление (для своих итераций):
pbar = tqdm(total=100)
for i in range(10):
    # делаем что-то, что даёт 10 единиц прогресса за раз
    pbar.update(10)
pbar.close()
2. Описание и вложенность:
from tqdm import trange

for i in trange(5, desc="Внешний цикл"):
    for j in trange(10, desc="Внутренний", leave=False):
        time.sleep(0.05)
3. В Jupyter Notebook:
from tqdm.notebook import tqdm
for i in tqdm(range(1000)):
    # красивые цветные бары прямо в ноутбуке
4. Для pandas:
import pandas as pd
from tqdm import tqdm

tqdm.pandas()  # включает поддержку progress_apply
df.progress_apply(lambda row: heavy_func(row), axis=1)
📦 Установка:
pip install tqdm
# Для Jupyter: pip install "tqdm[notebook]"
tqdm превращает скучное ожидание в контролируемый процесс. Перестань гадать — начни видеть прогресс. 🐱 Ссылка на репозиторий Программистика|| #Library

Работаете с СУБД? Присоединяйтесь к сообществу Pangolin! Телеграм-канал для разработчиков и администраторов баз данных. Pango
Работаете с СУБД? Присоединяйтесь к сообществу Pangolin! Телеграм-канал для разработчиков и администраторов баз данных. Pangolin — это PostgreSQL с 80+ доработками, и мы открыто рассказываем о его разработке. У нас вы найдете: • Технические детали и архитектурные решения • Разборы доработок PostgreSQL • Ответы на вопросы по эксплуатации и коду • Кейсы внедрения и оптимизации • Вакансии для тех, кто хочет работать с нами • Вебинары и встречи с экспертами • Знакомство с командой: хобби, книги и интересы Присоединяйтесь к сообществу, где говорят на языке баз данных Подписаться #реклама 16+ О рекламодателе