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

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

Цены: @heywan_media

Реклама на бирже: https://telega.in/c/+IOa15XDNbxRkYzNi
Download Telegram
👩‍💻 Как вызывать C++ из Python

Сравнение PyBind11 и ctypes: когда нужна простота и совместимость типов — выбираем PyBind11, для низкоуровневого доступа — ctypes. Как подключать C++ к Python без жертв в интерактивности.

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

🐍 Ghostly Python | #статьи
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2
📱 Фишка: heapq — работа с кучами и приоритетами в Python

Модуль heapq из стандартной библиотеки позволяет использовать список как двоичную минимальную кучу (heap). Это идеальный инструмент для реализации приоритетных очередей и поиска наименьших элементов.

import heapq

nums = [7, 1, 4, 9, 2]

# Превращаем список в кучу
heapq.heapify(nums)
print(nums) # ➔ [1, 2, 4, 9, 7] (куча, не просто отсортированный список)

# Извлекаем минимальный элемент
min_item = heapq.heappop(nums)
print(min_item) # ➔ 1

# Добавляем элемент с сохранением свойств кучи
heapq.heappush(nums, 3)
print(nums) # ➔ [2, 3, 4, 9, 7]


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

🟢 heapify() превращает список в структуру данных "куча" за O(n).
🟢 heappop() извлекает минимальный элемент за O(log n).
🟢 heappush() вставляет новый элемент, сохраняя свойства кучи.

🐍 Ghostly Python | #фишки
Please open Telegram to view this post
VIEW IN TELEGRAM
👍71
Please open Telegram to view this post
VIEW IN TELEGRAM
12👍1
👩‍💻 Генерация уникальных идентификаторов с помощью uuid

Модуль uuid из стандартной библиотеки Python позволяет создавать уникальные идентификаторы, которые можно использовать в базах данных, логах, конфигурациях и любых случаях, где важна уникальность.

⚙️ Пример: создание UUID разных версий

import uuid

# UUID на основе времени (версия 1)
print(uuid.uuid1()) # ➔ 8f14e45f-ea6e-11ec-8fea-0242ac120002

# UUID на основе MD5-хеша (версия 3)
print(uuid.uuid3(uuid.NAMESPACE_DNS, "example.com"))

# Случайный UUID (версия 4)
print(uuid.uuid4())

# UUID на основе SHA-1 (версия 5)
print(uuid.uuid5(uuid.NAMESPACE_DNS, "example.com"))


💬 Как это работает:

1. uuid.uuid1() — использует MAC-адрес и время (можно отслеживать источник).

2. uuid.uuid3() и uuid.uuid5() — хешируют строку с неймспейсом.

3. uuid.uuid4() — полностью случайный UUID, безопасный для большинства применений

🟢 Используется при генерации ключей, ссылок, сессий.
🟢 Все UUID соответствуют стандарту RFC 4122.
🟢 Можно использовать как строку или как байты (.hex, .int, .bytes).


🐍 Ghostly Python | #гайды
Please open Telegram to view this post
VIEW IN TELEGRAM
2👍1
👩‍💻 Запускаем несколько интерпретаторов в коде на Python — невероятная скорость

Рассказываю, как теперь можно запускать несколько интерпретаторов в одном Python-процессе с отдельным GIL. Плюсы, детали реализации и зачем это вообще всё нужно.

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

🐍 Ghostly Python | #статьи
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3
Вопрос с собеса

В чём разница между shallow copy и deep copy в Python?

Пример🔽
import copy

original = [[1, 2], [3, 4]]

shallow = copy.copy(original)
deep = copy.deepcopy(original)

original[0][0] = 99

print(shallow) # ➔ [[99, 2], [3, 4]]
print(deep) # ➔ [[1, 2], [3, 4]]


Ответ🔽
copy.copy() создаёт поверхностную копию объекта. Это значит, что сам объект копируется, но вложенные объекты продолжают ссылаться на те же данные.

copy.deepcopy() создаёт глубокую копию: копирует и сам объект, и все вложенные объекты, рекурсивно. В результате оригинал и копия полностью независимы.

🟢 Когда использовать:

copy() — если объект неглубокий и вложенные данные не будут изменяться.

deepcopy() — если нужно полностью изолировать копию от оригинала, включая всё содержимое.

❗️Важно: deepcopy может быть медленным на больших и вложенных структурах. Используйте осознанно.

📌 Подходит для работы со сложными структурами данных: списками списков, словарями, графами и т.д.


🐍 Ghostly Python | #собес
Please open Telegram to view this post
VIEW IN TELEGRAM
👍62
Please open Telegram to view this post
VIEW IN TELEGRAM
🥰16👍1🔥1
🖼️ Библиотека: deepdiff

DeepDiff — это мощная библиотека для поиска различий между любыми Python-объектами: словарями, списками, наборами, вложенными структурами.

ℹ️ Основные возможности:

🟢 Поиск различий между структурами любой глубины
🟢 Поддержка сравнения списков, словарей, множеств, объектов
🟢 Выдаёт точные пути до отличий (например: root['user'][0]['name'])
🟢 Форматы для сериализации (JSON) и "патчи" для применения изменений


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

from deepdiff import DeepDiff

a = {"name": "Alice", "age": 30, "skills": ["Python", "SQL"]}
b = {"name": "Alice", "age": 31, "skills": ["Python", "Go"]}

diff = DeepDiff(a, b)
print(diff)

Вывод:
{'values_changed': {
"root['age']": {'new_value': 31, 'old_value': 30},
"root['skills'][1]": {'new_value': 'Go', 'old_value': 'SQL'}
}}


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

pip install deepdiff


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

🐍 Ghostly Python | #библиотеки
Please open Telegram to view this post
VIEW IN TELEGRAM
7
👩‍💻 Сравниваю автоматизацию n8n и скрипт на Python

Сделала автоматизацию: письма парсим, тему сверяем с Excel, логика — по листам. Всё локально и на n8n — чтоб заказчику не мучиться. Один логин в терминале, и всё крутится.

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

🐍 Ghostly Python | #статьи
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2
➡️ Python Morsels — ресурс с продвинутыми задачами по Python и подробными разбором решений

Python Morsels — это платформа, на которой каждую неделю присылаются небольшие, но глубокие задачи по Python.

Основной акцент — не просто на синтаксис, а на идиоматичный код, использование стандартной библиотеки и продвинутые концепции.


⛓️ Ссылка на ресурс

🐍 Ghostly Python | #ресурсы
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥25🤔3
📱 Фишка: collections.deque — двусторонняя очередь с быстрой вставкой и удалением

deque (двусторонняя очередь) из модуля collections — это более эффективная альтернатива спискам, когда часто требуется вставка или удаление с начала и конца.

from collections import deque

# Создаём deque
queue = deque(["Алиса", "Боб", "Чарли"])

# Добавляем в конец и в начало
queue.append("Дэвид")
queue.appendleft("Эва")
print(queue) # ➔ deque(['Эва', 'Алиса', 'Боб', 'Чарли', 'Дэвид'])

# Удаляем с конца и начала
queue.pop() # ➔ 'Дэвид'
queue.popleft() # ➔ 'Эва'
print(queue) # ➔ deque(['Алиса', 'Боб', 'Чарли'])


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

🟢 deque оптимизирован для операций .append(), .appendleft(), .pop() и .popleft() — все выполняются за O(1), в отличие от обычного списка.
🟢 Можно ограничить длину (maxlen=N) — полезно для реализации кольцевых буферов.

🐍 Ghostly Python | #фишки
Please open Telegram to view this post
VIEW IN TELEGRAM
👍4
👩‍💻 Меньше нагрузки — больше запросов: искусство кеширования API

Рассказываю, как кеширование в Django Ninja помогает выдерживать рост нагрузки без боли и апгрейда железа. Один и тот же ответ — не значит один и тот же расчёт.

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

🐍 Ghostly Python | #статьи
Please open Telegram to view this post
VIEW IN TELEGRAM
👩‍💻 Контекстные менеджеры в Python с помощью with и contextlib

Контекстные менеджеры — мощный механизм Python для безопасного и автоматического управления ресурсами: файлами, сетевыми соединениями, блокировками и т.д.

⚙️ Пример: работа с файлами, кастомный менеджер и таймер

# Классический with для работы с файлами
with open("example.txt", "w") as f:
f.write("Hello, world!")

# Свой контекстный менеджер через декоратор
from contextlib import contextmanager

@contextmanager
def custom_context():
print("Вход в контекст")
yield
print("Выход из контекста")

with custom_context():
print("Работаем внутри")

# Класс-контекст для измерения времени
class Timer:
def __enter__(self):
from time import perf_counter
self.start = perf_counter()
return self

def __exit__(self, exc_type, exc_val, exc_tb):
from time import perf_counter
print(f"Заняло времени: {perf_counter() - self.start:.4f} секунд")

with Timer():
sum(i * i for i in range(10_000_000))


💬 Как это работает:

🟢 with гарантирует вызов __enter__ при входе и __exit__ при выходе

🟢 contextlib.contextmanager — простой способ обернуть логику до и после yield

🟢 Идеально для управления файлами, соединениями, блокировками и ресурсами

🐍 Ghostly Python | #гайды
Please open Telegram to view this post
VIEW IN TELEGRAM
👍9
Please open Telegram to view this post
VIEW IN TELEGRAM
9
Вопрос с собеса

Что происходит, если переопределить __eq__ без __hash__ в Python?

Пример🔽
class Person:
def __init__(self, name):
self.name = name

def __eq__(self, other):
return isinstance(other, Person) and self.name == other.name

p1 = Person("Alice")
p2 = Person("Alice")

print(p1 == p2) # ➔ True
print(set([p1, p2])) # ➔ TypeError: unhashable type: 'Person'


Ответ🔽
Если в классе вы переопределяете метод __eq__, но не определяете __hash__, то объект становится нехэшируемым, и его нельзя использовать, например, в set или в качестве ключа dict.

🔧 Почему так:

Python требует, чтобы если a == b, то hash(a) == hash(b). Поэтому, когда вы задаёте своё поведение __eq__, Python автоматически сбрасывает __hash__ в None.

Это делается во избежание несогласованного поведения в хэш-таблицах.

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

class Person:
def __init__(self, name):
self.name = name

def __eq__(self, other):
return isinstance(other, Person) and
self.name == other.name

def __hash__(self):
return hash(
self.name)

🟢 Когда использовать:

— Когда объекты должны быть сравнимы по значению, но также использоваться как ключи в словарях, множествах и других структурах, зависящих от хэширования.

❗️Нарушение этого правила может привести к неожиданным ошибкам и багам, особенно в больших кодовых базах.


🐍 Ghostly Python | #собес
Please open Telegram to view this post
VIEW IN TELEGRAM
👍41👏1
👩‍💻 За неделю от ночных кошмаров до спокойного сна: как я автоматизировал защиту от AI-хакеров

Рассказываю, как наш AI-бот внезапно стал утечкой и зачем всё-таки стоит ставить защиту до запуска. Быстро, по делу и с примерами, как не повторить нашу 2-часа-ночи-паника-в-Telegram ситуацию.

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

🐍 Ghostly Python | #статьи
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2
🖼️ Библиотека: SymPy

SymPy — это мощная библиотека для символьных вычислений на Python.

ℹ️ Основные возможности:

🟢 Упрощение алгебраических выражений и работа с формулами
🟢 Дифференцирование, интегрирование и пределы
🟢 Решение уравнений и систем уравнений
🟢 Поддержка матриц, полиномов, рядов, уравнений с модулями и др.
🟢 Преобразование выражений в LaTeX и код других языков (C, Fortran)


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

from sympy import symbols, simplify, diff, solve, Eq

x = symbols('x')
expr = (x**2 + 2*x + 1) / (x + 1)

# Упрощение выражения
print(simplify(expr)) # ➔ x + 1

# Дифференцирование
print(diff(expr, x)) # ➔ производная по x

# Решение уравнения
eq = Eq(x**2 - 4, 0)
print(solve(eq)) # ➔ [-2, 2]


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

pip install sympy


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

🐍 Ghostly Python | #библиотеки
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥5👍1
Please open Telegram to view this post
VIEW IN TELEGRAM
💯32😁8👍2
➡️ Python Tips — практический путеводитель по “питоничному” стилю программирования

Python Tips — это онлайн-книга, собравшая десятки полезных приёмов и рекомендаций по Python: от простых до продвинутых. Автор делает упор на idiomatic Python — читаемый, лаконичный и эффективный код.

⛓️ Ссылка на ресурс

🐍 Ghostly Python | #ресурсы
Please open Telegram to view this post
VIEW IN TELEGRAM
4