Python для начинающих
1.06K subscribers
283 photos
3 videos
232 files
61 links
Python для начинающих
Download Telegram
Работа с мониторингом системы с помощью модуля psutil
Привет, это Иван! Сегодня поговорим о полезном инструменте для любого начинающего питониста — модуле psutil. Если ты когда-нибудь хотел узнать, сколько “ест” памяти твоя программа, сколько у тебя свободного места на диске или какой у тебя загруженный процессор, psutil поможет всё это выяснить за пару строк кода.

psutil (process and system utilities) — универсальный модуль для мониторинга состояния системы. Он работает на Windows, Linux и даже на Mac, а API у него простой и интуитивный.

### Проверяем загрузку CPU

Начнём с самого интересного — сколько же процентов CPU сейчас используется?

import psutil

cpu_percent = psutil.cpu_percent(interval=1)
print(f"Current CPU load: {cpu_percent}%")


Всё просто: cpu_percent() анализирует загрузку процессора. Если поставить interval=1, функция замеряет занятость CPU за одну секунду.

### Смотрим на память

Хотите выяснить, сколько оперативки свободно? Легко:

import psutil

memory = psutil.virtual_memory()
print(f"Total: {memory.total // (1024**2)} MB")
print(f"Available: {memory.available // (1024**2)} MB")
print(f"Used: {memory.used // (1024**2)} MB")


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

### Местоположение под контроль: мониторим пространство на диске

Нужно узнать, сколько осталось свободного места на диске C? Вот вам пример:

import psutil

disk = psutil.disk_usage('C:\\')
print(f"Total: {disk.total // (1024**3)} GB")
print(f"Free: {disk.free // (1024**3)} GB")


Подставляйте свой путь для Linux или MacOS — будет также работать.

### Выводим процессы — что там работает?

Ещё одна фишка psutil — просмотр процессов:

import psutil

for proc in psutil.process_iter(['pid', 'name', 'username']):
print(proc.info)


Скрипт покажет PID, имя процесса и его владельца для каждого рабочего приложения.

---

psutil — это мгновенный способ получить максимум информации о вашей системе и процессе выполнения вашего Python-кода. Этот модуль часто используют для создания системных мониторов или оптимизации работы программ. Советую попробовать провести “экскурсию” по системе с помощью psutil — и удивиться, сколько полезного можно узнать за пару строк!
👍2🔥1🥰1
Как создавать и использовать промежуточные слои в Flask
Привет! Я Иван, и сегодня мы разберём один из скрытых суперсил Flask — промежуточные слои, или middleware. Если вы пишете свой первый веб-сервис на Flask, то middleware покажутся чем-то загадочным. На самом деле, всё очень просто — это специальные функции, которые могут «подслушать» и даже изменить наш запрос или ответ до того, как он попадёт в маршрутизатор или пользователя.

Зачем это нужно? Представим, что вы хотите журналировать все запросы, добавить авторизацию, измерить время отклика или, скажем, сделать мини-анализатор заголовков. Конечно, можно завернуть логику в декораторы, но middleware позволяют вставить ваш код ещё глубже — на уровне всего приложения!

В Flask есть два основных способа внедрить свои промежуточные слои.

## 1. before_request и after_request

Flask даёт встроенные хуки: можно выполнить что-то ДО и ПОСЛЕ основного обработчика запроса.

from flask import Flask, request

app = Flask(__name__)

@app.before_request
def log_request_info():
print(f"Request: {request.method} {request.path}")

@app.after_request
def add_custom_header(response):
response.headers['X-Powered-By'] = 'Python&Flask'
return response

@app.route("/")
def home():
return "Hello, world!"


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

## 2. Собственные WSGI middleware

Если хочется большего контроля, Flask позволяет оборачивать всё приложение сторонними слоями. Например, напишем свой простой middleware:

class SimpleMiddleware:
def __init__(self, app):
self.app = app

def __call__(self, environ, start_response):
print("Middleware: request received")
return self.app(environ, start_response)

app = Flask(__name__)
app.wsgi_app = SimpleMiddleware(app.wsgi_app)

@app.route("/secret")
def secret():
return "This is secret!"


Здесь каждый HTTP-запрос «проходит» через наш класс, который может делать что угодно с данными.

## Вывод

Промежуточные слои — мощный инструмент, позволяющий работать с каждым запросом и ответом во Flask. Их применение открывает путь к гибкой авторизации, логированию, мониторингу и многому другому — и всё это не в ущерб чистоте главных обработчиков. Используйте middleware тогда, когда нужна общая логика для всего приложения!

— Иван
👍3
Использование модуля tkinter для создания простых калькуляторов
Привет, меня зовут Иван, и сегодня я расскажу, как быстро и просто создать свой калькулятор на Python с помощью модуля 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 — отличный способ почувствовать себя не только программистом, но и настоящим создателем цифровых инструментов. Начните с калькулятора, а там, глядишь, и свой планировщик задач напишете!
Как определить и использовать пользовательские исключения в Python
Привет! Меня зовут Иван, и сегодня я хочу поделиться с вами магией пользовательских исключений в 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.

Пусть ваш код бросает только те снежки, которые вы сами для него подготовили!
👍2
Работа с датами и временем: использование модуля pytz для работы с часовыми поясами
Привет! Меня зовут Иван, и сегодня мы погрузимся в мир времени — а именно, разберёмся, как работать с часовыми поясами в Python при помощи модуля 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 позволяют конвертировать значения времени без головной боли с часовыми поясами!

Теперь работа со временем из Лос-Анджелеса до Владивостока — не проблема. Надеюсь, теперь даты и время не будут вас пугать!
🔥21👍1
Создание интерактивных графиков с использованием Bokeh
Привет! С вами Иван, и сегодня я хочу показать, что создание красивых и интерактивных графиков в Python — это действительно просто, если вы знакомы с библиотекой 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 в деле и удивитесь, насколько по-настоящему «живыми» могут быть ваши графики!
👍1
Как настроить автоматическое тестирование кода с Tox
Привет! С вами Иван, и сегодня я расскажу, как прокачать свой Python-проект с помощью автоматизированного тестирования через Tox. Tox — это настоящий must-have для тех, кто хочет, чтобы код работал стабильно в разных версиях Python без кучи ручной возни.

### Что такое 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
Использование pathlib для упрощения работы с файловыми путями
Привет! С вами Иван, и сегодня поговорим о модуле, который может спасти вас от головной боли при работе с файловыми путями в Python — о 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 вместо старых подходов и почувствуйте, насколько проще стала ваша жизнь!
🔥2
Работа с двоичными данными на Python: модуль struct
Привет! На связи Иван, и сегодня мы разоблачим один из «секретных агентов» стандартной библиотеки Python — модуль struct. Если вам хоть раз приходилось работать с бинарными файлами или протоколами низкого уровня, struct станет вашим лучшим другом. Без него не получится удобно преобразовывать структурированные данные в байты и обратно. Давайте разберёмся, что к чему, на конкретных примерах.

## Быстро обо всём: для чего нужен 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, и так далее), и тогда любой бинарный файл у вас — как открытая книга!
👍2
Как выполнить симуляцию физической системы с Box2D
Симуляция физики в Python: знакомство с 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 — отличный инструмент, чтобы почувствовать себя конструктором собственного физического мира, а главное, учиться наглядно — ведь питон в универе уже слишком скучен без весело прыгающих коробочек!