Русский
Открыть в Telegram
6 535подписчиков−43 за неделю
637средний охват поста
9.8%ER — охват к подписчикам
6постов за 30 дней
P
Pythoner
Фотография
✈️Лямбда-функции в Python — это мощный инструмент для создания небольших анонимных функций "на лету". Они особенно полезны для коротких, простых операций, где полное определение функции было бы излишним. ➡️Что такое лямбда-функции? Лямбда-функции определяются с помощью ключевого слова lambda, в отличие от обычных функций, которые определяются с помощью def. Они позволяют писать более чистый и читаемый код, устраняя необходимость во временных определениях функций. ➡️Синтаксис лямбда-функций lambda arguments: expression Например, простая лямбда-функция для сложения двух чисел: add = lambda x, y: x + y result = add(3, 5) print(result) # Выведет: 8 ➡️Распространенные случаи использования 1. С функцией map() map() применяет функцию к каждому элементу итерируемого объекта: numbers = [1, 2, 3, 4] squared = list(map(lambda x: x ** 2, numbers)) print(squared) # Выведет: [1, 4, 9, 16] 2. С функцией filter() filter() используется для фильтрации элементов: numbers = [1, 2, 3, 4] even = list(filter(lambda x: x % 2 == 0, numbers)) print(even) # Выведет: [2, 4] 3. С функцией sorted() sorted() позволяет сортировать элементы по заданному критерию: points = [(1, 2), (3, 1), (5, -1)] points_sorted = sorted(points, key=lambda point: point[1]) print(points_sorted) # Выведет: [(5, -1), (3, 1), (1, 2)] ➡️Преимущества использования лямбда-функций 💬Краткость и читаемость для простой логики 💬Расширенные возможности функционального программирования 💬Удобны для "одноразовых" функций ➡️Ограничения и недостатки 💬Могут быть сложны для чтения при использовании в сложных выражениях 💬Ограничения в обработке ошибок и отладке 💬Ограниченная функциональность (только одно выражение) ➡️Вложенные лямбда-функции nested_lambda = lambda x: (lambda y: y ** 2)(x) + 1 print(nested_lambda(3)) # Выведет: 10 ➡️Интеграция с библиотеками Пример использования с Pandas: import pandas as pd data = {'A': [1, 2, 3], 'B': [4, 5, 6]} df = pd.DataFrame(data) df['C'] = df.apply(lambda row: row['A… Читать полностью →
50 · 2K ·
P
Pythoner
Фотография
➡️1. SWE-Kit: IDE с открытым исходным кодом для кодирующих агентов SWE-Kit представляет собой headless IDE с такими функциями, как LSP (Language Server Protocol), индексация кода и Code RAG (Retrieval-Augmented Generation). Он предлагает гибкую среду выполнения, которая может работать на любом хосте Docker или удаленном сервере, а также специализированные наборы инструментов для кодирования. ➡️Основные возможности: 💬Интеграция с платформами GitHub, Jira и Slack 💬Инструменты поиска файлов и индексации кода 💬Совместимость с фреймворками LLM, такими как LangChain, CrewAI, Autogen и LlamaIndex 🔎Как начать работу с SWE-Kit: pip install compsio-core swekit pip install crewai composio-crewai composio add github swekit scaffold crewai -o swe_agent cd swe_agent/agent python main.py SWE-Kit позволяет создавать и развертывать собственные агенты, такие как GitHub PR Agent для автоматизации проверки Pull Request, агент SWE для автоматического написания функций, модульных тестов и документации, а также инструмент для чата с кодовой базой. ➡️2. Aider - AI Pair-программист Aider - это идеальный выбор для тех, кто ищет виртуального парного программиста. Он позволяет связать программы с моделями машинного обучения (LLM) для редактирования кода в вашем локальном репозитории GitHub. 🔎Как начать работу с Aider: pip install aider-chat cd /to/your/git/repo export ANTHROPIC_API_KEY=your-key-goes-here aider # Или для работы с GPT-4 export OPENAI_API_KEY=your-key-goes-here aider ➡️3. Mentat — собственный агент кодирования GitHub Mentat - это инструмент на основе ИИ, призванный помочь разработчикам справиться с любой задачей по написанию кода из командной строки. В отличие от других инструментов, Mentat может координировать правки в нескольких файлах и понимает контекст проекта с самого начала. 🔎Как установить и запустить Mentat: python3 -m venv .venv source .venv/bin/activate git clone https://github.com/AbanteAI/mentat.git cd mentat pip install -e . export OPENAI_API_KEY=<your key… Читать полностью →
13 · 1.9K ·
P
Pythoner
Фотография
➡️5. Continue — ведущий помощник по написанию кода на базе ИИ Continue похож на популярную среду IDE Cursor, но имеет открытый исходный код под лицензией Apache. Он очень настраиваемый и позволяет добавлять любую языковую модель для автодополнения или чата. 🔎Основные характеристики: 💬Общение в чате для понимания и переработки кода в боковой панели 💬Автозаполнение для получения встроенных предложений кода по мере ввода текста 💬Редактирование кода без необходимости покидать текущий файл 💬Действия по созданию ярлыков для повседневных случаев использования ➡️6. Qodo Merge: инструмент для автоматизированного анализа запросов на извлечение Qodo Merge - это инструмент с открытым исходным кодом от Codium AI, который автоматизирует обзор, анализ, обратную связь и предложения для запросов на извлечение GitHub. Он совместим с другими системами контроля версий, такими как GitLab и BitBucket. 🔎Как использовать Qodo Merge: pip install pr-agent from pr_agent import cli from pr_agent.config_loader import get_settings def main(): provider = "github" user_token = "..." openai_key = "..." pr_url = "..." command = "/review" get_settings().set("CONFIG.git_provider", provider) get_settings().set("openai.key", openai_key) get_settings().set("github.user_token", user_token) cli.run_command(pr_url, command) if __name__ == '__main__': main() ➡️7. OpenHands: Платформа для разработчиков программного обеспечения на основе ИИ OpenHands - одна из ведущих платформ с открытым исходным кодом для агентов ИИ. Агент OpenHands может создавать новые проекты с нуля, добавлять функции в существующие кодовые базы, отлаживать проблемы и многое другое. 🔎Как запустить OpenHands: docker pull docker.all-hands.dev/all-hands-ai/runtime:0.12-nikolaik docker run -it --rm --pull=always \ -e SANDBOX_RUNTIME_CONTAINER_IMAGE=docker.all-hands.dev/all-hands-ai/runtime:0.12-nikolaik \ -v /var/run/docker.sock:/var/run/docker.sock \ -p 3000:3000 \ --add-hos… Читать полностью →
22 · 1.8K ·
P
Pythoner
Фотография
✈️Сегодня поговорим об асинхронных генераторах — фиче, которая может серьёзно прокачать ваш код. Но для начала давайте разберёмся, что это за зверь такой. ➡️Что такое асинхронный генератор? Представьте обычный генератор, но на стероидах. Асинхронный генератор — это функция, которая использует async def и yield для создания асинхронного итератора. Звучит сложно? На самом деле, это просто способ лениво создавать последовательность значений, не блокируя основной поток выполнения. ➡️Зачем они нужны? Асинхронные генераторы особенно полезны, когда вы работаете с I/O-bound задачами. Например, при обработке больших объёмов данных из сети или файловой системы. Они позволяют эффективно управлять памятью и повышают отзывчивость приложения. ➡️Как это выглядит на практике? async def async_range(start, stop): for i in range(start, stop): await asyncio.sleep(0.1) yield i async def main(): async for num in async_range(0, 5): print(num) asyncio.run(main()) ⬆️В этом примере async_range имитирует долгую операцию с помощью asyncio.sleep. В реальном коде вместо sleep могла бы быть работа с базой данных или API. ➡️Где это реально пригодится? 1. Парсинг данных: Представьте, что вам нужно обработать гигабайты логов. Асинхронный генератор позволит читать и обрабатывать данные порциями, не загружая всё в память разом. 2. Стриминг данных: При работе с потоковым API вы можете использовать асинхронный генератор для обработки данных по мере их поступления. 3. Пагинация: Если вы работаете с API, которое возвращает данные постранично, асинхронный генератор может абстрагировать логику пагинации, предоставляя удобный интерфейс для работы с данными. ➡️Подводные камни Помните, что асинхронные генераторы работают только внутри асинхронного кода. Их нельзя использовать в синхронных функциях. Кроме того, они могут быть сложнее для понимания и отладки, особенно для новичков в асинхронном программировании. 🐍Pythoner
23 · 1.6K ·
Pythoner
Фотография
✈️Библиотека functools в Python - это настоящая сокровищница для разработчиков, стремящихся оптимизировать свой код и расширить функциональные возможности языка. Хотя многие знакомы с такими популярными инструментами, как @lru_cache и partial, эта библиотека скрывает ряд менее известных, но не менее полезных функций. ➡️reduce(): мощь функционального программирования reduce() - это функция, которая применяет указанную функцию к итерируемому объекту, последовательно сводя его к единственному значению. Это мощный инструмент для обработки последовательностей данных, особенно когда нужно выполнить кумулятивные операции. Пример использования: from functools import reduce numbers = [1, 2, 3, 4, 5] product = reduce(lambda x, y: x * y, numbers) print(product) # Выведет: 120 ➡️singledispatch: элегантное решение для перегрузки функций @singledispatch позволяет создавать функции, которые ведут себя по-разному в зависимости от типа переданного аргумента. Это элегантная альтернатива множественным условным операторам. from functools import singledispatch @singledispatch def process(arg): print(f"Обработка объекта: {arg}") @process.register(int) def _(arg): print(f"Обработка целого числа: {arg}") @process.register(list) def _(arg): print(f"Обработка списка длиной {len(arg)}") process("строка") # Обработка объекта: строка process(42) # Обработка целого числа: 42 process([1, 2, 3]) # Обработка списка длиной 3 ➡️total_ordering: автоматическое создание методов сравнения Декоратор @total_ordering значительно упрощает реализацию классов, поддерживающих операции упорядочивания. Достаточно определить методы eq() и один из методов сравнения (lt, le, gt или ge), а остальные будут автоматически созданы. from functools import total_ordering @total_ordering class Person: def __init__(self, name, age): self.name = name self.age = age def __eq__(self, other): return self.age == other.age def __lt__(self, other): retur… Читать полностью →
29 · 1.8K ·
P
Фотография
✅Продолжаем! ➡️cache: простая альтернатива lru_cache Функция cache предоставляет простой способ кэширования результатов функции без ограничения размера кэша. Это может быть полезно, когда вы уверены, что количество уникальных входных данных ограничено. from functools import cache @cache def fibonacci(n): if n < 2: return n return fibonacci(n-1) + fibonacci(n-2) print(fibonacci(100)) # Мгновенный результат даже для больших чисел ➡️wraps: сохранение метаданных функции Декоратор @wraps помогает сохранить метаданные оригинальной функции при создании декораторов. Это особенно важно при использовании инструментов документации и отладки. from functools import wraps def my_decorator(func): @wraps(func) def wrapper(*args, **kwargs): """Это документация обертки""" print("До вызова функции") result = func(*args, **kwargs) print("После вызова функции") return result return wrapper @my_decorator def say_hello(name): """Приветствует пользователя по имени""" print(f"Привет, {name}!") say_hello("Мария") print(say_hello.__name__) # Выведет: say_hello print(say_hello.__doc__) # Выведет: Приветствует пользователя по имени 🐍Pythoner
22 · 1.9K ·
P
🐍Разбор Оператор continue используется в циклах для пропуска итерации в цикле. Таким образом, пока а<4, у нас просто происходит увеличение этой переменной, а из-за условия, итерация (и код ниже) скипаются. Далее у нас а станет равно 4. У нас не сработает ни один из if'ов и мы добавим это число 4 в result. Ну и на след. итерации а == 5, у нас сработает break, который принудительно завершит цикл в той же строке. Ответ: 4
1 · 2.2K ·
P
Pythoner
Фотография
✈️Asyncio: ваш секретный ингредиент для высоких нагрузок Представьте, что ваше приложение – это кухня в популярном ресторане. В синхронном мире у вас один шеф-повар, готовящий блюда по очереди. С asyncio у вас целая команда виртуозов, жонглирующих сковородками и готовящих несколько блюд одновременно. Вот это производительность! ➡️Настройка asyncio: тюнинг вашего кода 💬Выбор правильного event loop. Для Linux-систем рекомендую uvloop – он может разогнать ваше приложение до космических скоростей: import asyncio import uvloop asyncio.set_event_loop_policy(uvloop.EventLoopPolicy()) 💬Настройка пула потоков: loop = asyncio.get_event_loop() loop.set_default_executor(concurrent.futures.ThreadPoolExecutor(max_workers=10)) 💬Семафоры — Они помогут контролировать конкурентность и избежать перегрузок: sem = asyncio.Semaphore(10) async def controlled_task(i): async with sem: # Ваш асинхронный код здесь await asyncio.sleep(1) print(f"Задача {i} выполнена!") ➡️Лайфхаки для покорения высот производительности 💬Замените requests на aiohttp для HTTP-запросов. Это как пересесть с велосипеда на реактивный самолет – скорость поразит ваше воображение! 💬Используйте aiomysql или asyncpg для работы с базами данных. Ваши запросы будут молниеносными, словно Усэйн Болт на стометровке! 💬Профилируйте код с помощью cProfile или yappi. Найдите узкие места и оптимизируйте их, как настоящий хирург производительности. 🔎Продвинутые техники ➡️Используйте асинхронные контекстные менеджеры для элегантной обработки ресурсов: class AsyncContextManager: async def __aenter__(self): print("Entering the matrix...") await asyncio.sleep(1) return self async def __aexit__(self, exc_type, exc, tb): print("Exiting the matrix...") await asyncio.sleep(1) async def main(): async with AsyncContextManager() as manager: print("We're in!") ➡️Не забывайте про асинхронные генераторы – они могут творить настоящие чудеса в по… Читать полностью →
51 · 2.3K ·
P
Pythoner
Фотография
Представьте, что ваш код – это оркестр в Мариинском театре. Каждый инструмент (поток или корутина) играет свою партию. А вы – дирижёр, который должен убедиться, что все звучит гармонично. Вот только как это сделать, когда все играют одновременно? ➡️1. Изоляция – ключ к успеху Первое правило тестирования параллельного кода: изолируйте тесты! Каждый тест должен быть как отдельная комната в звукоизолированной студии. Используйте моки и стабы, чтобы симулировать внешние зависимости. Вот пример с использованием unittest.mock: from unittest.mock import patch import asyncio async def fetch_data(url): # Реальный запрос к API ... @patch('your_module.fetch_data') async def test_process_data(mock_fetch): mock_fetch.return_value = {'key': 'value'} result = await process_data('http://api.example.com') assert result == 'processed value' ⬆️Мы изолировали тест от реального API. Теперь он быстрый, как Усэйн Болт, и предсказуемый, как восход солнца! ➡️2. Детерминизм – ваш лучший друг Асинхронный код может быть непредсказуемым, как погода в Питере. Но ваши тесты должны быть стабильными, как гранитная набережная. Используйте семафоры, события и другие примитивы синхронизации, чтобы контролировать порядок выполнения. Вот пример с использованием asyncio.Event: import asyncio async def test_order_of_execution(): event = asyncio.Event() results = [] async def task1(): await event.wait() results.append(1) async def task2(): results.append(2) event.set() await asyncio.gather(task1(), task2()) assert results == [2, 1] ⬆️Этот тест всегда будет проходить, даже если вы запустите его на компьютере, работающем на картофельной батарейке! ➡️3. Таймауты – не просто для пиццы Установка таймаутов в тестах – это как страховка. Вы надеетесь, что она не понадобится, но лучше иметь ее под рукой. Вот как можно использовать таймауты в pytest: import pytest import asyncio @pytest.mark.asyncio async def test_long_runnin… Читать полностью →
29 · 2K ·
P
Pythoner
Фотография
✈️Docker - это платформа для разработки, доставки и запуска приложений в контейнерах. Контейнеры позволяют упаковать приложение со всеми его зависимостями в стандартизированный блок для разработки программного обеспечения. ➡️Основы Docker 💬Образы (Images): Шаблоны для создания контейнеров 💬Контейнеры: Запущенные экземпляры образов 💬Dockerfile: Инструкции для сборки образа 💬Docker Hub: Репозиторий для хранения и обмена образами ➡️Базовые команды Docker: # Сборка образа docker build -t my-image . # Запуск контейнера docker run -d --name my-container my-image # Просмотр запущенных контейнеров docker ps # Остановка контейнера docker stop my-container 🔎Продвинутые техники ➡️1. Docker Compose Docker Compose позволяет определять и запускать многоконтейнерные приложения. Пример docker-compose.yml файла: version: '3' services: web: build: . ports: - "5000:5000" redis: image: "redis:alpine" ➡️2. Docker Networking Docker предоставляет мощные возможности для создания сетей между контейнерами: 💬Bridge networks: Стандартная сеть для контейнеров на одном хосте 💬Overlay networks: Для связи контейнеров на разных хостах 💬Host networking: Использование сети хоста напрямую ➡️3. Docker Volumes Volumes используются для хранения данных вне контейнеров: # Создание volume docker volume create my-vol # Использование volume при запуске контейнера docker run -v my-vol:/app/data my-image ➡️4. Docker Swarm Docker Swarm - это инструмент для оркестрации контейнеров, позволяющий управлять кластером Docker-хостов: 💬Инициализация Swarm: docker swarm init 💬Развертывание сервиса: docker service create 💬Масштабирование: docker service scale ➡️Лучшие практики 💬Используйте многоэтапные сборки для оптимизации образов 💬Минимизируйте количество слоев в Dockerfile 💬Используйте .dockerignore для исключения ненужных файлов 💬Регулярно обновляйте базовые образы для безопасности ➡️Заключение Docker предоставляет мощный инструментарий для контейнеризации приложений,… Читать полностью →
43 · 2.3K ·
P
Pythoner
Фотография
✈️Сегодня поговорим о мощном инструменте, который может превратить вас в настоящего код-волшебника – Abstract Syntax Trees (AST). Если вы когда-нибудь задумывались, как работают линтеры, компиляторы или автоматические рефакторинг-инструменты, то добро пожаловать в увлекательный мир синтаксических деревьев! 🔎Представьте, что ваш код – это книга, а AST – её подробное содержание, где каждая глава, параграф и предложение аккуратно структурированы в древовидную форму. Каждый узел такого дерева представляет собой конструкцию вашего кода: функции, классы, операторы и даже отдельные переменные. ➡️В Python работа с AST стала намного проще благодаря встроенному модулю ast. Давайте разберем несколько практических примеров: 💬Базовый анализ кода: import ast code = """ def calculate_sum(a, b): result = a + b print(f"Sum: {result}") return result """ # Создаем AST tree = ast.parse(code) # Анализируем структуру for node in ast.walk(tree): if isinstance(node, ast.FunctionDef): print(f"Найдена функция: {node.name}") elif isinstance(node, ast.Name): print(f"Найдена переменная: {node.id}") ⬆️Этот простой пример показывает, как мы можем "гулять" по дереву AST и находить различные элементы кода. Это базовый строительный блок для создания более сложных анализаторов. 💬Трансформация кода: class DebugTransformer(ast.NodeTransformer): def visit_FunctionDef(self, node): # Добавляем отладочный print в начало каждой функции debug_print = ast.Expr( value=ast.Call( func=ast.Name(id='print', ctx=ast.Load()), args=[ast.Constant(value=f"Вызов функции {node.name}")], keywords=[] ) ) node.body.insert(0, debug_print) return node # Применяем трансформацию transformed = DebugTransformer().visit(tree) ⬆️Этот трансформер автоматически добавляет отладочный вывод в начало каждой функции. Представьте, насколько это удобно при отладке большого проекта!… Читать полностью →
28 · 2K ·
P
Pythoner
Фотография
✈️Serverless архитектура — это модель вычислений в облаке, где разработчики пишут код, а провайдер облачных услуг управляет серверами. Это позволяет сосредоточиться на разработке, не думая о серверной инфраструктуре. 👀Преимущества Serverless Архитектуры: - Снижение затрат: Платите только за фактическое использование ресурсов, что часто приводит к экономии средств. - Масштабируемость: Автоматическое масштабирование помогает справляться с любыми нагрузками без необходимости в ручном управлении. - Упрощение DevOps: Нет необходимости управлять серверами и их конфигурацией. ⭐️Недостатки Serverless Архитектуры: - Холодный старт: Время, необходимое для инициализации функции, может быть значительным и влиять на производительность. - Ограничения исполнения: Функции могут иметь ограничения по времени выполнения и памяти, что может быть проблематично для более сложных задач. - Зависимость от провайдера: Использование специфичных для провайдера технологий может привести к привязке к одному облаку. ➡️Заключение Serverless архитектура предоставляет мощный инструмент для современных разработчиков, предлагая значительную экономию времени и ресурсов. Однако, важно учитывать её ограничения при выборе данной модели для своего проекта. 🐍Pythoner
2 · 1.9K ·
P
Pythoner
Фотография
🦆Duck typing — это концепция, позволяющая использовать объекты независимо от их типа, базируясь на их свойствах и методах. Основная идея — не проверять тип объекта напрямую, а пытаться использовать его так, как нам нужно. 👀Преимущества: —Нет необходимости привязываться к конкретным классам и типам. —Код становится более гибким и менее связанным. —Легче расширять и изменять код, добавляя новые типы. —Упрощает полиморфизм. ➡️Пример кода: class Bird: def fly(self): return "I can fly!" class Duck(Bird): def quack(self): return "Quack!" class Airplane: def fly(self): return "I can also fly!" def make_it_fly(flyable_thing): print(flyable_thing.fly()) # Создаем объекты duck = Duck() airplane = Airplane() # Используем их, не смотря на разные типы make_it_fly(duck) # Выведет: I can fly! make_it_fly(airplane) # Выведет: I can also fly! ⬆️В этом примере функция make_it_fly принимает любой объект, который имеет метод fly(). Если объект соответствует этому интерфейсу, он будет выполнен, независимо от того, является ли объект уткой, самолетом или чем-то еще. 🔎Duck typing позволяет создавать более гибкий и динамичный код, так как вы можете использовать объекты, которые соответствуют необходимым интерфейсам, не заботясь о их конкретных классах. 🐍Pythoner
18 · 2K ·
P
Pythoner
Фотография
✈️Whylogs - это библиотека для логирования и анализа данных в Python. Она предназначена для легкого отслеживания метрик данных, которые могут помочь в мониторинге и улучшении производительности моделей машинного обучения. Почему это важно? Потому что понимание ваших данных и способов их изменений со временем может существенно повлиять на качество моделей. ➡️Основные функции Whylogs: —Автоматическое извлечение метрик: Библиотека собирает метрики, такие как распределения, статистики и т.д. —Поддержка различных форматов данных: Логирование можно выполнять для различных источников данных, включая Pandas DataFrames и потоковые данные. —Интеграция с другими инструментами: Whylogs легко интегрируется с другими библиотеками и фреймворками. ➡️Пример использования Whylogs: import whylogs as why import pandas as pd # Создание примера данных data = { "age": [25, 30, 35, 40, 45], "income": [50000, 60000, 70000, 80000, 90000] } df = pd.DataFrame(data) # Инициализация логгера logger = why.logger() # Логируем данные logger.log_dataframe(df) # Генерируем отчет report = logger.report() # Сохраняем отчет report.save("report.whylog") # Выводим на экран print(report) ⬆️В этом примере мы создаем DataFrame с двумя колонками: age и income. Затем мы инициализируем Whylogs логгер, логируем наш DataFrame, генерируем и сохраняем отчет. 👀Whylogs предоставляет мощные инструменты для отслеживания и анализа данных, улучшая тем самым процесс разработки, валидации и мониторинга моделей машинного обучения. 🐍Pythoner
14 · 2K ·
P
Pythoner
Фотография
✈️Сегодня поговорим о крутой фиче Python, которая может значительно сократить потребление памяти вашими объектами. Речь пойдёт об атрибуте slots! ➡️Для начала давайте разберемся, почему вообще возникла необходимость в slots. По умолчанию Python хранит атрибуты объектов в специальном словаре dict. Это удобно и гибко – можно добавлять новые атрибуты на лету. Но у такой роскоши есть цена: дополнительные накладные расходы на память. 🔎Представьте, что у вас миллион объектов класса User с парой атрибутов. Каждый такой объект тащит за собой словарь dict, а это прожорливая структура данных. И тут на сцену выходит наш герой – slots! # Без slots class User: def __init__(self, name, age): self.name = name self.age = age # Со slots class OptimizedUser: __slots__ = ['name', 'age'] def __init__(self, name, age): self.name = name self.age = age ➡️Что даёт нам slots? Вместо создания словаря Python выделяет фиксированный массив в памяти под указанные атрибуты. Это как переход от просторного лофта к компактной студии – места меньше, зато экономия налицо! ➡️Реальные цифры? На практике использование slots может сократить потребление памяти на 30-50% для простых объектов. А при работе с миллионами инстансов экономия становится более чем существенной. ➡️Где это реально пригодится: —В больших датасетах, где у вас тысячи/миллионы однотипных объектов —В микросервисах, где важна оптимизация памяти —В системах реального времени, где каждый байт на счету —В долгоживущих процессах, обрабатывающих потоки данных ➡️Подводные камни: —Нельзя добавлять новые атрибуты после определения класса —Наследование работает не так прозрачно, как с обычными классами —Некоторые метаклассы могут конфликтовать со slots ➡️Пример реального применения: class DataPoint: __slots__ = ['timestamp', 'value', 'sensor_id'] def __init__(self, timestamp, value, sensor_id): self.timestamp = timestamp self.value = value self.sensor_id… Читать полностью →
22 · 2K ·
P
Pythoner
Фотография
✈️Конструкция if __name__ == '__main__' используется для того, чтобы определить, запущен ли файл модуля напрямую или импортирован из другого модуля. ➡️Простой пример: def main(): # Точка входа в программу if __name__ == '__main__': main() ➡️Эта конструкция позволяет запустить какой-нибудь код только при прямом вызове модуля, так как name будет равно 'main' только если модуль запущен напрямую. ➡️Это позволяет запускать программу полностью только когда она основная, а не импортируется в качестве модуля. 🐍Pythoner
19 · 2.1K ·
P
Pythoner
Фотография
✈️Сегодня поговорим о настоящей магии в мире Python – метапрограммировании и динамическом создании функций. ➡️Начнем с простого примера. Помните eval() и exec()? Это базовые инструменты метапрограммирования, но использовать их нужно с осторожностью – как острый нож в руках повара. Гораздо интереснее копнуть глубже! def create_power_function(power): def power_func(x): return x ** power return power_func # Создаём функции на лету square = create_power_function(2) cube = create_power_function(3) ⬆️Но это только верхушка айсберга! Настоящее веселье начинается, когда мы подключаем модуль types и функцию exec с собственным словарем namespace. Это как собирать конструктор, только вместо деталей – части функции. 🔎А вы знали, что можно создавать функции с динамическим количеством аргументов? Или генерировать методы классов на лету? Это как будто у вас есть 3D-принтер для кода! import types def create_dynamic_function(func_name, args, body): namespace = {} func_code = f"def {func_name}({', '.join(args)}):\n{body}" exec(func_code, globals(), namespace) return namespace[func_name] # Магия в действии greet = create_dynamic_function( "greet", ["name"], " return f'Привет, {name}!'" ) ➡️Но помните – с большой силой приходит большая ответственность! Метапрограммирование может сделать код сложным для понимания. Используйте его мудро, когда выгода очевидна: —При создании API с повторяющимися паттернами —Для автоматизации рутинных задач —При разработке фреймворков и библиотек ➡️Отдельного внимания заслуживают декораторы – это ведь тоже метапрограммирование! Они как умные обёртки для функций, которые могут изменять их поведение. И да, их тоже можно создавать динамически! 🐍Pythoner
29 · 2.1K ·
P
Pythoner
Фотография
✈️Сегодня поговорим о том, как сделать работу с путями в Python более элегантной и современной. Если вы всё ещё используете os.path, то пора двигаться вперёд! ➡️Модуль pathlib появился в Python 3.4 и полностью изменил правила игры. Это как пересесть с древнего велосипеда на Tesla – всё те же базовые принципы, но сильно удобнее! 🔎Почему стоит перейти на pathlib? —Объектно-ориентированный подход вместо строковых операций —Кроссплатформенность из коробки —Цепочки методов, которые читаются как поэзия —Меньше кода, больше смысла ➡️Практические примеры: # Старый подход с os.path import os.path file_path = os.path.join('data', 'users', 'config.json') parent_dir = os.path.dirname(file_path) file_name = os.path.basename(file_path) # Новый подход с pathlib from pathlib import Path file_path = Path('data') / 'users' / 'config.json' parent_dir = file_path.parent file_name = file_path.name 👀Крутые фишки pathlib, о которых вы могли не знать: ➡️Проверка существования файла: path = Path('config.json') if path.exists(): print('Файл существует!') ➡️Создание директорий одной командой: Path('nested/directories/structure').mkdir(parents=True, exist_ok=True) ➡️Поиск файлов по маске (glob): # Найти все .py файлы в текущей директории python_files = list(Path('.').glob('*.py')) ➡️Работа с суффиксами и расширениями: path = Path('document.pdf') print(path.suffix) # .pdf print(path.stem) # document ➡️А теперь самое вкусное – цепочки методов: config_path = (Path.home() / 'projects' / 'app' / 'config.json') if config_path.exists(): data = json.loads(config_path.read_text()) ➡️Pro-tip: pathlib отлично работает с контекстными менеджерами: with Path('log.txt').open('w') as f: f.write('Logging started') 🔎Когда стоит использовать os.path? Практически никогда! Разве что при работе с легаси-кодом или если вам нужны какие-то очень специфические операции с путями. ⚡️В заключение: pathlib – это не просто альтернатива os.path, это следующий эволюционный шаг в работе с файлово… Читать полностью →
51 · 1.9K ·
P
Pythoner
Фотография
✈️Humanize — это библиотека для Python, которая помогает преобразовывать текстовые представления чисел, дат и других значений в более удобочитаемый человекообразный формат. Она используется для упрощения визуализации данных и улучшения пользовательского интерфейса. ➡️Humanize полезен в приложениях, где нужно отображать данные в интерфейсе: —Веб-приложения для отображения статистики. —Информационные табло и панели мониторинга. —Системы аналитики для визуализации данных. —CLI-интерфейсы для вывода данных пользователю. ➡️Несколько примеров: 💬Человеко-читаемые временные метки: import humanize import datetime # Пример: время, прошедшее с 24 сентября 2023 года dt = datetime.datetime(2023, 9, 24) print(humanize.naturaltime(dt)) # Вывод: "1 месяц назад" (на момент текущей даты) 💬Форматирование чисел: import humanize number = 1500 print(humanize.intcomma(number)) # Вывод: "1,500" print(humanize.intword(number)) # Вывод: "1.5 k" 💬Представление длительности: import humanize duration = 3661 # время в секундах print(humanize.precisedelta(datetime.timedelta(seconds=duration))) # Вывод: "1 час, 1 минутa, 1 секунда" 🔎Использование Humanize позволяет сделать отображение данных более естественным и понятным для человека. Это улучшает user experience приложения. 🐍Pythoner
35 · 2.2K ·
P
Pythoner
Фотография
✈️rename() — это функция из модуля os, которая позволяет переименовывать файлы и директории. Синтаксис функции: os.rename(old_name, new_name) ➡️Пример использования: import os # Переименуем файл 'старый_файл.txt' в 'новый_файл.txt' old_name = 'старый_файл.txt' new_name = 'новый_файл.txt' # Проверяем, существует ли старый файл if os.path.exists(old_name): os.rename(old_name, new_name) print(f'Файл переименован в {new_name}') else: print(f'Файл {old_name} не найден') ⬆️Обратите внимание: —Если файл с new_name уже существует, функция вызовет ошибку. —Убедитесь, что у вас есть необходимые права для выполнения этой операции. 🐍Pythoner
12 · 1.8K ·
P
Pythoner
Фотография
✈️ Модуль rich в Python предоставляет мощные возможности для улучшения визуального оформления терминальных приложений. С помощью rich можно создавать цветные тексты, таблицы, деревья, прогресс-бары и даже подсвечивать код. ➡️ Вот несколько практических примеров применения rich: 1. Цветной текст и стили from rich import print # Выводим текст с цветами и стилями print("[bold red]Ошибка:[/] Неверный ввод!") print("[green]Успех:[/] Данные сохранены.") print("Это [italic cyan]пример[/italic cyan] текста с [underline magenta]разными[/underline magenta] стилями.") ⬆️ Этот пример показывает, как легко добавлять стили и цвета в текст. Используются такие стили, как жирный, курсив и подчёркнутый. 2. Форматирование JSON from rich.console import Console from rich.json import JSON console = Console() # Пример JSON-данных data = '{"name": "Python3", "type": "Programming Language", "year": 2008}' # Форматированный вывод JSON console.print(JSON(data)) ⬆️ Удобно для визуализации JSON-данных с автоматической подсветкой синтаксиса. 3. Создание таблиц from rich.table import Table from rich.console import Console console = Console() table = Table(title="Сравнение языков программирования") table.add_column("Язык", style="bold", justify="left") table.add_column("Скорость", justify="right") table.add_column("Простота", justify="right") table.add_row("Python", "Средняя", "Высокая") table.add_row("Rust", "Высокая", "Средняя") table.add_row("C++", "Высокая", "Низкая") console.print(table) ⬆️ Таблицы помогают организовать данные, делая их читабельными и визуально привлекательными. 4. Прогресс-бар from time import sleep from rich.progress import Progress with Progress() as progress: task = progress.add_task("[cyan]Обработка данных...", total=100) for i in range(100): sleep(0.05) progress.update(task, advance=1) ⬆️ Прогресс-бары полезны для отображения выполнения долгих операций. 5. Дерево файлов from … Читать полностью →
54 · 2K ·
Pythoner
Фотография
✈️ В Python "plotly" — это библиотека для создания интерактивных графиков и визуализаций данных. "plotly" позволяет строить разнообразные типы графиков, включая линейные, точечные, гистограммы, круговые диаграммы, 3D-графики и многое другое. Они могут быть легко встроены в веб-приложения, отчеты и презентации, предоставляя пользователям возможность взаимодействовать с данными, масштабировать, панорамировать и выделять интересующие области. ➡️ Применение "plotly" широко распространено в области анализа данных, научных исследований, бизнес-аналитики и визуализации данных в веб-приложениях. Библиотека предоставляет удобный интерфейс для создания высококачественных, интерактивных графиков, которые помогают лучше понимать данные и извлекать из них ценную информацию. "Plotly" поддерживает различные фреймворки, такие как "Dash" и "Flask", что делает его мощным инструментом для создания динамических веб-приложений с интерактивными визуализациями. Кроме того, "plotly" можно использовать для создания автономных HTML-файлов с графиками, которые можно легко распространять и публиковать. ➡️ Вот пример использования "plotly" для построения интерактивного линейного графика: import plotly.graph_objects as go # Создаем данные для графика x = [1, 2, 3, 4, 5] y1 = [10, 11, 12, 13, 14] y2 = [8, 9, 10, 11, 12] # Создаем объект Figure fig = go.Figure() # Добавляем первый линейный график fig.add_trace(go.Scatter(x=x, y=y1, mode="lines+markers", name="Линия 1")) # Добавляем второй линейный график fig.add_trace(go.Scatter(x=x, y=y2, mode="lines+markers", name="Линия 2")) # Настраиваем заголовок и подписи осей fig.update_layout(title="Интерактивный линейный график", xaxis_title="X", yaxis_title="Y") # Отображаем график fig.show() # Сохраняем график в HTML-файл # fig.write_html("my_plotly_chart.html") ⬆️ В этом примере создается интерактивный линейный график с двумя линиями, отображающими зависимость "Y" от "X". Пользователь может взаимодей… Читать полностью →
33 · 1.8K ·
P
Фотография
✈️ В Python httpx — это современная HTTP-клиентская библиотека, которая предоставляет полный набор функций для работы с HTTP/1.1 и HTTP/2. httpx позволяют разработчикам легко и эффективно взаимодействовать с веб-серверами, отправляя запросы и получая ответы. ➡️ Применение httpx. httpx широко используется в различных сценариях, включая: - Веб-скрейпинг: Извлечение данных с веб-страниц. - API-интеграции: Взаимодействие с RESTful API. - Тестирование: Автоматизация тестирования веб-сервисов. - Микросервисы: Обмен данными между микросервисами. ➡️ Вот пример использования httpx: import httpx # Отправка GET-запроса response = httpx.get("https://api.github.com") # Проверка статуса ответа if response.status_code == 200: print("Успешный запрос!") print("Содержимое ответа:", response.text) else: print("Ошибка:", response.status_code) # Отправка POST-запроса data = {"key1": "value1", "key2": "value2"} response = httpx.post("https://httpbin.org/post", data=data) # Проверка статуса ответа if response.status_code == 200: print("Успешный POST-запрос!") print("Содержимое ответа:", response.json()) else: print("Ошибка:", response.status_code) ⬆️ В этом примере создается HTTP-клиент с использованием httpx, который отправляет GET и POST запросы на указанные URL. 🐍 Pythoner
26 · 1.6K ·

Открытая публичная лента из поискового индекса ChatCrawler — «Google по публичному Telegram»; обновляется по мере обхода площадки. Время — UTC.

Только публичный контент, официальный API Telegram. О проекте · Вопросы · Границы индекса · Убрать страницу из выдачи · Каталог · Поиск · Как мы считаем