TextBlob — это интуитивно понятная библиотека для обработки текста на Python, построенная поверх NLTK и Pattern. Предоставляет простой API для распространённых NLP-задач: анализ тональности, перевод, извлечение существительных, классификация и многое другое.
from textblob import TextBlob
from collections import Counter
# Чтение файла
with open('article.txt', 'r', encoding='utf-8') as f:
text = f.read()
# Создание объекта TextBlob
blob = TextBlob(text)
# Основная статистика
print(f"Длина текста: {len(text)} символов")
print(f"Количество слов: {len(blob.words)}")
print(f"Количество предложений: {len(blob.sentences)}")
print(f"Средняя длина предложения: {len(blob.words)/len(blob.sentences):.1f} слов")
print()
# Самые частые слова (без стоп-слов)
words = [word.lower() for word in blob.words if len(word) > 3]
word_freq = Counter(words).most_common(10)
print("=== ТОП-10 СЛОВ ===")
for word, count in word_freq:
print(f"{word:15} : {count} раз")
print()
# Анализ тональности по предложениям
print("=== ТОНАЛЬНОСТЬ ПО ПРЕДЛОЖЕНИЯМ ===")
for i, sentence in enumerate(blob.sentences[:5], 1):
print(f"[{i}] {sentence}")
print(f" Полярность: {sentence.sentiment.polarity:.3f}")
print()
pip install textblob
Please open Telegram to view this post
VIEW IN TELEGRAM
❤3👍3
class Meta(type):
def __new__(cls, name, bases, dct):
dct['multiplied'] = lambda self: self.value * 2
return super().__new__(cls, name, bases, dct)
class MyClass(metaclass=Meta):
def __init__(self, value):
self.value = value
obj1 = MyClass(5)
obj2 = MyClass(10)
print(obj1.multiplied())
print(obj2.multiplied())
print(type(MyClass))
Please open Telegram to view this post
VIEW IN TELEGRAM
Что выведет код?
Anonymous Quiz
18%
A) 10 20 <class 'type'>
18%
B) 5 10 <class 'Meta'>
33%
C) 10 20 <class 'Meta'>
32%
D) Ошибка: у объекта нет метода multiplied
👍6
Одна из крупнейших платформ для практики, также можно почитать интересную статью от кодера, который по личному опыту расскажет, стоит ли заниматься на данной платформе, и для кого она лучше всего она подходит.
Please open Telegram to view this post
VIEW IN TELEGRAM
На собеседованиях по 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 символов).
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥4👍1
GeoPandas — это библиотека Python для работы с геопространственными данными, которая расширяет структуры данных pandas, добавляя поддержку геометрических объектов. Позволяет выполнять пространственные операции, анализ и визуализацию географических данных прямо в Python.
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
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3❤1
Что делает оператор walrus (
:=) в Python и когда его стоит использовать?Пример
# Без walrus
line = input("Введите строку: ")
while line != "":
print(f"Вы ввели: {line}")
line = input("Введите строку: ")
# С walrus
while (line := input("Введите строку: ")) != "":
print(f"Вы ввели: {line}")
Ответ
Оператор "морж" (:=), добавленный в Python 3.8, позволяет присваивать значение переменной прямо внутри выражения. Это особенно полезно в циклах и условиях, где раньше приходилось писать отдельное присваивание.
✅ Преимущества:
Позволяет избежать повторного вызова функции (например, input()).
Делает код короче и, при правильном использовании, — читаемее.
📌 Используется там, где результат выражения нужен и для логики, и для сохранения значения.
❗️ Не стоит злоупотреблять: если конструкция становится нечитаемой — лучше использовать обычное присваивание.
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}")
Please open Telegram to view this post
VIEW IN TELEGRAM
Как подключить VSCode к GitLab, Docker, Jupyter
Пошаговая инструкция-статья по интеграции VSCode.
Рассказывается про абсолютно все мелочи: как получить токен доступа, настроить Dev Container, выбрать ядро для ноутбука и объединить все инструменты.
➡️ Читаем статью тут
🐍 Ghostly Python | #статья
Пошаговая инструкция-статья по интеграции VSCode.
Рассказывается про абсолютно все мелочи: как получить токен доступа, настроить Dev Container, выбрать ядро для ноутбука и объединить все инструменты.
Please open Telegram to view this post
VIEW IN TELEGRAM
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-скриптов в команды
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) автоматически сохраняет результаты вызова функции в кэше. При повторном вызове с теми же аргументами функция не выполняется заново, а возвращает уже готовое значение из памяти.
Please open Telegram to view this post
VIEW IN TELEGRAM
Кодер-энтузиаст решил провести эксперимент, выдав 100 AI-агентам по 1000 токенов, и поставив цель максимизировать свои очки, дающиеся за выполнение заданий, которые в свою очередь стоят определенного количества токенов.
Материала всего минут на 10, но эксперимент действительно интересный. Также автор прикладывает отрывки кода, чтобы вы могли увидеть работу проекта изнутри.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5
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
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5❤2
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}")
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 объединяет несколько итерируемых объектов (списки, кортежи и т.д.) в один итератор кортежей. Она останавливается, когда заканчивается самая короткая последовательность.
Please open Telegram to view this post
VIEW IN TELEGRAM
❤6
Автор — ML-инженер, решивший протестировать такое явление как «вайбкодинг». Это полезно, или плохо?
В статье автор даст советы по тому, каким образом лучше всего использовать нейронки в работе, чтобы не загнать себя в глубокую-глубокую яму.
Please open Telegram to view this post
VIEW IN TELEGRAM
❤2