Позволяет экземплярам класса вести себя как функции, то есть их можно «вызывать» с помощью круглых скобок (). Полезно для создания объектов с состоянием, которые могут хранить данные между вызовами, или для реализации декораторов на классах.
class Counter:
def init(self):
self.count = 0
def __call__(self):
self.count += 1
return self.count
Создаём объект
counter = Counter()
Вызываем объект как функцию
print(counter()) # 1
print(counter()) # 2
print(counter()) # 3
---
Более практичный пример: кэширующий декоратор на классе
class Memoize:
def __init__(self, func):
self.func = func
self.cache = {}
def __call__(self, *args):
if args not in self.cache:
self.cache[args] = self.func(*args)
return self.cache[args]
@Memoize
def fibonacci(n):
if n < 2:
return n
return fibonacci(n-1) + fibonacci(n-2)
print(fibonacci(10)) # Быстро, т.к. значения кэшируются
— Метод call вызывается, когда экземпляр класса используется как функция.
— Объект может сохранять внутреннее состояние между вызовами.
— Позволяет создавать более гибкие и читаемые конструкции, особенно когда нужно сочетать данные и поведение.
Please open Telegram to view this post
VIEW IN TELEGRAM
❤4❤🔥1😁1
Please open Telegram to view this post
VIEW IN TELEGRAM
😁13🤣6
import time
class CodeQuiz:
def __init__(self):
self.questions = [
{
"code": "print([i**2 for i in range(5)])",
"options": ["[0, 1, 4, 9, 16]", "[1, 4, 9, 16, 25]", "[0, 2, 4, 6, 8]", "Ошибка"],
"answer": 0
},
{
"code": "x = 'hello'\nprint(x[::-1])",
"options": ["hello", "olleh", "h", "Ошибка"],
"answer": 1
},
{
"code": "a = {1, 2, 3}\nb = {3, 4, 5}\nprint(a & b)",
"options": ["{1, 2, 3, 4, 5}", "{3}", "{ }", "Ошибка"],
"answer": 1
}
]
self.score = 0
def run(self):
print("Викторина: Что выведет код?\n")
for i, q in enumerate(self.questions, 1):
print(f"Вопрос {i}:")
print(q["code"])
print("\nВарианты:")
for idx, opt in enumerate(q["options"]):
print(f"{idx+1}) {opt}")
try:
ans = int(input("\nОтвет (1-4): ")) - 1
if ans == q["answer"]:
print("✓ Правильно!\n")
self.score += 1
else:
print(f"✗ Неправильно. Правильный ответ: {q['options'][q['answer']]}\n")
except:
print("Нужно ввести число 1-4\n")
print(f"Итог: {self.score}/{len(self.questions)}")
quiz = CodeQuiz()
quiz.run()
Please open Telegram to view this post
VIEW IN TELEGRAM
😁6🔥2
Что выведет код?
Anonymous Quiz
24%
[0, 1, 4, 9, 16]
31%
[1, 4, 9, 16, 25]
11%
[0, 2, 4, 6, 8]
34%
Ошибка
❤4👎4
Python Tutor позволяет пошагово видеть, как исполняется ваш код: значения переменных, стек вызовов, переходы по строкам. Полезен для обучения, отладки рекурсий, понимания областей видимости и работы списков/словарей.
Примечательно, что сервис поддерживает пошаривание сессий и встроенные “сценарии” с примерами — удобно разбирать код с командой или наставником прямо по ссылке.
Please open Telegram to view this post
VIEW IN TELEGRAM
🤝1
На собеседованиях по Python часто спрашивают про разницу между генераторами и списками. Давайте разберем на примере.
Пример
# Создание списка
list_numbers = [x * 2 for x in range(5)]
print("Список:", list_numbers) # → [0, 2, 4, 6, 8]
# Создание генератора
gen_numbers = (x * 2 for x in range(5))
print("Генератор:", gen_numbers) # → <generator object at ...>
print("Элементы генератора:", list(gen_numbers)) # → [0, 2, 4, 6, 8]
Ответ
Список ([]) — хранит все элементы сразу в памяти.
Подходит, если нужно многократно обращаться к данным или изменять их.
Генератор (()) — создаёт элементы лениво (по одному), не храня всё в памяти.
Подходит для обработки больших данных или бесконечных последовательностей.
— Когда что использовать?
Список — если нужен быстрый доступ по индексу или многоразовое использование данных.
Генератор — если работаете с большим объёмом данных или нужно экономить память.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍8
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