Привет, меня зовут Иван, и сегодня я расскажу, как быстро и просто создать свой калькулятор на Python с помощью модуля tkinter. Если вы ещё ни разу не работали с графическим интерфейсом — не пугайтесь! Всё проще, чем кажется.
Почему именно tkinter?
tkinter — это стандартный GUI-модуль, который поставляется с Python «из коробки». То есть ничего дополнительно устанавливать не надо. Он лёгкий, интуитивно понятный и идеально подходит для первых экспериментов с окнами, кнопками и текстовыми полями.
Идём к делу. Минимальный калькулятор
Создадим калькулятор, который умеет складывать два числа.
Что тут происходит?
1. Создаём главное окно (
2. Добавляем два текстовых поля (
3. Кнопка вызывает функцию
Сделаем лучше: универсальный калькулятор
Добавим операции: сложение, вычитание, умножение и деление.
Теперь ваш калькулятор поддерживает все базовые арифметические операции! Можно поиграть с оформлением, добавить меню, вывести историю вычислений. Всё ограничивается только вашей фантазией — и возможностями tkinter.
tkinter — отличный способ почувствовать себя не только программистом, но и настоящим создателем цифровых инструментов. Начните с калькулятора, а там, глядишь, и свой планировщик задач напишете!
Почему именно tkinter?
tkinter — это стандартный GUI-модуль, который поставляется с Python «из коробки». То есть ничего дополнительно устанавливать не надо. Он лёгкий, интуитивно понятный и идеально подходит для первых экспериментов с окнами, кнопками и текстовыми полями.
Идём к делу. Минимальный калькулятор
Создадим калькулятор, который умеет складывать два числа.
import tkinter as tk
def add_numbers():
try:
result = float(entry1.get()) + float(entry2.get())
result_label.config(text=f"Result: {result}")
except ValueError:
result_label.config(text="Invalid input!")
root = tk.Tk()
root.title("Simple Calculator")
entry1 = tk.Entry(root)
entry1.pack()
entry2 = tk.Entry(root)
entry2.pack()
add_button = tk.Button(root, text="Add", command=add_numbers)
add_button.pack()
result_label = tk.Label(root, text="Result:")
result_label.pack()
root.mainloop()
Что тут происходит?
1. Создаём главное окно (
root). 2. Добавляем два текстовых поля (
entry1 и entry2). 3. Кнопка вызывает функцию
add_numbers, которая берёт числа из полей, складывает их и выводит результат.Сделаем лучше: универсальный калькулятор
Добавим операции: сложение, вычитание, умножение и деление.
def calculate(op):
try:
x = float(entry1.get())
y = float(entry2.get())
if op == "+":
res = x + y
elif op == "-":
res = x - y
elif op == "*":
res = x * y
elif op == "/":
res = x / y if y != 0 else "Div by 0!"
result_label.config(text=f"Result: {res}")
except ValueError:
result_label.config(text="Invalid input!")
frame = tk.Frame(root)
frame.pack()
for op in ("+", "-", "*", "/"):
btn = tk.Button(frame, text=op, command=lambda o=op: calculate(o))
btn.pack(side=tk.LEFT)
Теперь ваш калькулятор поддерживает все базовые арифметические операции! Можно поиграть с оформлением, добавить меню, вывести историю вычислений. Всё ограничивается только вашей фантазией — и возможностями tkinter.
tkinter — отличный способ почувствовать себя не только программистом, но и настоящим создателем цифровых инструментов. Начните с калькулятора, а там, глядишь, и свой планировщик задач напишете!
❤1
Привет! Меня зовут Иван, и сегодня я хочу поделиться с вами магией пользовательских исключений в Python. Все мы знаем, что Python обожает бросаться ошибками как ребёнок снежками. Но что делать, если стандартный арсенал исключений не справляется с уникальной ситуацией вашего кода?
### Зачем нужны пользовательские исключения?
Стандартные исключения (например,
### Как определить своё исключение
Пользовательские исключения наследуются от класса
Обратите внимание: можно не добавлять методов, но иногда хочется передать подробности ошибки через аргументы.
### Используем пользовательские исключения
Когда возникает особая ситуация, вы просто используете
И ловим исключение как обычно:
Результат:
### Зачем всё это?
Пользовательские исключения делают ваш код читаемей и позволяют чётко разграничить стандартные и ваши бизнес-ошибки. Это особенно важно, если придётся интегрировать вашу библиотеку в чужие проекты.
Совет от меня: создавайте древовидную структуру своих исключений, наследуя их от одного корневого:
Так проще поймать все ошибки, связанные с вашим оборудованием, одним блоком
Пусть ваш код бросает только те снежки, которые вы сами для него подготовили!
### Зачем нужны пользовательские исключения?
Стандартные исключения (например,
ValueError, TypeError) хороши, когда вы ловите что-то общее. Но когда ваш код сталкивается с чем-то специфическим ― например, вы пишете API для управления роботом-пылесосом и хотите выбрасывать ошибку, если пылесос застрял под диваном ― логичнее создать своё исключение.### Как определить своё исключение
Пользовательские исключения наследуются от класса
Exception. Это просто:class VacuumStuckError(Exception):
"""Raised when the vacuum is stuck under the sofa."""
pass
Обратите внимание: можно не добавлять методов, но иногда хочется передать подробности ошибки через аргументы.
class VacuumStuckError(Exception):
def __init__(self, location):
self.location = location
super().__init__(f"Vacuum is stuck at {self.location}")
### Используем пользовательские исключения
Когда возникает особая ситуация, вы просто используете
raise:def move_vacuum(location):
forbidden_zones = ["sofa", "stairs"]
if location in forbidden_zones:
raise VacuumStuckError(location)
print(f"Vacuum moving to {location}")
И ловим исключение как обычно:
try:
move_vacuum("sofa")
except VacuumStuckError as e:
print(f"Oops! {e}")
Результат:
Oops! Vacuum is stuck at sofa
### Зачем всё это?
Пользовательские исключения делают ваш код читаемей и позволяют чётко разграничить стандартные и ваши бизнес-ошибки. Это особенно важно, если придётся интегрировать вашу библиотеку в чужие проекты.
Совет от меня: создавайте древовидную структуру своих исключений, наследуя их от одного корневого:
class VacuumError(Exception):
pass
class VacuumStuckError(VacuumError):
pass
class VacuumLowBatteryError(VacuumError):
pass
Так проще поймать все ошибки, связанные с вашим оборудованием, одним блоком
except VacuumError.Пусть ваш код бросает только те снежки, которые вы сами для него подготовили!
👍3
Привет! Меня зовут Иван, и сегодня мы погрузимся в мир времени — а именно, разберёмся, как работать с часовыми поясами в Python при помощи модуля
Когда разрабатываешь что-то, связанное с временем (например, планировщик встреч или рассылку новостей), всегда возникает вопрос: а в каком часовом поясе живёт пользователь? Если просто хранить время как есть, то превратить его в локальное для каждого пользователя — ещё тот квест. Именно тут на сцену выходит модуль
### Установка
Для начала, если модуль еще не установлен, его легко добавить:
### Пример 1: Преобразование времени между часовыми поясами
Посмотрим, как перевести текущее время UTC в время, например, Нью-Йорка и Токио.
### Пример 2: Создание даты в определённом часовом поясе
Иногда нужно создать событие, точно зная часовой пояс (например, встреча в Лондоне):
Обратите внимание: всегда используйте
### Пример 3: Список всех часовых поясов
Хотите узнать, какие названия часовых поясов доступны? Легко:
(Тут я вывел только первые пять, их всего — сотни!)
### Кратко о главном
- Всегда работайте с datetime, связанными с временной зоной (
- Используйте
- Методы из pytz позволяют конвертировать значения времени без головной боли с часовыми поясами!
Теперь работа со временем из Лос-Анджелеса до Владивостока — не проблема. Надеюсь, теперь даты и время не будут вас пугать!
pytz. Готовы? Поехали!Когда разрабатываешь что-то, связанное с временем (например, планировщик встреч или рассылку новостей), всегда возникает вопрос: а в каком часовом поясе живёт пользователь? Если просто хранить время как есть, то превратить его в локальное для каждого пользователя — ещё тот квест. Именно тут на сцену выходит модуль
pytz!### Установка
Для начала, если модуль еще не установлен, его легко добавить:
pip install pytz
### Пример 1: Преобразование времени между часовыми поясами
Посмотрим, как перевести текущее время UTC в время, например, Нью-Йорка и Токио.
from datetime import datetime
import pytz
utc_time = datetime.now(pytz.utc)
ny_zone = pytz.timezone('America/New_York')
tokyo_zone = pytz.timezone('Asia/Tokyo')
ny_time = utc_time.astimezone(ny_zone)
tokyo_time = utc_time.astimezone(tokyo_zone)
print("UTC:", utc_time)
print("New York:", ny_time)
print("Tokyo:", tokyo_time)
### Пример 2: Создание даты в определённом часовом поясе
Иногда нужно создать событие, точно зная часовой пояс (например, встреча в Лондоне):
from datetime import datetime
import pytz
london_zone = pytz.timezone('Europe/London')
meeting_time_naive = datetime(2024, 6, 1, 15, 0, 0)
meeting_time_london = london_zone.localize(meeting_time_naive)
print("Meeting in London:", meeting_time_london)
Обратите внимание: всегда используйте
localize — нельзя просто "приписывать" часовой пояс к наивной дате (replace(tzinfo=...) работает не всегда корректно из-за перехода на летнее/зимнее время).### Пример 3: Список всех часовых поясов
Хотите узнать, какие названия часовых поясов доступны? Легко:
import pytz
for tz in pytz.all_timezones[:5]:
print(tz)
(Тут я вывел только первые пять, их всего — сотни!)
### Кратко о главном
- Всегда работайте с datetime, связанными с временной зоной (
aware datetime). - Используйте
pytz.timezone("...") и метод .localize() для корректности.- Методы из pytz позволяют конвертировать значения времени без головной боли с часовыми поясами!
Теперь работа со временем из Лос-Анджелеса до Владивостока — не проблема. Надеюсь, теперь даты и время не будут вас пугать!
👍2🔥2❤1
Привет! С вами Иван, и сегодня я хочу показать, что создание красивых и интерактивных графиков в Python — это действительно просто, если вы знакомы с библиотекой Bokeh. Забудьте унылые статичные картинки: теперь ваши визуализации будут реагировать на действия пользователя!
Bokeh — мощный инструмент, который позволяет буквально на лету строить интерактивные визуализации и автоматически отображать их в браузере. Давайте сразу к делу.
## Первый интерактивный график
Создадим простую диаграмму разброса с возможностью увеличения и панорамирования:
Просто запустите этот код, и Bokeh откроет окно браузера с графиком, который можно двигать и увеличивать колесиком мыши. Уже неплохо!
## Добавляем интерактивность
А что если мы хотим видеть информацию о точках при наведении? Легко:
Добавьте этот фрагмент сразу после создания объекта
## Красивые бары для анализа данных
Bokeh отлично подходит не только для scatter, но и для столбчатых диаграмм. Посмотрим пример:
Этот код создаст столбчатую диаграмму, где можно быстро сравнить количество разных фруктов.
## Почему Bokeh крут?
1. Легко интегрируется с Jupyter, Django и Flask.
2. Преобразует данные Python в современные интерактивные графики на JavaScript.
3. Позволяет строить сложные дашборды с фильтрами, ползунками и обновлением данных в реальном времени.
На этом всё — попробуйте Bokeh в деле и удивитесь, насколько по-настоящему «живыми» могут быть ваши графики!
Bokeh — мощный инструмент, который позволяет буквально на лету строить интерактивные визуализации и автоматически отображать их в браузере. Давайте сразу к делу.
## Первый интерактивный график
Создадим простую диаграмму разброса с возможностью увеличения и панорамирования:
from bokeh.plotting import figure, show
x = [1, 2, 3, 4, 5]
y = [6, 7, 2, 4, 5]
p = figure(
title="Simple scatter plot",
x_axis_label='X axis',
y_axis_label='Y axis',
tools="pan,wheel_zoom,box_zoom,reset,save"
)
p.circle(x, y, size=10, color="navy", alpha=0.5)
show(p)
Просто запустите этот код, и Bokeh откроет окно браузера с графиком, который можно двигать и увеличивать колесиком мыши. Уже неплохо!
## Добавляем интерактивность
А что если мы хотим видеть информацию о точках при наведении? Легко:
from bokeh.models import HoverTool
hover = HoverTool(tooltips=[("X value", "@x"), ("Y value", "@y")])
p.add_tools(hover)
Добавьте этот фрагмент сразу после создания объекта
p. Наведите курсор на точку — появится подсказка с ее значением. Привычно? А ведь это буквально одна строка кода!## Красивые бары для анализа данных
Bokeh отлично подходит не только для scatter, но и для столбчатых диаграмм. Посмотрим пример:
from bokeh.plotting import figure, show
fruits = ["Apple", "Banana", "Orange", "Grapes"]
counts = [10, 15, 7, 12]
p = figure(
x_range=fruits,
title="Fruit Count",
toolbar_location=None,
tools=""
)
p.vbar(x=fruits, top=counts, width=0.8, fill_color='olivedrab')
show(p)
Этот код создаст столбчатую диаграмму, где можно быстро сравнить количество разных фруктов.
## Почему Bokeh крут?
1. Легко интегрируется с Jupyter, Django и Flask.
2. Преобразует данные Python в современные интерактивные графики на JavaScript.
3. Позволяет строить сложные дашборды с фильтрами, ползунками и обновлением данных в реальном времени.
На этом всё — попробуйте Bokeh в деле и удивитесь, насколько по-настоящему «живыми» могут быть ваши графики!
👍2
Привет! С вами Иван, и сегодня я расскажу, как прокачать свой Python-проект с помощью автоматизированного тестирования через Tox. Tox — это настоящий must-have для тех, кто хочет, чтобы код работал стабильно в разных версиях Python без кучи ручной возни.
### Что такое Tox и зачем он нужен?
Tox — это инструмент, который автоматизирует тестирование и проверку кода в нескольких виртуальных окружениях. Он прост в использовании, не требует магии и отлично подходит для маленьких домашних проектов и для серьёзных командных разработок.
### Начнем с установки
Для начала установим Tox (предполагаю, что Python и pip у тебя уже стоят):
### Конфигурируем Tox
Настраивать Tox элементарно. В корне проекта создаём файл
Здесь мы указали, что хотим тестировать код в средах с Python 3.8 и 3.9. В каждой среде устанавливается
### Давайте напишем простой пример
Пусть у нас есть модуль с функцией:
И тест к нему:
Теперь просто набираем в терминале:
Tox автоматически создаст окружения, поставит нужные зависимости и прогоним тесты в обеих версиях Python!
### Преимущества Tox
- Кроссплатформенность: ваш проект тестируется сразу с разными версиями Python.
- Изоляция: не надо засорять глобальное окружение.
- Гибкость: можно добавить линтеры, проверить стиль кода или даже сборку документации — всё через конфиг.
### Lifehack: запуск только одного окружения
Не хочется гонять все версии? Запусти:
И тесты исполнятся только для Python 3.9.
---
Автоматизация тестов — это страховка вашего проекта. С Tox вы тратите время не на ручное переключение версий, а на улучшение своего кода. Попробуйте — и уже не захотите делать всё вручную!
### Что такое Tox и зачем он нужен?
Tox — это инструмент, который автоматизирует тестирование и проверку кода в нескольких виртуальных окружениях. Он прост в использовании, не требует магии и отлично подходит для маленьких домашних проектов и для серьёзных командных разработок.
### Начнем с установки
Для начала установим Tox (предполагаю, что Python и pip у тебя уже стоят):
pip install tox
### Конфигурируем Tox
Настраивать Tox элементарно. В корне проекта создаём файл
tox.ini и пишем:[tox]
envlist = py38, py39
[testenv]
deps = pytest
commands = pytest
Здесь мы указали, что хотим тестировать код в средах с Python 3.8 и 3.9. В каждой среде устанавливается
pytest и запускаются тесты.### Давайте напишем простой пример
Пусть у нас есть модуль с функцией:
# calc.py
def add(x, y):
return x + y
И тест к нему:
# test_calc.py
from calc import add
def test_add():
assert add(2, 3) == 5
Теперь просто набираем в терминале:
tox
Tox автоматически создаст окружения, поставит нужные зависимости и прогоним тесты в обеих версиях Python!
### Преимущества Tox
- Кроссплатформенность: ваш проект тестируется сразу с разными версиями Python.
- Изоляция: не надо засорять глобальное окружение.
- Гибкость: можно добавить линтеры, проверить стиль кода или даже сборку документации — всё через конфиг.
### Lifehack: запуск только одного окружения
Не хочется гонять все версии? Запусти:
tox -e py39
И тесты исполнятся только для Python 3.9.
---
Автоматизация тестов — это страховка вашего проекта. С Tox вы тратите время не на ручное переключение версий, а на улучшение своего кода. Попробуйте — и уже не захотите делать всё вручную!
👍1
Привет! С вами Иван, и сегодня поговорим о модуле, который может спасти вас от головной боли при работе с файловыми путями в Python — о
До появления
## Основы работы с pathlib
Модуль
Здесь
## Проверка существования файлов и папок
Больше не нужно писать длинные конструкции на
## Итерация по файлам в папке
Нужно найти все
Можно даже искать рекурсивно во всех подпапках:
## Чтение/запись файлов
Чтение содержимого файла теперь просто как никогда:
А вот так легко можно записать данные в файл:
## Вывод
pathlib.До появления
pathlib нам приходилось использовать громоздкие комбинации из os.path, склеивать пути через строчные конкатенации или возиться с кучей методов, помня при этом отличия между Windows и Unix. Всё это неудобно и легко сделать ошибку. Но теперь всё проще и элегантнее!## Основы работы с pathlib
Модуль
pathlib вводит класс Path, который делает манипуляции с путями интуитивно понятными:from pathlib import Path
current_dir = Path.cwd() # Получаем текущую директорию
desktop = current_dir / 'Desktop' # Формируем новый путь к рабочему столу
print(desktop)
Здесь
Path реализует перегрузку оператора /, превращая соединение частей пути в удовольствие.## Проверка существования файлов и папок
Больше не нужно писать длинные конструкции на
os.path — всё делается элегантно:file_path = Path('some_folder') / 'example.txt'
if file_path.exists():
print("File exists!")
if file_path.is_file():
print("This is a file!")
if file_path.is_dir():
print("This is a directory!")
## Итерация по файлам в папке
Нужно найти все
.txt файлы? Это делается в одну строку:for txt_file in Path('documents').glob('*.txt'):
print(txt_file.name)
Можно даже искать рекурсивно во всех подпапках:
for file in Path('documents').rglob('*.pdf'):
print(file)
## Чтение/запись файлов
Чтение содержимого файла теперь просто как никогда:
file = Path('sample.txt')
text = file.read_text(encoding='utf-8')
print(text)
А вот так легко можно записать данные в файл:
file.write_text('Hello, World!', encoding='utf-8')
## Вывод
pathlib — это современный, кроссплатформенный и лаконичный способ работы с файлами и папками в Python. Просто начните использовать Path вместо старых подходов и почувствуйте, насколько проще стала ваша жизнь!🔥3
Привет! На связи Иван, и сегодня мы разоблачим один из «секретных агентов» стандартной библиотеки Python — модуль struct. Если вам хоть раз приходилось работать с бинарными файлами или протоколами низкого уровня, struct станет вашим лучшим другом. Без него не получится удобно преобразовывать структурированные данные в байты и обратно. Давайте разберёмся, что к чему, на конкретных примерах.
## Быстро обо всём: для чего нужен struct?
Модуль struct позволяет «упаковать» данные в байтовые строки (bytes) и «распаковать» их обратно в привычные питоновские типы. Это незаменимо, если нужно, например, сериализовать числа для передачи по сети или сохранить данные так, чтобы их потом мог прочитать C-программа.
## Основные приёмы
Всё крутится вокруг функций
### Пример 1: Запаковать числа в байты
### Пример 2: Работа с бинарными файлами
### Пример 3: Парсинг байтов вручную
Часто приходят сырые байты откуда-то (например, из сети).
## Вывод
## Быстро обо всём: для чего нужен struct?
Модуль struct позволяет «упаковать» данные в байтовые строки (bytes) и «распаковать» их обратно в привычные питоновские типы. Это незаменимо, если нужно, например, сериализовать числа для передачи по сети или сохранить данные так, чтобы их потом мог прочитать C-программа.
## Основные приёмы
Всё крутится вокруг функций
pack и unpack, а также строки формата, описывающей, как упаковать данные.### Пример 1: Запаковать числа в байты
import struct
data = (42, 3.14)
packed = struct.pack('if', *data) # i — int, f — float
print(packed) # что-то вроде b'*\x00\x00\x00\xc3\xf5H@'
# А теперь обратно:
unpacked = struct.unpack('if', packed)
print(unpacked) # (42, 3.140000104904175)
### Пример 2: Работа с бинарными файлами
with open('data.bin', 'wb') as f:
f.write(struct.pack('I2c', 2024, b'P', b'y'))
with open('data.bin', 'rb') as f:
content = f.read()
print(struct.unpack('I2c', content)) # (2024, b'P', b'y')
### Пример 3: Парсинг байтов вручную
Часто приходят сырые байты откуда-то (например, из сети).
msg = b'\x05\x00\x00\x00hello' # длина строки (5), затем сама строка
length = struct.unpack('I', msg[:4])[0]
text = msg[4:4+length].decode()
print(length, text) # 5 hello
## Вывод
struct полезен там, где нужно строго соблюдать размер и формат данных. Для низкоуровневой магии или общения с «железом» — вещь незаменимая. Главное — освоиться с форматами (i, f, c, h, и так далее), и тогда любой бинарный файл у вас — как открытая книга!👍3
Симуляция физики в Python: знакомство с Box2D
Привет! Меня зовут Иван, и сегодня я расскажу, как оживить ваши питоновские проекты с помощью реальной физики. Модуль Box2D — это порт знаменитого C++-движка, который используется даже в Angry Birds. Работая с Box2D, вы сможете симулировать столкновения, гравитацию, трение и многие другие законы Ньютона.
### Установка
Для начала установим обертку для Python:
### Первый шаг: «Мир» с гравитацией
Box2D моделирует «мир» (world), в котором живут все объекты. Добавим что-то простое: падение квадратика на землю.
### Шаг за шагом: симулируем падение
Box2D устроен так, что на каждом «шагающем» кадре пересчитывает все силы. Сделаем небольшой цикл:
Если вы запустите этот код, увидите, как координата вашего ящика падает: Box2D сам «роняет» объекты благодаря гравитации.
### Можно добавить столкновения
Box2D сразу учитывает коллизии: наш куб не провалится сквозь землю, остановится и немного подпрыгнет — настоящая физика!
### Как идти дальше?
Добавляйте больше динамических объектов: круги, многоугольники, соединяйте их шарнирами — с Box2D просто строить и домино, и симулятор машинки. Для визуализации можно использовать Pygame, pyglet или matplotlib, но для отработки логики совсем не обязательно что-то рисовать.
Box2D — отличный инструмент, чтобы почувствовать себя конструктором собственного физического мира, а главное, учиться наглядно — ведь питон в универе уже слишком скучен без весело прыгающих коробочек!
Привет! Меня зовут Иван, и сегодня я расскажу, как оживить ваши питоновские проекты с помощью реальной физики. Модуль Box2D — это порт знаменитого C++-движка, который используется даже в Angry Birds. Работая с Box2D, вы сможете симулировать столкновения, гравитацию, трение и многие другие законы Ньютона.
### Установка
Для начала установим обертку для Python:
pip install box2d-py
### Первый шаг: «Мир» с гравитацией
Box2D моделирует «мир» (world), в котором живут все объекты. Добавим что-то простое: падение квадратика на землю.
from Box2D import (b2World, b2PolygonShape, b2_staticBody, b2_dynamicBody)
world = b2World(gravity=(0, -10), doSleep=True)
# Создаём статический объект — землю
ground = world.CreateStaticBody(
position=(0, 0),
shapes=b2PolygonShape(box=(50, 1)),
)
# Динамический объект — наш падающий ящик
box = world.CreateDynamicBody(position=(0, 20))
box.CreatePolygonFixture(box=(1, 1), density=1, friction=0.3)
### Шаг за шагом: симулируем падение
Box2D устроен так, что на каждом «шагающем» кадре пересчитывает все силы. Сделаем небольшой цикл:
timeStep = 1.0 / 60
vel_iters, pos_iters = 6, 2
for i in range(60):
world.Step(timeStep, vel_iters, pos_iters)
print(f"Step {i}: Box y-position = {box.position.y:.2f}")
Если вы запустите этот код, увидите, как координата вашего ящика падает: Box2D сам «роняет» объекты благодаря гравитации.
### Можно добавить столкновения
Box2D сразу учитывает коллизии: наш куб не провалится сквозь землю, остановится и немного подпрыгнет — настоящая физика!
### Как идти дальше?
Добавляйте больше динамических объектов: круги, многоугольники, соединяйте их шарнирами — с Box2D просто строить и домино, и симулятор машинки. Для визуализации можно использовать Pygame, pyglet или matplotlib, но для отработки логики совсем не обязательно что-то рисовать.
Box2D — отличный инструмент, чтобы почувствовать себя конструктором собственного физического мира, а главное, учиться наглядно — ведь питон в универе уже слишком скучен без весело прыгающих коробочек!
Привет! Я — Иван, и сегодня у нас отличная тема: создание своих API на Python с помощью FastAPI. Если вы когда-нибудь хотели написать бэкенд для веб-приложения или просто быстро протестировать идею — вам определённо стоит познакомиться с этим модулем.
Зачем вообще нужен API?
API (Application Programming Interface) — это способ дать миру (или хотя бы вашему фронтенду/мобильному приложению) доступ к вашей программе. FastAPI — это современный и очень быстрый фреймворк, который позволяет создавать такие интерфейсы буквально за пару минут. Он поддерживает асинхронный код и автоматически документирует ваше API (Swagger/OpenAPI подключены "из коробки").
Минимальный пример
Запустив этот код (
Добавим обработку параметров
Хотите API с параметрами? Без проблем:
Теперь при обращении к
Работаем с запросами POST
Допустим, нужно принимать данные от пользователя. FastAPI умеет автоматически валидировать JSON с помощью Pydantic:
Воспользуйтесь страничкой /docs, чтобы отправить JSON — попробуйте передать
Почему FastAPI крут?
- Автоматические интерактивные docs.
- Поддержка асинхронности и скорости.
- Простота написания и расширения.
FastAPI уже стал любимцем у многих компаний и разработчиков, ведь он позволяет сосредоточиться на коде, а не на рутине. Попробуйте, и уверяю: у вас не возникнет желания возвращаться к более громоздким фреймворкам!
Зачем вообще нужен API?
API (Application Programming Interface) — это способ дать миру (или хотя бы вашему фронтенду/мобильному приложению) доступ к вашей программе. FastAPI — это современный и очень быстрый фреймворк, который позволяет создавать такие интерфейсы буквально за пару минут. Он поддерживает асинхронный код и автоматически документирует ваше API (Swagger/OpenAPI подключены "из коробки").
Минимальный пример
from fastapi import FastAPI
app = FastAPI()
@app.get("/")
def read_root():
return {"message": "Hello, FastAPI!"}
Запустив этот код (
uvicorn main:app --reload), вы моментально получите рабочее API: откройте браузер, зайдите на http://localhost:8000, и увидите JSON-ответ. А если перейти на /docs, там уже подробная документация и онлайн-тестирование всех маршрутов!Добавим обработку параметров
Хотите API с параметрами? Без проблем:
@app.get("/square/{number}")
def calculate_square(number: int):
return {"number": number, "squared": number * number}
Теперь при обращении к
/square/5 вы получите {"number": 5, "squared": 25}.Работаем с запросами POST
Допустим, нужно принимать данные от пользователя. FastAPI умеет автоматически валидировать JSON с помощью Pydantic:
from pydantic import BaseModel
class Item(BaseModel):
name: str
price: float
@app.post("/items/")
def create_item(item: Item):
return {"item_name": item.name, "item_price": item.price}
Воспользуйтесь страничкой /docs, чтобы отправить JSON — попробуйте передать
{"name": "Keyboard", "price": 99.99}.Почему FastAPI крут?
- Автоматические интерактивные docs.
- Поддержка асинхронности и скорости.
- Простота написания и расширения.
FastAPI уже стал любимцем у многих компаний и разработчиков, ведь он позволяет сосредоточиться на коде, а не на рутине. Попробуйте, и уверяю: у вас не возникнет желания возвращаться к более громоздким фреймворкам!
👍2
Привет! С вами Иван. Сегодня разберём одну из самых закулисных и магических тем Python — управление памятью: подсчёт ссылок и сборку мусора. Если вы когда-нибудь задумывались, почему Python не просит у вас явно освобождать память, то этот пост для вас!
## Подсчёт ссылок: сколько “рук” держат объект?
Python использует reference counting — счётчик ссылок на каждый объект. Когда переменная указывает на объект, счётчик увеличивается. Как только ни одна переменная на него больше не ссылается, объект считается “ненужным” и подлежит удалению.
Пример:
Магия проста: пока есть хотя бы одна “рука”, держащая объект, он живёт. Как только все переменные и ссылки исчезают — память освобождается.
## Сборка мусора: борьба с “каруселями”
Но что, если объекты ссылаются друг на друга? Простое удаление переменных не сработает — каждый будет держать “за руку” другого, и счётчики не опустятся до нуля! Тут появляется garbage collector.
В Python модуль
Garbage collector периодически сканирует объекты, чтобы найти непростые циклы, и удаляет их, когда доступ к ним невозможен.
## Практические советы
- Не бойтесь “загрязнить” память — Python делает всё сам.
- Если работаете с большим количеством данных и видите рост памяти — попробуйте вызвать
- Используйте weakref, если нужен временный “тонкий” доступ без увеличения счётчика ссылок.
Пусть ваша память всегда будет свободна для новых идей!
## Подсчёт ссылок: сколько “рук” держат объект?
Python использует reference counting — счётчик ссылок на каждый объект. Когда переменная указывает на объект, счётчик увеличивается. Как только ни одна переменная на него больше не ссылается, объект считается “ненужным” и подлежит удалению.
Пример:
import sys
a = []
print(sys.getrefcount(a)) # Обычно вернёт 2 (a и аргумент функции)
b = a
print(sys.getrefcount(a)) # Уже 3 ссылки (a, b, и аргумент)
del b
print(sys.getrefcount(a)) # Снова 2
Магия проста: пока есть хотя бы одна “рука”, держащая объект, он живёт. Как только все переменные и ссылки исчезают — память освобождается.
## Сборка мусора: борьба с “каруселями”
Но что, если объекты ссылаются друг на друга? Простое удаление переменных не сработает — каждый будет держать “за руку” другого, и счётчики не опустятся до нуля! Тут появляется garbage collector.
В Python модуль
gc следит за такими “каруселями”:import gc
class Node:
def __init__(self):
self.ref = None
x = Node()
y = Node()
x.ref = y
y.ref = x
del x, y # Ссылок на объекты нет, но карусель всё ещё существует
gc.collect() # Явно собираем мусор, объекты будут удалены
Garbage collector периодически сканирует объекты, чтобы найти непростые циклы, и удаляет их, когда доступ к ним невозможен.
## Практические советы
- Не бойтесь “загрязнить” память — Python делает всё сам.
- Если работаете с большим количеством данных и видите рост памяти — попробуйте вызвать
gc.collect().- Используйте weakref, если нужен временный “тонкий” доступ без увеличения счётчика ссылок.
Пусть ваша память всегда будет свободна для новых идей!
👍2
Привет! На связи Иван, и сегодня в нашем блоге разберём магию перенаправления потоков ввода и вывода в Python. Зачем это нужно? Например, если вы хотите записывать вывод вашей программы не только на экран, но и в файл, или "обмануть" функцию, которая традиционно ждёт пользовательский ввод, подсовывая ей данные автоматически. Готовы? Погнали!
## Перенаправляем stdout: вывод в файл и обратно
Для работы с потоками в Python служит модуль
Теперь строка "Hello, file!" попадёт в файл, а "Hello, console!" — как обычно, в терминал.
## Подменяем stdin: автоматизируем ввод
Точно так же можно подменить поток ввода. Это удобно, когда нужно тестировать функции, требующие input от пользователя.
В этом примере input не ждёт ввода, а сразу получает '42'. Удобно для юнит-тестов!
## А если хочется перехватить вывод программы?
Трюк с подменой stdout особенно крут, когда хочется легко перехватывать и анализировать результат работы каких-то функций. Например, сделаем функцию, возвращающую всё, что она напечатала:
Теперь мы можем обработать результат как строку — не круто ли?
На этом всё! Не стесняйтесь экспериментировать с потоками: это ключ к автоматизации, тестированию и оптимизации ваших программ. Желаю отличной практики и новых открытий с Python!
Иван.
## Перенаправляем stdout: вывод в файл и обратно
Для работы с потоками в Python служит модуль
sys. Самый популярный поток — это sys.stdout, который по умолчанию пишет в консоль. Давайте заставим его писать в файл:import sys
with open('output.txt', 'w') as file:
original_stdout = sys.stdout # сохраняем ссылку на стандартный поток
sys.stdout = file # перенаправляем stdout в файл
print("Hello, file!")
sys.stdout = original_stdout # возвращаем stdout обратно
print("Hello, console!")
Теперь строка "Hello, file!" попадёт в файл, а "Hello, console!" — как обычно, в терминал.
## Подменяем stdin: автоматизируем ввод
Точно так же можно подменить поток ввода. Это удобно, когда нужно тестировать функции, требующие input от пользователя.
import sys
from io import StringIO
test_input = StringIO('42\n')
original_stdin = sys.stdin
sys.stdin = test_input
number = int(input("Enter a number: "))
print("Number x2:", number * 2)
sys.stdin = original_stdin
В этом примере input не ждёт ввода, а сразу получает '42'. Удобно для юнит-тестов!
## А если хочется перехватить вывод программы?
Трюк с подменой stdout особенно крут, когда хочется легко перехватывать и анализировать результат работы каких-то функций. Например, сделаем функцию, возвращающую всё, что она напечатала:
def capture_output(func):
import sys
from io import StringIO
output = StringIO()
original_stdout = sys.stdout
sys.stdout = output
try:
func()
finally:
sys.stdout = original_stdout
return output.getvalue()
def hello():
print("Hello from function!")
text = capture_output(hello)
print("Captured:", text)
Теперь мы можем обработать результат как строку — не круто ли?
На этом всё! Не стесняйтесь экспериментировать с потоками: это ключ к автоматизации, тестированию и оптимизации ваших программ. Желаю отличной практики и новых открытий с Python!
Иван.
❤2