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

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

Цены: @heywan_media

Реклама на бирже: https://telega.in/c/+IOa15XDNbxRkYzNi
Download Telegram
Вопрос с собеса: map() vs filter() в Python

На собеседованиях по Python часто спрашивают про разницу между map() и filter(). Давайте разберем на примере:

Пример🔽
numbers = [1, 2, 3, 4, 5]

# map: преобразует каждый элемент
squared = list(map(lambda x: x ** 2, numbers))
print("map (квадраты):", squared) # → [1, 4, 9, 16, 25]

# filter: оставляет только подходящие элементы
even = list(filter(lambda x: x % 2 == 0, numbers))
print("filter (чётные):", even) # → [2, 4]


Ответ🔽
map() — применяет функцию к каждому элементу коллекции и возвращает новый итератор с результатами.
Размер результата равен исходной коллекции.

filter() — применяет функцию-условие к каждому элементу и оставляет только те, для которых условие истинно.
Размер результата может быть меньше исходного.

map() — когда нужно преобразовать все элементы (например, привести строки к числам, применить математическую операцию).

filter() — когда нужно отобрать элементы по критерию (например, оставить положительные числа, найти строки длиннее 5 символов).


🐍 Ghostly Python | #собес
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥4👍1
Please open Telegram to view this post
VIEW IN TELEGRAM
❤‍🔥2😁2👍1
🖼️ Библиотека: GeoPandas

GeoPandas — это библиотека Python для работы с геопространственными данными, которая расширяет структуры данных pandas, добавляя поддержку геометрических объектов. Позволяет выполнять пространственные операции, анализ и визуализацию географических данных прямо в Python.

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

🟢 Геометрические типы данных: Точки, линии, полигоны из библиотеки Shapely.
🟢 Пространственные операции: Объединение, пересечение, буферизация, расстояние.
🟢 Чтение/запись форматов: Shapefile, GeoJSON, PostGIS, GPKG.
🟢 Пространственные соединения: Объединение данных по географическому расположению.
🟢 Визуализация: Построение карт с matplotlib, интеграция с contextily.

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

import geopandas as gpd
import matplotlib.pyplot as plt
from shapely.geometry import Point, Polygon

# Создание GeoDataFrame из точек
data = {
'city': ['Москва', 'Санкт-Петербург', 'Казань', 'Екатеринбург'],
'population': [12_500_000, 5_400_000, 1_200_000, 1_500_000],
'geometry': [
Point(37.6173, 55.7558), # Москва
Point(30.3351, 59.9343), # СПб
Point(49.1088, 55.7961), # Казань
Point(60.5980, 56.8389) # Екатеринбург
]
}

gdf = gpd.GeoDataFrame(data, crs="EPSG:4326") # WGS84
print(gdf.head())
print(f"CRS: {gdf.crs}")

# Преобразование в другую проекцию (для точных измерений)
gdf_utm = gdf.to_crs("EPSG:32637") # UTM zone 37N
print(f"Преобразовано в: {gdf_utm.crs}")

# Создание буферных зон (100 км вокруг городов)
gdf_buffer = gdf_utm.copy()
gdf_buffer['geometry'] = gdf_utm.geometry.buffer(100000) # 100 км в метрах

# Визуализация
fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(15, 6))

gdf.plot(ax=ax1, color='red', markersize=50)
ax1.set_title('Города России')
ax1.set_xlabel('Долгота')
ax1.set_ylabel('Широта')

gdf_buffer.plot(ax=ax2, alpha=0.3, edgecolor='black')
gdf.plot(ax=ax2, color='red', markersize=30)
ax2.set_title('Буферные зоны 100 км')
ax2.set_xlabel('Координаты UTM (м)')

plt.tight_layout()
plt.show()


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

pip install geopandas


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

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

Что делает оператор walrus (:=) в Python и когда его стоит использовать?

Пример🔽
# Без walrus
line = input("Введите строку: ")
while line != "":
print(f"Вы ввели: {line}")
line = input("Введите строку: ")

# С walrus
while (line := input("Введите строку: ")) != "":
print(f"Вы ввели: {line}")


Ответ🔽
Оператор "морж" (:=), добавленный в Python 3.8, позволяет присваивать значение переменной прямо внутри выражения. Это особенно полезно в циклах и условиях, где раньше приходилось писать отдельное присваивание.

Преимущества:

Позволяет избежать повторного вызова функции (например, input()).

Делает код короче и, при правильном использовании, — читаемее.

📌 Используется там, где результат выражения нужен и для логики, и для сохранения значения.

❗️ Не стоит злоупотреблять: если конструкция становится нечитаемой — лучше использовать обычное присваивание.


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

class PositiveNumber:
def __get__(self, obj, objtype=None):
return obj._value

def __set__(self, obj, value):
if value <= 0:
raise ValueError("Must be positive")
obj._value = value

class Account:
balance = PositiveNumber()

def __init__(self, initial_balance):
self.balance = initial_balance

try:
acc1 = Account(100)
print(f"Acc1: {acc1.balance}")

acc2 = Account(-50)
print(f"Acc2: {acc2.balance}")

except ValueError as e:
print(f"Error: {e}")

acc1.balance = -30
print(f"Acc1 new: {acc1.balance}")


🐍 Ghostly Python | #викторина
Please open Telegram to view this post
VIEW IN TELEGRAM
Как подключить VSCode к GitLab, Docker, Jupyter

Пошаговая инструкция-статья по интеграции VSCode.

Рассказывается про абсолютно все мелочи: как получить токен доступа, настроить Dev Container, выбрать ядро для ноутбука и объединить все инструменты.

➡️ Читаем статью тут

🐍 Ghostly Python | #статья
Please open Telegram to view this post
VIEW IN TELEGRAM
Сначала телеграм, а что дальше?

А, точно

🐍 Ghostly Python | #мем
Please open Telegram to view this post
VIEW IN TELEGRAM
😁20❤‍🔥3👏1
👩‍💻 Argparse — работаем с аргументами командной строки

argparse — встроенный модуль Python для создания интерфейсов командной строки. Позволяет легко добавлять флаги и параметры к скриптам, с автоматической генерацией help.

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

import argparse

parser = argparse.ArgumentParser(description="Приветствие пользователя")
parser.add_argument("name", help="Имя пользователя")
args = parser.parse_args()

print(f"Привет, {args.name}!")


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

1. ArgumentParser() создаёт парсер аргументов.
2. add_argument("name") добавляет обязательный позиционный аргумент.
3. parse_args() читает аргументы из командной строки.
4. Запуск: python script.py АлисаПривет, Алиса!

🟢 Поддерживает позиционные и опциональные аргументы (--debug, --limit 10)
🟢 Генерирует справку по команде -h или --help
🟢 Полезен при создании CLI-утилит, автоматизации и упаковке Python-скриптов в команды


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

Что делает functools.lru_cache в Python и когда его использовать?

Пример🔽
```python
# Без lru_cache (наивная рекурсия)
def fibonacci(n):
if n <= 1:
return n
return fibonacci(n-1) + fibonacci(n-2)

# Вычисление 35-го числа займет несколько секунд
# print(fibonacci(35))

# С lru_cache (кэширование результатов)
from functools import lru_cache

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

# Вычисление 100-го числа произойдет мгновенно!
print(fibonacci_cached(100))


Ответ🔽
Декоратор @lru_cache (Least Recently Used cache) автоматически сохраняет результаты вызова функции в кэше. При повторном вызове с теми же аргументами функция не выполняется заново, а возвращает уже готовое значение из памяти.


🐍 Ghostly Python | #собес
Please open Telegram to view this post
VIEW IN TELEGRAM
👩‍💻 Максимально необычная статья: что будет, если дать 100 AI-агентам цель и ограниченную виртуальную валюту?

Кодер-энтузиаст решил провести эксперимент, выдав 100 AI-агентам по 1000 токенов, и поставив цель максимизировать свои очки, дающиеся за выполнение заданий, которые в свою очередь стоят определенного количества токенов.

Материала всего минут на 10, но эксперимент действительно интересный. Также автор прикладывает отрывки кода, чтобы вы могли увидеть работу проекта изнутри.

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

🐍 Ghostly Python | #статья
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5
Не сисадмин а мечта...

🐍 Ghostly Python | #мем
Please open Telegram to view this post
VIEW IN TELEGRAM
❤‍🔥8😁5
🖼️ Библиотека pydantic — автоматическая валидация данных с подсказками типов

Pydantic — это самая популярная библиотека для валидации данных в Python, которая использует подсказки типов (type hints) для проверки и преобразования данных. Вместо того чтобы писать десятки if isinstance(...) и try/except для проверки входных данных, вы просто описываете модель данных — и библиотека делает всё остальное. Стала стандартом индустрии благодаря FastAPI, но полезна в любом проекте


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

from pydantic import BaseModel, ValidationError

# 1. Описываем модель (буквально 3 строки)
class User(BaseModel):
name: str
age: int

# 2. Пробуем создать пользователя
try:
# Данные приходят откуда-то извне (API, форма, файл)
user = User(name="Анна", age="25") # age пришёл как строка!
print(f" {user.name}, возраст: {user.age} (тип: {type(user.age).__name__})")

# А вот неправильные данные
bad_user = User(name="Петр", age="не число")
except ValidationError as e:
print(f" Ошибка: {e}")


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

pip install pydantic


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

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

import functools

def smart_cache(maxsize=2):
cache = {}
order = []

def decorator(func):
@functools.wraps(func)
def wrapper(*args, **kwargs):
key = (args, tuple(kwargs.items()))
if key in cache:
order.remove(key)
order.append(key)
return f"Cached: {cache[key]}"

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

if len(order) > maxsize:
oldest = order.pop(0)
del cache[oldest]

return f"Computed: {result}"
return wrapper
return decorator

count = 0

def tracer(func):
@functools.wraps(func)
def wrapper(*args, **kwargs):
global count
count += 1
indent = " " * count
print(f"{indent}→ {func.__name__}{args}")
result = func(*args, **kwargs)
print(f"{indent}← {result}")
count -= 1
return result
return wrapper

@smart_cache(maxsize=2)
@tracer
def fib(n):
if n <= 1:
return n
return fib(n-1) + fib(n-2)

print(fib(3))
print(fib(2))
print(fib(4))
print(f"Calls: {count}")


🐍 Ghostly Python | #викторина
Please open Telegram to view this post
VIEW IN TELEGRAM
5
Вопрос с собеса

Что делает функция zip() в Python и когда её удобно использовать?

Пример🔽

```python
# Без zip (ручной перебор по индексу)
names = ["Анна", "Борис", "Виктор"]
scores = [85, 92, 78]

for i in range(len(names)):
print(f"{names[i]} получил {scores[i]} баллов")

# С zip (элегантная параллельная итерация)
for name, score in zip(names, scores):
print(f"{name} получил {score} баллов")

# Создание словаря одной строкой
student_scores = dict(zip(names, scores))
print(student_scores)


Ответ🔽
Функция
zip() в Python объединяет несколько итерируемых объектов (списки, кортежи и т.д.) в один итератор кортежей. Она останавливается, когда заканчивается самая короткая последовательность.


🐍 Ghostly Python | #собес
Please open Telegram to view this post
VIEW IN TELEGRAM
6
👩‍💻 Как вайбкодинг убивает волю к решению проблем

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

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

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

🐍 Ghostly Python | #статья
Please open Telegram to view this post
VIEW IN TELEGRAM
2
Please open Telegram to view this post
VIEW IN TELEGRAM
🤔11😁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
3❤‍🔥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
5😱1
👩‍💻 Решаем VRP-задачи, или Как мы в Додо доставку оптимизировали

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

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

🐍 Ghostly Python | #статьи
Please open Telegram to view this post
VIEW IN TELEGRAM