Python_BE1
9 subscribers
748 photos
252 videos
7 files
672 links
Канал по Python, полезный и интересный контент для всех уровней.
По вопросам сотрудничества @cyberJohnny
Download Telegram
🐍 Хитрая задача для опытных Python-разработчиков
Почему этот код не работает как ожидается?
```

def magic():
return [lambda: i for i in range(5)]

funcs = magic()
results = [f() for f in funcs]
print(results)

```
На первый взгляд, ты ожидаешь результат:

```

[0, 1, 2, 3, 4]

```
Но на деле вывод будет:

```

[4, 4, 4, 4, 4]

```
🔍 Что пошло не так

lambda: i не захватывает значение i, а замыкается на саму переменную i, которая одна и та же для всех лямбд.
К моменту вызова всех функций i = 4 (последнее значение цикла), и все лямбды возвращают одно и то же.

Это классический пример late binding — лямбда "вспоминает" переменную, а не её значение в момент создания.

Как исправить

Способ 1: фиксируем значение i через аргумент по умолчанию

```

def magic():
return [lambda i=i: i for i in range(5)]

funcs = magic()
results = [f() for f in funcs]
print(results)

```
Теперь вывод:
```

[0, 1, 2, 3, 4]

```

Способ 2: functools.partial

```

from functools import partial

def f(x): return x
funcs = [partial(f, i) for i in range(5)]
results = [f() for f in funcs]
print(results)

```
🧠 Почему это важно

Такие баги встречаются:

- в колбэках и ивентах (например, при работе с GUI или CLI)

- в генерации функций внутри циклов
- в async-замыканиях и DSL-интерпретаторах
- в тестовых фреймворках, где создаются сценарии динамически

Понимание области видимости, замыканий и позднего связывания (late binding) — необходимый навык для confident-сеньора.

@python_be1
This media is not supported in your browser
VIEW IN TELEGRAM
🌟 alphaXiv —выпустили расширение для хрома

alphaXiv упрощает работу с научными статьями (arXiv, bioRxiv, PDF):

● чат с ИИ прямо в документе: выделение текста открывает диалог
● ссылки на другие статье через “@” для быстрого вызова статей
● позволяет генерировать блог одним кликом: иллюстрации к статьям, ключевые идеи, перевод
● закладки и автоматические BibTeX-цитаты для хранения и ссылок

https://chromewebstore.google.com/detail/alphaxiv-understand-resea/liihfcjialakefgidmaadhajjikbjjab

@python_be1
Полезный совет по Pytest:

Используйте пользовательские маркеры pytest, чтобы добавлять метаданные к тестам.

Это значительно упрощает организацию и запуск определённых групп тестов

В примере на изображении используются два пользовательских маркера:

🔹@pytest.mark.performance

– Применён к тесту для замера производительности test_page_load_time

🔹@pytest.mark.database

– Применён к тестам для работы с базой данных test_database_connection и test_data_integrity

Мы можем запускать выборочно, например тесты, помеченные маркером @pytest.mark.database

pytest -m database

@python_be1
🖥 Как написать ещё худший Python-код: часть 2

Первая часть - Как написать худший возможный Python-код .

Если тебе показалось, что хуже уже некуда — ты просто не включал всё сразу.

Вот продолжение правил, которые гарантируют страдания будущих читателей твоего кода.

14. Используй side‑effects везде
Изменяй список внутри функции, возвращай `None`, пусть никто не знает, что произошло.

```

def corrupt(data):
for i in range(len(data)):
data[i] = None

```
15. Ломай SRP (Single Responsibility Principle)
Пусть одна функция отправляет запрос, пишет лог, делает retry, парсит ответ и сохраняет в БД.

```

def handle_user_request(request):
log_request(request)
try:
response = requests.post(...)
save_to_db(json.loads(response.text)["data"])
except:
retry_later(request)

```

16. Используй вложенные функции ради хаоса
Функции в функциях в функциях. Замыкания? Да, но не ради пользы, а ради анархии.

```

def outer():
def middle():
def inner():
print("deep")
inner()
middle()

```

17. Импортируй всё звёздочкой
Пусть никто не знает, откуда приходят функции. Магия.

```

from somewhere.unknown import *

```

18. Используй случайную логику
Добавь random в бизнес-функции. Почему бы и нет?

```

import random

def calculate_discount():
return random.choice([0, 5, 10, 50])

```

19. Используй структуры не по назначению
Сохраняй все данные в строках. JSON, XML, дата, числа — всё строкой.

```

user = {
"name": "Alice",
"age": "27",
"is_active": "true",
"joined": "2023-12-01"
}
```

20. Игнорируй ошибки
Тихо, мирно, try/except без except. Или просто pass. Не паникуй.

```

try:
do_critical_operation()
except:
pass

```

21. Логируй всё подряд
Каждый шаг. Каждую переменную. Каждую мысль.

```

print("entering loop")
print("value of x:", x)
print("loop end")

```

22. Используй глобальные настройки через переменные
Никаких config-файлов. Пусть все настройки — глобальные переменные.

```

DEBUG_MODE = True
RETRY_COUNT = 3

```
23. Пиши асинхронный код синхронно
async с time.sleep, await с requests.get. Главное — выглядеть современно.

```

import time

async def fetch_data():
time.sleep(3)
return "data"

```
24. Храни всё в одной функции
1000 строк? Один def main(). Абсолютно всё. Другие функции — для слабаков.

```

def main():
# 600 строк бизнес-логики
pass

```

🧠 Заключение

Если ты следуешь этим правилам — ты либо пишешь код, который никто не осмелится менять,
либо работаешь на тёмной стороне. Но лучше всё же пересмотреть подход.

"Simple is better than complex.
Complex is better than complicated.
Readability counts."
— The Zen of Python

@python_be1
Что выведет код ?

@python_be1
🛠️ Copier — удобный инструмент для создания и обновления проектов из шаблонов. Эта Python-утилита умеет работать как с локальными путями, так и с Git-репозиториями, подставляя переменные в файлы любого формата. Главная фишка Copier — это аккуратная работа с существующими файлами: он не перезаписывает их без явного указания.

Инструмент будет полезен тем, кто часто создаёт однотипные проекты или хочет автоматизировать их обновление. Шаблоны поддерживают сложную логику через Jinja2, а настройки задаются в простом YAML-формате. Для начала работы достаточно установить Copier через pipx или pip. Проект развивается при поддержке сообщества и доступен под лицензией MIT.

🤖 GitHub (https://github.com/copier-org/copier)

@python_be1
🎯 Хочешь следить за загрузкой своей GPU прямо из Python?

Вот простой скрипт, который показывает текущую загрузку видеокарты NVIDIA (через `nvidia-smi`). Подходит для мониторинга в ML-задачах, инференсе и просто для интереса.

📦 Зависимости: установленный `nvidia-smi` и Python 3.6+

🧠 Код:

```

import subprocess

def get_gpu_utilization():
try:
result = subprocess.check_output(
['nvidia-smi', '--query-gpu=utilization.gpu,memory.used,memory.total',
'--format=csv,nounits,noheader'],
encoding='utf-8'
)
lines = result.strip().split('\n')
for idx, line in enumerate(lines):
gpu_util, mem_used, mem_total = map(str.strip, line.split(','))
print(f"🖥 GPU {idx}: {gpu_util}% load | {mem_used} MiB / {mem_total} MiB")
except FileNotFoundError:
print(" nvidia-smi not found. Make sure NVIDIA drivers are installed.")
except Exception as e:
print(f"⚠️ Error: {e}")

get_gpu_utilization()

```

📊 Вывод будет примерно такой:

`GPU 0: 23% load | 412 MiB / 8192 MiB`

🔥 Советы:
• Можно запускать в цикле для live-мониторинга
• Легко интегрировать в Telegram-бота или Slack-уведомления
• Работает на всех машинах с установленным NVIDIA драйвером и nvidia-smi

@python_be1
This media is not supported in your browser
VIEW IN TELEGRAM
Cursor теперь в браузере и в телефоне — вышла (https://www.cursor.com/blog/agent-web) веб-версия любимого приложения вайб-кодеров ⌨️

Функционал почти полностью аналогичен десктопной версии, есть синхронизация с GitHub. Идея утопическая: дать вайб-кодерам возможность зайтись где-нибудь на пляже и удаленно раздавать команды сверхумным агентам.

Можно заценить здесь (https://www.cursor.com/agents).

@python_be1
⚔️ LIEF — мощная библиотека для работы с исполняемыми файлами, которая поддерживает ELF, PE и MachO-форматы. Этот проект позволяет не только анализировать структуру бинарников, но и модифицировать их — добавлять секции, менять символы или даже работать с Objective-C метаданными.

Инструмент выделяется кроссплатформенностью и мультиязычным API (Python, Rust, C++). Библиотека умеет дизассемблировать код под разные архитектуры и интегрируется с Ghidra/BinaryNinja. Будет полезно для реверс-инжиниринга, анализа вредоносного ПО или кастомной линковки.

🤖 GitHub (https://github.com/lief-project/LIEF)

@python_be1
⚡️ PyOpenCL — ускоряем Python вычисления на GPU. Этот проект даёт доступ к технологии OpenCL прямо из Python, позволяя задействовать не только видеокарты, но и любые параллельные вычислительные устройства. Он сочетает низкоуровневый контроль с автоматической обработкой ошибок и привязкой жизненного цикла объектов.

Инструмент имеет обширную документацию с примерами: от простого поэлементного умножения массивов до сложных алгоритмов с использованием локальной памяти GPU. Проект работает с реализациями OpenCL от Apple, AMD и Nvidia, а установка через Conda занимает буквально пару команд.

🤖 GitHub (https://github.com/inducer/pyopencl)

@python_be1
This media is not supported in your browser
VIEW IN TELEGRAM
Как быстро найти, какой процесс держит порт в Linux

Когда порт занят, а ты не знаешь какой процесс его занимает — вместо копаний в журналах можно сразу найти виновника одной командой.

Особенно полезно при отладке dev-серверов, docker, ssh и прочего.

Это незаменимая команда, когда nginx не стартует, python выдает ошибки, или docker ругается на занятый порт.

Ставь лайк и подписывайся — каждый день публикуем полезные и не банальные советы для разработчиков. Пиши в коментах какие команды используешь каждый день!

///
sudo lsof -i :PORT

или

sudo fuser -v PORT/tcp

-lsof покажет PID, команду, пользователя и путь
- fuser сразу скажет, можно ли убить процесс (-k для убийства)
- Работает с TCP и UDP (например, fuser -v 53/udp для DNS)

@python_be1
🧩 Задача для разминки

Что выведет этот код? Попробуй догадаться без запуска.

```

class Sneaky:
def __eq__(self, other):
print("Comparing!")
return True

a = Sneaky()
b = [a]

print(a in b)
print(a == b[0])
print(b.count(a))

```

🤔 Подумай: сколько раз вызовется <i>eq</i>?

🎯 Разбор:

print(a in b)
🔍 Проверка a in b вызывает b.__contains__(a), который по умолчанию использует ==.
👉 Вызовется <i>eq</i>, будет True.

print(a == b[0])
🔍 Прямое сравнение — снова <i>eq</i>.

print(b.count(a))
🔍 list.count сравнивает каждый элемент с ==. В нашем списке один элемент — a.
👉 Опять вызывается <i>eq</i>.

[спойлер: 💥 Вывод будет:

Comparing!
True
Comparing!
True
Comparing!
1]

📌 [спойлер: Вывод: __eq__ сработал 3 раза, и каждый раз напечатал "Comparing!".

🧠 Уловка: Python-списки используют ==, даже если это один и тот же объект! Да, a == a всё равно вызовет __eq__, если он определён.

⚠️ Фишка для интервью:
Можно подменить поведение ==, но is (сравнение идентичности) всегда быстрее и не вызывает магии.]

@python_be1
Что выведет код ?

@python_be1
This media is not supported in your browser
VIEW IN TELEGRAM
Linux: как быстро найти, какие файлы занимают больше всего места в системе

Когда df -h показывает, что диск забит, но ты не понимаешь, что именно съело память, вот команда, которая спасает.

Она отлично работает, когда нужно:
– найти огромный лог или зависший кэш
– понять, где лежит более 100 Гигабайт
– навести порядок перед бэкапом системы

Для интерактивного анализа — можно подключить ncdu.

@python_be1
💼 Готовый проект на Python: асинхронный сервис отслеживания цены акций

Отслеживает цены акций в реальном времени, рассылает push-уведомления при достижении триггеров и предоставляет REST + WebSocket API для фронтенда.

Почему проект ценен для портфолио

- Показывает владение современным стеком: FastAPI + WebSockets + asyncio, PostgreSQL, Redis, Docker, CI/CD.

- Демонстрирует продвинутые практики: типы (pydantic, mypy), тесты (pytest, pytest-asyncio), линтеры, GitHub Actions.

- Подходит для live-демо: легко задеплоить на Render/Fly.io/Hetzner и показать работу в браузере.

➡️ Читать статью (https://uproger.com/gotovyj-portfelnyj-proekt-na-python-asinhronnyj-servis-otslezhivaniya-czeny-akczij/)

@python_be1
Лучшие базы данных — и где они их использовать

1. PostgreSQL — универсальная реляционная БД
→ бизнес-приложения, аналитика, геоданные (PostGIS), JSON + SQL в одном

2. SQLite — встраиваемая БД без сервера
→ мобильные приложения, локальное хранение, CLI-инструменты, тесты

3. MySQL / MariaDB — быстрые SQL-БД для веба
→ сайты, CMS, WordPress, стартапы с LAMP-стеком

4. MongoDB — документо-ориентированная NoSQL
→ JSON‑подобные данные, прототипы, быстро меняющиеся схемы

5. Redis — in-memory key-value store
→ кеширование, очереди, счётчики, real-time метрики

6. ClickHouse — колоночная аналитическая БД
→ аналитика, лог-системы, BI‑дашборды, миллиарды строк — за миллисекунды

7. Neo4j — графовая БД
→ социальные графы, связи между сущностями, рекомендации

8. TimescaleDB — time-series над PostgreSQL
→ телеметрия, мониторинг, временные ряды, IoT

9. Cassandra — масштабируемая распределённая NoSQL
→ high-availability, терабайты данных, логика без джинов.

10. DuckDB — это современная in-process аналитическая СУБД, разработанная как “SQLite для аналитики

t.me/ - наш телеграм канал с гайдами

@python_be1
🕸️ Chat4Data — расширение, которое превращает веб-скрапинг в диалог

Вместо кода и настроек — просто говоришь, что хочешь, и AI собирает структурированные данные с сайта.

Что умеет Chat4Data:

🔹 Собирает данные “на слух”
Опиши нужную таблицу или список — AI сам найдёт, распарсит и вставит в таблицу. Не нравится результат? Переспроси. Без кода, без боли.

🔹 Обходит все страницы сам
Автоматически кликает “Следующая”, грузит подгружаемые списки и собирает всё — без твоего участия.

🔹 Запускается за 3 клика
AI сам определяет, какие данные ценные, предлагает их — тебе остаётся только подтвердить. Быстро, как в Telegram-боте.

🔹 Не тратит токены на скрапинг
Анализ страницы — на AI, но сами данные забираются без токенов. В бета-версии дают 1 миллион токенов на другие задачи.

🔹 Скоро: скрапинг подстраниц, интерактив, интеграции...

📎 https://chat4data.ai

#ai #scraping #automation #nocode #tools

@python_be1
⚡️ Microsoft обновила собственный бесплатный курс по генеративному ИИ

В курсе видео, практика (код) и дополнительные материалы.
Пргорамма курса состоит из изучения структуры и работы LLM, тонкостям промптинга, созданию собственного приложения для генерации изображений, функционалу RAG для LLM и принципам файнтюна.

📌 А здесь мы вылудили полный список бесплатных курсов. (https://uproger.com/luchshie-besplatnye-kursy-po-iskusstvennomu-intellektu/)

Для прохождения курса нужны:
- учетная запись на Azure
- доступ к api OpenAI

Разумеется, все методики и манипуляции предлагается выполнять обучающимся в экосистеме Microsoft, на их мощностях и с использованием их сервисов.

Бэкенд учебного приложения для генерации картинок - DALLE и Midjourney.
Большие надежды строить относительно курса не стоит - экосисистема Microsoft требует отдельных компетенций, но в качестве базового структурированного курса для новичков - вполне подойдет.

🖥 Курс полностью выложен на Github: https://github.com/microsoft/generative-ai-for-beginners

@python_be1
This media is not supported in your browser
VIEW IN TELEGRAM
🧠 Ускорь import в Python-проектах с помощью lazy loading — без изменения логики

Если у тебя проект с тяжёлыми модулями (`pandas`, `torch`, `tensorflow`), но они не всегда нужны — не загружай их зря. Python позволяет **отложить импорт до первого использования**, через встроённый `importlib`.

Вот как это выглядит на практике:

```

import importlib

# Обёртка для ленивого импорта
def lazy_import(name):
return importlib.util.LazyLoader(importlib.import_module(name))

# Использование
np = lazy_import('numpy')
# numpy ещё не загружен

# Теперь загрузится:
print(np.array([1, 2, 3]))
```

@python_be1