Ghostly Python
8.83K subscribers
540 photos
24 videos
607 links
Погружаемся в мир Python: задачи, фишки, библиотеки и террабайты полезного материала.

Сотрудничество: @heywan_n1

Цены: @heywan_media

Реклама на бирже: https://telega.in/c/+IOa15XDNbxRkYzNi
Download Telegram
👩‍💻 Как вайбкодинг убивает волю к решению проблем

Автор — ML-инженер, решивший протестировать такое явление как «вайбкодинг». Это полезно, или плохо?

В статье автор даст советы по тому, каким образом лучше всего использовать нейронки в работе, чтобы не загнать себя в глубокую-глубокую яму.

➡️ Ссылка на статью

🐍 Ghostly Python | #статья
Please open Telegram to view this post
VIEW IN TELEGRAM
3
Please open Telegram to view this post
VIEW IN TELEGRAM
🤔12😁7
🖼️ Библиотека pendulum — работа с датами и временем без головной боли

Pendulum — это элегантная замена стандартному модулю datetime, которая решает его проблемы с временными зонами, форматированием и манипуляциями. Вместо тонн boilerplate-кода вы получаете чистый, читаемый и интуитивный API.

⚙️ Пример использования:

import pendulum

# 1. Создание дат (намного проще чем datetime)
now = pendulum.now()
print(f"Сейчас: {now}")

# Создание с конкретной временной зоной
moscow_time = pendulum.now('Europe/Moscow')
ny_time = pendulum.now('America/New_York')

print(f"Москва: {moscow_time}")
print(f"Нью-Йорк: {ny_time}")

# 2. Разбор строк (парсинг)
date_str = "2024-03-15 14:30:00"
parsed = pendulum.parse(date_str)
print(f"Распарсено: {parsed}")

# Автоматическое определение формата
flexible_parse = pendulum.parse("15 марта 2024, 14:30")
print(f"Гибкий парсинг: {flexible_parse}")

# 3. Манипуляции с датами (человеко-читаемые)
tomorrow = now.add(days=1)
next_week = now.add(weeks=1)
last_month = now.subtract(months=1)
next_year_same_day = now.add(years=1)

print(f"Завтра: {tomorrow}")
print(f"Следующая неделя: {next_week}")
print(f"Прошлый месяц: {last_month}")

# 4. Разница между датами (человеко-читаемая)
birthday = pendulum.datetime(1990, 5, 15)
diff = now - birthday
print(f"Возраст: {diff.in_words()}") # → "33 года 2 месяца"

# 5. Форматирование (мощное и гибкое)
print(now.format('dddd, D MMMM YYYY HH:mm:ss'))
print(now.format('YYYY-MM-DD HH:mm', locale='ru'))

# 6. Интуитивные сравнения
event_date = pendulum.datetime(2024, 12, 31)
if event_date > now:
print(f"Событие через {now.diff_for_humans(event_date)}")


✔️ Установка:

pip install pendulum


➡️ Ссылка на документацию

🐍 Ghostly Python | #библиотеки
Please open Telegram to view this post
VIEW IN TELEGRAM
5❤‍🔥2
Вопрос с собеса

Как работать со срезами строк в Python и чем это удобнее ручного перебора символов?

Пример🔽

```python
# Без срезов (ручное извлечение символов)
text = "Привет, мир!"
first_char = text[0]
last_char = text[len(text)-1]
substring = ""
for i in range(3, 8):
substring += text[i]

print(first_char) # П
print(last_char) # !
print(substring) # вет,

# Со срезами (лаконичный доступ к частям строки)
text = "Привет, мир!"
first_char = text[0]
last_char = text[-1]
substring = text[3:8]

print(first_char) # П
print(last_char) # !
print(substring) # вет,

# Обратный порядок и шаг одной строкой
reversed_text = text[::-1]
every_second = text[::2]

print(reversed_text) # !рим ,тевирП
print(every_second) # Пве,и
```


Ответ🔽

Срезы ([start:stop:step]) позволяют извлекать подстроки, копировать строки или переворачивать их без циклов и лишнего кода. Python рассматривает строки как последовательности, поэтому синтаксис срезов един для строк, списков и кортежей, делая код читаемым и выразительным.


🐍 Ghostly Python | #собес
Please open Telegram to view this post
VIEW IN TELEGRAM
6😱1
👩‍💻 Решаем VRP-задачи, или Как мы в Додо доставку оптимизировали

В статье рассказывают, что такое VRP-задачи в доставке, чем они отличаются друг от друга, какие готовые решения уже можно пробовать и на что точно не стоит тратить время.

➡️ Ссылка на статью

🐍 Ghostly Python | #статьи
Please open Telegram to view this post
VIEW IN TELEGRAM
👩‍💻 Викторина: что выведет код?

from collections import OrderedDict

call_depth = 0

def trace(func):
def wrapper(*args, **kwargs):
global call_depth
call_depth += 1
indent = " " * call_depth
print(f"{indent} {func.__name__}({', '.join(map(str, args))})")
result = func(*args, **kwargs)
print(f"{indent} {result}")
call_depth -= 1
return result
return wrapper

def lru_cache(maxsize=2):
cache = OrderedDict()

def decorator(func):
def wrapper(*args, **kwargs):
key = (args, tuple(sorted(kwargs.items())))

if key in cache:
cache.move_to_end(key)
return f"[CACHE] {cache[key]}"

result = func(*args, **kwargs)
cache[key] = result

if len(cache) > maxsize:
cache.popitem(last=False)

return f"[NEW] {result}"
return wrapper
return decorator

@lru_cache(maxsize=2)
@trace
def fibonacci(n):
if n < 2:
return n
return fibonacci(n-1) + fibonacci(n-2)

print(fibonacci(4))
print(fibonacci(3))
print(fibonacci(5))
print(f"max depth: {call_depth}")


🐍 Ghostly Python | #викторина
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
😁22😱3❤‍🔥1
🖼️ Библиотека request — самая популярная библиотека в Python для выполнения HTTP-запросов (GET, POST, PUT, DELETE и т.д.).

Встроенный в Python модуль urllib работает, но он неудобный и громоздкий. Requests делает то же самое, но в 10 раз проще и понятнее.

⚙️ Пример использования:

import requests

# 1. GET-запрос (самое частое)
response = requests.get("https://api.github.com/users/python")
print(response.status_code) # 200
print(response.json()["name"]) # Python Software Foundation

# 2. POST-запрос с данными
new_post = requests.post(
"https://jsonplaceholder.typicode.com/posts",
json={"title": "Мой пост", "body": "Текст", "userId": 1}
)
print(new_post.status_code) # 201 (создано)
print(new_post.json()["id"]) # 101

# 3. Обработка ошибок
bad_response = requests.get("https://api.github.com/user/999999999")
if bad_response.status_code == 404:
print(“Пользователь не найден")


✔️ Установка:

pip install requests

🐍 Ghostly Python | #библиотеки
Please open Telegram to view this post
VIEW IN TELEGRAM
1
👩‍💻 Краткий справочник про внимания

В статье с нуля разбирается что такое внимание (Attention), принципы работы, и как это вообще использовать.

➡️ Читаем по ссылке

🐍 Ghostly Python | #статьи
Please open Telegram to view this post
VIEW IN TELEGRAM
👩‍💻 Викторина: что выведет код?

import time

history = []

def delay_printer(sec):
def decorator(func):
def wrapper(n):
time.sleep(sec)
result = func(n)
history.append(result)
return f"[D{sec}] {result}"
return wrapper
return decorator

def counter(func):
def wrapper(n):
wrapper.count += 1
result = func(n)
return f"[#{wrapper.count}] {result}"
wrapper.count = 0
return wrapper

@delay_printer(1)
@counter
def double(x):
return x * 2

@delay_printer(2)
@counter
def triple(x):
return x * 3

print(double(5))
print(triple(5))
print(double(5))
print(f"history: {history}")


🐍 Ghostly Python | #викторина
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1
👩‍💻 Самый быстрый способ читать Excel в Python

В статье результаты тестирования pandas, openpyxl, Tablib, DuckDB, LibreOffice и даже связки с Rust. Кто справился лучше всех и как за 4 секунды Python «проглотил» полмиллиона строк.

➡️ Ссылка на статью

🐍 Ghostly Python | #статьи
Please open Telegram to view this post
VIEW IN TELEGRAM
1
📱 Фишка: functools.cached_property — ленивое свойство с кэшированием

cached_property превращает метод в свойство, которое вычисляется один раз при первом доступе и кэшируется в экземпляре. Полезно для дорогих вычислений и ленивой инициализации

from functools import cached_property
import time

class Report:
def init(self, user_id):
self.user_id = user_id

@cached_property
def stats(self):
print("Вычисляю...") # выполнится только при первом доступе
time.sleep(1)
return {"orders": 42, "spent": 199.99}


r = Report(123)
print(r.stats) # первый доступ — расчёт и кэширование
print(r.stats) # последующие — мгновенно из кэша
del r.dict["stats"] # инвалидация кэша
print(r.stats) # пересчёт после инвалидации


📌 Как это работает?

🟢 @cached_property сохраняет результат в instance.__dict__ под именем свойства.
🟢 Для обновления данных удалите кэш: del obj.__dict__["attr"] — значение пересчитается при следующем доступе.
🟢 Идеально для «ленивых» параметров: конфигов, аггрегатов из БД/API, тяжёлых вычислений

🐍 Ghostly Python | #фишки
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥2
🖼️ Легковесная и мощная платформа для многоагентных рабочих процессов

OpenAI Agents SDK — это легковесная, но мощная платформа для создания рабочих процессов с участием нескольких агентов. Она не зависит от конкретного поставщика услуг и поддерживает API OpenAI Responses и Chat Completions, а также более 100 других LLM-модулей.

➡️ Ссылка на платформу

🐍 Ghostly Python | #ресурс
Please open Telegram to view this post
VIEW IN TELEGRAM
2
Что выведет код?
Anonymous Quiz
42%
31 | 2 | 32
16%
31 | 2 | 42
17%
21 | 2 | 32
25%
32 | 1 | 42
💩51
👩‍💻 Викторина: что выведет код?

def make_counter():
count = [0]

def increment():
count[0] += 1
return count[0]

def get():
return count[0]

return increment, get

inc1, get1 = make_counter()
inc2, get2 = make_counter()

inc1()
inc1()
inc2()
inc1()

print(get1(), get2())
print(inc2())
print(get1(), get2())


🐍 Ghostly Python | #викторина
Please open Telegram to view this post
VIEW IN TELEGRAM
💩7😁2