Python для начинающих
1.09K subscribers
304 photos
3 videos
232 files
62 links
Python для начинающих
Download Telegram
# Как использовать Python для автоматизации DevOps процессов

Вы когда-нибудь задумывались, насколько скучной может быть рутинная работа в мире DevOps? Постоянный мониторинг серверов, обновление конфигураций, управление развертыванием приложений... Это процесс, который может выматывать. Но что если у нас есть инструмент, позволяющий автоматизировать все это? И этим инструментом будет Python!

Python — это не просто язык для написания скриптов. Это мощное оружие, которое помогает DevOps-инженерам избавляться от ручной работы и делать их будни проще и эффективнее. В этой статье я расскажу, как Python можно использовать для автоматизации DevOps процессов, рассмотрим несколько полезных библиотек и покажем примеры из реальной жизни.

### Библиотеки для DevOps

Python обладает огромным количеством библиотек, которые идеально подходят для задач автоматизации. Вот несколько самых популярных:

1. Fabric — упрощает выполнение SSH-команд и управление серверами.
2. Ansible Runner — позволяет управлять задачами через Ansible.
3. Boto3 — идеальный выбор для взаимодействия с сервисами AWS.
4. Paramiko — клиент для SSH, если вы хотите больше контроля.
5. Docker SDK for Python — для работы с контейнерами Docker.

С помощью этих библиотек можно автоматизировать самые разные аспекты DevOps, от управления виртуальными машинами до развертывания приложений в контейнеры.

### Примеры использования

#### 1. Выполнение команд на удаленном сервере
Например, вам нужно обновить все пакеты на сервере. С помощью Fabric это можно сделать в несколько строк:

from fabric import Connection

def update_packages():
conn = Connection(host="example.com", user="admin", connect_kwargs={"password": "securepassword"})
conn.run("sudo apt update && sudo apt upgrade -y")
print("Packages updated successfully!")

update_packages()


Этот небольшой скрипт подключается к серверу по SSH и выполняет команду для обновления пакетов.

#### 2. Работа с облаком AWS
Если вы используете AWS, то библиотека Boto3 станет вашим лучшим другом. Например, вы хотите получить список всех S3 бакетов:

import boto3

def list_s3_buckets():
s3 = boto3.client('s3')
response = s3.list_buckets()
for bucket in response['Buckets']:
print(bucket['Name'])

list_s3_buckets()


Теперь никакой лишней ручной работы в AWS Management Console — управление автоматизировано.

#### 3. Управление Docker контейнерами
С помощью Docker SDK для Python можно разворачивать и управлять контейнерами без необходимости использовать командную строку:

import docker

def run_container():
client = docker.from_env()
container = client.containers.run("nginx", detach=True, ports={'80/tcp': 8080})
print(f"Container {container.name} is running with ID: {container.id}")

run_container()


Этот скрипт запускает контейнер с Nginx, открывая порт 8080, — быстро и просто.

### Зачем это нужно?

Автоматизация DevOps процессов позволяет:
- Экономить время: одноразовый скрипт может заменить часы ручной работы.
- Избежать ошибок: в скриптах меньше шансов на человеческую ошибку.
- Повысить эффективность: автоматические задачи выполняются быстрее, чем вручную.

### Заключение

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

Смело погружайтесь в автоматизацию DevOps с Python!
🔥3
Работа с аудиофайлами: основное введение в библиотеку librosa
# Работа с аудиофайлами: основное введение в библиотеку librosa

Любите слушать музыку? А что насчёт её анализа или обработки? Если когда-либо задумывались об извлечении данных из аудиофайлов или создании собственного аудиоаналитического инструмента, то библиотека librosa – ваш верный спутник. Сегодня я расскажу, как легко начать разбираться с аудио, используя librosa, и покажу несколько примеров её магии.

## Знакомство с librosa

librosa – популярная библиотека Python для работы с аудиосигналами и анализа музыки. У неё невероятно широкий функционал: от загрузки и воспроизведения треков до вычисления спектрограммы или ритма. Эта библиотека особенно ценится в области музыкальных исследований, но её возможности гораздо шире.

Главное, о чём стоит помнить: librosa не предназначена для записи или прямой манипуляции со звуком (например, наложения эффектов). Её задача – анализ и подготовка данных.

Для её установки достаточно одной команды:

pip install librosa


Теперь откроем её возможности.

## Пример 1: Загрузка аудиофайла

Наиболее первая задача – это загрузка аудио для дальнейшей работы. Пусть у нас есть файл audio_file.mp3. С помощью одной команды мы можем получить сигнал и частоту дискретизации:

import librosa

# Загрузка файла
audio, sr = librosa.load("audio_file.mp3")

# Параметры
print(f"Длина аудиосигнала: {len(audio)}")
print(f"Частота дискретизации: {sr}")


audio – это массив значений амплитуды аудиосигнала, а sr (sampling rate) – частота дискретизации, измеренная в герцах. Она указывает, сколько точек аудиосигнала проанализировано за секунду.

Хотите увидеть график загруженного аудио? Легко:

import matplotlib.pyplot as plt

plt.figure(figsize=(10, 4))
plt.plot(audio)
plt.title("Waveform")
plt.xlabel("Time")
plt.ylabel("Amplitude")
plt.show()


Красота, правда? Теперь визуально понятнее, с чем мы имеем дело.

## Пример 2: Извлечение мел-спектрограммы

Мел-спектрограмма – это изображение энергии звука с учётом восприятия частот человеческим слухом. Она широко используется в музыкальной теории, а также в задачах обработки аудиосигналов.

mel_spec = librosa.feature.melspectrogram(y=audio, sr=sr, n_mels=128, fmax=8000)

# Преобразование амплитуд к логарифмическому масштабу
log_mel_spec = librosa.power_to_db(mel_spec, ref=np.max)

# Визуализация
plt.figure(figsize=(10, 4))
librosa.display.specshow(log_mel_spec, sr=sr, x_axis="time", y_axis="mel", fmax=8000, cmap="coolwarm")
plt.colorbar(format="%+2.0f dB")
plt.title("Log Mel Spectrogram")
plt.xlabel("Time")
plt.ylabel("Frequency (Hz)")
plt.tight_layout()
plt.show()


Красочная спектрограмма готова! Она компактно отображает изменения звука по времени и частоте.

## Пример 3: Извлечение ритма

А теперь расчитаем BPM (удары в минуту), чтобы определить ритм аудиофайла. Это важный показатель, который встречается в музыкальной теории и для анализа композиций.

tempo, _ = librosa.beat.beat_track(y=audio, sr=sr)
print(f"Определённый темп: {tempo:.2f} BPM")


Вот так легко можно узнать темп своего любимого трека.

## Пример 4: Обнаружение тональности

Хотите определить тон или ноту, к которой относится аудиофайл? Вот как это сделать:

chroma = librosa.feature.chroma_cqt(y=audio, sr=sr)

# Визуализация
plt.figure(figsize=(10, 4))
librosa.display.specshow(chroma, y_axis="chroma", x_axis="time", cmap="coolwarm")
plt.title("Chroma Features")
plt.colorbar()
plt.tight_layout()
plt.show()


Такой подход применим не только для анализа тональности, но и для определения сходства мелодий между композициями.

---

## Заключение

librosa – это мощный инструмент для работы с аудио. Он способен сделать многое, от простой загрузки треков до глубокой музыкальной аналитики. Мы только прикоснулись к её возможностям, но уже увидели, как она облегчает сложные задачи анализа.

Если вы интересуетесь музыкальными данными, работой с аудиофайлами или просто хотите разобраться с основами анализа звука, попробуйте librosa. Уверен, вы сразу захотите попробовать что-то большее!
👍2🔥1
Как использовать модули asyncio и aiohttp для создания веб-приложений
Как использовать модули asyncio и aiohttp для создания веб-приложений
# Как использовать модули asyncio и aiohttp для создания веб-приложений

В веб-разработке Python уже давно зарекомендовал себя как инструмент, способный эффективно решать множество задач. При создании современных приложений большое внимание уделяется производительности и скорости ответа сервера. Именно здесь на сцену выходят асинхронные технологии, которые позволяют обрабатывать тысячи запросов одновременно. Сегодня я покажу, как с помощью модулей asyncio и aiohttp создать простое и эффективное веб-приложение.

---

## Асинхронность в Python: коротко о главном

Асинхронный подход отлично справляется там, где есть множество операций ввода-вывода: работа с сетями, файловыми системами или базами данных. Вместо того, чтобы тратить драгоценное время процессора на бездействие (например, при ожидании ответа от базы данных), асинхронные функции позволяют переключаться на выполнение других задач. Основным инструментом асинхронного программирования в Python является модуль asyncio.

Простейший пример asyncio:

import asyncio

async def greet():
print("Hello!")
await asyncio.sleep(1)
print("Goodbye!")

asyncio.run(greet())


Обратите внимание на ключевые слова async и await — они задают асинхронное поведение. Функция greet выполняется неблокирующе, и между ее вызовами может происходить что-то другое.

---

## Знакомство с aiohttp

aiohttp — это асинхронный HTTP-клиент и сервер. Он позволяет легко как отправлять HTTP-запросы, так и поднимать собственный сервер для обработки запросов. Благодаря интеграции с asyncio, этот модуль особо популярен для создания легковесных API.

### Установка:
Для начала установим библиотеку:
pip install aiohttp


Теперь создадим сервер, который будет отвечать на запросы.

---

## Создание простого веб-приложения

Мы напишем сервер, который возвращает случайное приветствие.

### Пример кода:
from aiohttp import web
import random

async def hello(request):
greetings = ["Hello, World!", "Hi there!", "Greetings!", "Welcome!"]
return web.Response(text=random.choice(greetings))

async def main_app():
app = web.Application()
app.add_routes([web.get('/', hello)])
return app

if __name__ == '__main__':
web.run_app(main_app())


### Как это работает:
1. Мы создаем обработчик hello, который выбирает случайное приветствие и возвращает его в виде текста.
2. Регистрируем обработчик на маршрут / с помощью add_routes.
3. Запускаем сервер с помощью web.run_app.

Запустив программу, ваш сервер будет слушать запросы на порту по умолчанию (8080). Зайдите в браузер по адресу http://localhost:8080, и вы увидите одно из приветствий.

---

## Асинхронные запросы: клиент на aiohttp

Теперь давайте попробуем отправить HTTP-запросы с помощью aiohttp-клиента. Например, мы сделаем запрос к публичному API и выведем данные.

### Пример кода:
import aiohttp
import asyncio

async def fetch_data():
async with aiohttp.ClientSession() as session:
async with session.get("https://jsonplaceholder.typicode.com/posts/1") as response:
data = await response.json()
print(data)

asyncio.run(fetch_data())


### Что происходит:
1. Мы используем aiohttp.ClientSession для создания HTTP-сессии.
2. Асинхронно отправляем GET-запрос с помощью session.get.
3. Распаковываем и выводим JSON-ответ.

---

## Почему aiohttp и asyncio — это круто?

1. Высокая производительность. Асинхронный подход позволяет масштабировать приложение без значительного увеличения потребляемых ресурсов.
2. Простота. aiohttp предоставляет удобный интерфейс для работы с HTTP, поддерживая асинхронные операции "из коробки".
3. Гибкость. С помощью этих модулей можно легко построить как небольшой сервер, так и сложное распределенное приложение.

На этом все! В реальных проектах комбинация aiohttp и asyncio станет мощным инструментом для создания быстрых и эффективных веб-сервисов. Начните с простого примера и постепенно углубляйтесь в их возможности!

---

Надеюсь, теперь вы вдохновлены попробовать эти инструменты в своих проектах. 🚀
🔥1
Разработка интерактивных расписаний с использованием календарных API и Python
Привет, друзья! Сегодня я хочу рассказать вам о том, как использовать Python для создания интерактивных расписаний с применением календарных API. Если вы когда-нибудь задумывались над тем, как автоматизировать управление своими событиями, встречами или даже расписаниями учебы, то эта статья для вас.

Календарные API предоставляют готовый функционал для работы с датами, событиями и напоминаниями. Одним из самых популярных решений является Google Calendar API, который позволяет интегрировать ваши проекты с Google Календарем. Всё, что вам нужно, — это базовые знания Python, аккаунт Google и немного энтузиазма.

### Настраиваем проект и подключаем API

Для начала нам потребуется настроить доступ к Google Calendar API:
1. Перейдите в Google Cloud Console и создайте новый проект.
2. Включите API "Google Calendar".
3. Создайте учетные данные типа "OAuth 2.0 Client ID" и скачайте файл credentials.json.

Теперь установим необходимые библиотеки:
pip install google-api-python-client google-auth-httplib2 google-auth-oauthlib


### Создание соединения с API

Давайте разберём, как установить соединение с Google Calendar API:
from google_auth_oauthlib.flow import InstalledAppFlow
from googleapiclient.discovery import build

# Открываем файл с ключами
flow = InstalledAppFlow.from_client_secrets_file(
'credentials.json',
scopes=['https://www.googleapis.com/auth/calendar']
)

# Проходим аутентификацию
credentials = flow.run_local_server(port=0)

# Создаем подключение к API
service = build('calendar', 'v3', credentials=credentials)


Теперь у нас есть готовый объект service, который позволяет взаимодействовать с Google Календарём. Давайте добавим первое событие.

### Добавление события в календарь

Представьте, что вы хотите запланировать встречу. С помощью функции insert можно добавить событие:
from datetime import datetime, timedelta

event = {
'summary': 'Online Meeting',
'location': 'Zoom',
'description': 'Discuss project updates',
'start': {
'dateTime': (datetime.utcnow() + timedelta(days=1)).isoformat() + 'Z',
'timeZone': 'UTC',
},
'end': {
'dateTime': (datetime.utcnow() + timedelta(days=1, hours=1)).isoformat() + 'Z',
'timeZone': 'UTC',
},
'reminders': {
'useDefault': False,
'overrides': [
{'method': 'email', 'minutes': 24 * 60}, # Напоминание за 1 день
{'method': 'popup', 'minutes': 10}, # Напоминание за 10 минут
],
},
}

event_result = service.events().insert(calendarId='primary', body=event).execute()
print('Event created:', event_result['htmlLink'])


Этот код создаёт событие с названием "Online Meeting", которое начнётся завтра и продлится 1 час. Ссылку на событие можно найти в ответе API.

### Получение списка событий

Если вам нужно просмотреть предстоящие мероприятия, используйте следующий код:
now = datetime.utcnow().isoformat() + 'Z'  # Текущая дата и время
events_result = service.events().list(
calendarId='primary', timeMin=now,
maxResults=10, singleEvents=True,
orderBy='startTime'
).execute()

events = events_result.get('items', [])
for event in events:
start = event['start'].get('dateTime', event['start'].get('date'))
print(start, event['summary'])


Этот сценарий выведет список ближайших 10 событий.

### Где это можно использовать?

У такого подхода множество применений:
- Создание рабочих расписаний.
- Автоматизация напоминаний о дедлайнах.
- Интеграция расписаний с другими сервисами (например, Telegram-бот для напоминаний).

### Заключение

Интерактивные расписания — это мощный инструмент, который можно настроить на любое занятие или любую сферу жизни. Благодаря Google Calendar API и Python, вы можете в разы упростить управление своим временем. Надеюсь, этот пост дал вам полезные идеи для работы!

Если статья вас вдохновила, попробуйте реализовать свои идеи с Google Calendar API и Python. Уверен, результат вас не разочарует. 🚀
🔥1
Настройка собственного доступа к SSH с Python и paramiko
### Настройка собственного доступа к SSH с Python и библиотекой Paramiko

Давайте немного поговорим о магии. Вы, наверное, привыкли использовать терминал и OpenSSH для подключения по SSH, но стоит ли ограничивать себя? Python позволяет не только автоматизировать эти подключения, но и создавать скрипты, работающие удаленно, будто это волшебство. Сегодня я расскажу, как использовать библиотеку Paramiko, чтобы настроить SSH-доступ через Python. Готовьтесь к коду и интересным примерам!

---

#### Что такое Paramiko и зачем он нужен?

Paramiko – это мощная библиотека для работы с протоколом SSH2. Она позволяет подключаться к серверу, выполнять команды, управлять файлами или даже строить свои собственные серверы SSH. Ключевая её особенность – пропускная мощь в сочетании с простотой использования. Всё, что вам нужно, – это Python, пара магических строк кода и секретный SSH-ключ. Звучит заманчиво, верно?

---

#### Установка библиотеки

Если у вас ещё нет Paramiko, установить её проще простого:

pip install paramiko


---

#### Базовое подключение к серверу

Взглянем на самый простой пример работы с SSH. Пусть у нас есть сервер с доступом по ключу или паролю. Мы подключимся к нему, выполним команду ls для просмотра содержимого директории и выведем результат.

import paramiko

# Создаем SSH-клиент
ssh_client = paramiko.SSHClient()

# Автоматически добавляем неизвестные хосты в список "доверенных"
ssh_client.set_missing_host_key_policy(paramiko.AutoAddPolicy())

# Подключение к серверу
ssh_client.connect(
hostname="your_server_ip",
username="your_username",
password="your_password" # Или используйте параметр key_filename="/path/to/private/key"
)

# Выполнение команды
stdin, stdout, stderr = ssh_client.exec_command("ls")
output = stdout.read().decode()
print("Command output:", output)

# Закрытие соединения
ssh_client.close()


Просто? Конечно. Теперь вы можете автоматизировать любые задачи, которые ранее выполнялись вручную через терминал.

---

#### Подключение с использованием ключей

Работа с паролями – это быстро и удобно, но гораздо безопаснее использовать ключи. Для примера предположим, что у нас есть приватный SSH-ключ.

ssh_client.connect(
hostname="your_server_ip",
username="your_username",
key_filename="/path/to/private/key"
)


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

---

#### Загрузка и скачивание файлов

SSH – это не только команды, но и файлы. Например, вы хотите скачать или передать документ между локальной машиной и сервером. Paramiko поставляется с инструментарием SCP-like для таких операций.

import paramiko

# Настройка SFTP-сессии
ssh_client = paramiko.SSHClient()
ssh_client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh_client.connect(hostname="your_server_ip", username="your_username", key_filename="/path/to/private/key")

sftp = ssh_client.open_sftp()

# Скачиваем файл с сервера
sftp.get("/remote/path/to/file.txt", "local_file.txt")

# Загружаем файл на сервер
sftp.put("local_upload.txt", "/remote/path/to/upload.txt")

sftp.close()
ssh_client.close()


И вот ваши файлы уже путешествуют между системами! Всё просто.

---

#### Как избежать ошибок?

1. Адрес хоста и порт. Проверьте, что IP-адрес/домен сервера правильный и указывайте порт (обычно 22, но может отличаться).
2. Ключи доступа. Проверьте права доступа к файлу ключа (у него должны быть права 600).
3. Безопасность. Не храните пароли или ключи прямо в коде – лучше используйте переменные окружения или менеджеры секретов.

---

#### Заключение

Paramiko превращает работу с SSH в игру: вы можете автоматизировать рутинные задачи, например, проверку логов, бэкапы или деплой проектов на сервер. Инструмент настолько гибкий, что уместен как для написания мини-скриптов, так и для создания мощных админских систем. Чувствуйте себя настоящим магом терминала!
🔥1
Как использовать модуль zipfile для управления архивами
Как использовать модуль zipfile для управления архивами

Если вы когда-нибудь пытались разобраться с файлами, то наверняка сталкивались с архивами ZIP — удобным способом хранения множества файлов в одном компактном контейнере. Но что, если вам нужно автоматизировать работу с архивами? В этом может помочь модуль zipfile, входящий в стандартную библиотеку Python. Сегодня покажу, как быстро освоить инструменты этого модуля и эффективно использовать их.

---

### Основы работы с модулем zipfile

Модуль zipfile позволяет создавать ZIP-архивы, добавлять в них файлы, извлекать содержимое или проверять целостность данных. Все это чрезвычайно удобно, если вы разрабатываете скрипты автоматизации, анализируете данные или просто хотите навести порядок в своих файловых хранилищах.

Начнем с простого примера: как открыть ZIP-архив и посмотреть его содержимое. Для этого используется класс ZipFile.

import zipfile

# Открываем архив для чтения
with zipfile.ZipFile('example.zip', 'r') as zip_file:
# Список файлов внутри архива
file_list = zip_file.namelist()
print(f"Files in archive: {file_list}")


Метод namelist() возвращает список всех файлов и папок, находящихся внутри архива. Так вы сможете легко узнать, что внутри без распаковки.

---

### Извлечение файлов из архива

Допустим, вы обнаружили в архиве нужный файл и хотите его извлечь. Используем метод extractall() для извлечения всего содержимого архива в текущую директорию. А если нужно воспроизвести структуру папок, предусмотренную в архиве, — вы в надежных руках!

import zipfile

# Извлекаем все файлы из архива
with zipfile.ZipFile('example.zip', 'r') as zip_file:
zip_file.extractall('output_directory') # Указываем, куда извлекать
print("Files extracted successfully!")


Если же вы хотите извлечь только один конкретный файл, используйте функцию extract():

with zipfile.ZipFile('example.zip', 'r') as zip_file:
zip_file.extract('document.txt', 'output_directory')
print("Specific file extracted!")


---

### Создание ZIP-архива

Но что, если вам нужно создать архив самостоятельно? Здесь на помощь приходит режим w (write). Добавление файлов в архив осуществляется с помощью метода write().

import zipfile

# Создаем новый архив
with zipfile.ZipFile('new_archive.zip', 'w') as zip_file:
zip_file.write('file1.txt')
zip_file.write('file2.txt')
print(f"Archive created: {'new_archive.zip'}")


Модуль автоматически сжимает файлы, добавленные в архив. Если хотите добавить несколько файлов сразу, можно воспользоваться циклом. Например:

files_to_zip = ['file1.txt', 'file2.txt', 'file3.txt']

with zipfile.ZipFile('multi_files.zip', 'w') as zip_file:
for file in files_to_zip:
zip_file.write(file)
print("All files added to archive.")


---

### Проверка целостности архива

Представьте ситуацию: вы скачали архив с сети, но нужно удостовериться, что он не поврежден. С zipfile это тоже можно сделать, используя метод testzip().

import zipfile

with zipfile.ZipFile('example.zip', 'r') as zip_file:
corrupted_file = zip_file.testzip()
if corrupted_file:
print(f"Corrupted file: {corrupted_file}")
else:
print("Archive check passed. No corrupted files found.")


Такой инструмент особенно полезен при работе с важными данными, где любой дефект может привести к потере информации.

---

### Другие полезные функции

Модуль zipfile поддерживает работу с паролями. Если ваш ZIP-файл защищен паролем, его можно передать в метод .extract() через параметр pwd. Однако, будьте осторожны: функция поддерживает только пароли, закодированные в байтах (b'password').

---

### Заключение

Модуль zipfile прост и мощен. Будь то создание новых архивов, извлечение данных или проверка целостности — все задачи решаются несколькими строками Python. Его функционал позволяет заменить множество ручных операций и ускорить работу с большими массивами данных.

Теперь, когда вы знаете основы, возьмите любое задание, связанное с ZIP-архивами, и решите его с удовольствием. Python всегда на вашей стороне!
👍1🔥1
- Создание систем автоматического отклика на Python
👍1
Создание систем автоматического отклика на Python

Когда общение с клиентами и пользователями превращается в хаос, системы автоматического отклика приходят на помощь. Хотите создать бота, который автоматически будет отвечать на сообщения? Тогда Python — ваш лучший друг! С его богатой экосистемой библиотек и простотой разработки мы можем за несколько минут соорудить полезный инструмент, незаменимый для бизнеса. Давайте разберём тему подробно, но без лишних сложностей.

---

#### Почему Python?

Python удобен для реализации такого рода задач благодаря множеству готовых библиотек, которые поддерживают интеграцию с различными платформами: Telegram, email, Discord, Slack и другими. Для большинства задач не потребуется даже сложного программирования — основные библиотечные модули уже всё сделали за нас.

Мы сосредоточимся на библиотеке smtplib для email и популярной python-telegram-bot для Telegram.

---

### Автоматический email-отклик с помощью smtplib

Для начала создадим простейшую систему автоматического отклика через электронную почту. Этот подход отлично подходит для подтверждений заказов, уведомления о статусе или других простых задач.

Вот пример:

import smtplib
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart

def send_auto_reply(to_email, subject, body):
sender_email = "youremail@gmail.com"
sender_password = "yourpassword"

# Настройка сообщения
msg = MIMEMultipart()
msg['From'] = sender_email
msg['To'] = to_email
msg['Subject'] = subject

msg.attach(MIMEText(body, 'plain'))

# Подключение к SMTP-серверу Gmail (или другого провайдера)
with smtplib.SMTP('smtp.gmail.com', 587) as server:
server.starttls()
server.login(sender_email, sender_password)
server.send_message(msg)

# Пример вызова функции
send_auto_reply("receiver@gmail.com", "Спасибо за ваше сообщение", "Мы свяжемся с вами в ближайшее время.")


Этот код отправляет простое текстовое письмо на указанный адрес. Конечно, для работы вам нужно будет заменить свои учетные данные (и, возможно, включить доступ для "менее безопасных приложений" в настройках Gmail).

---

### Telegram-бот: автоматические ответы на сообщения

Телеграм-боты уже стали повсеместно популярны. С их помощью можно автоматизировать общение с пользователями, например отвечать на часто задаваемые вопросы. Мы воспользуемся библиотекой python-telegram-bot.

Установим её в командной строке:

pip install python-telegram-bot


Пример Telegram-бота, который будет автоматически отвечать на сообщения:

from telegram import Update
from telegram.ext import Updater, CommandHandler, MessageHandler, Filters, CallbackContext

def start(update: Update, context: CallbackContext):
update.message.reply_text("Привет! Я бот. Напишите мне что-нибудь, и я отвечу.")

def handle_message(update: Update, context: CallbackContext):
user_message = update.message.text
update.message.reply_text(f"Вы сказали: {user_message}")

if __name__ == '__main__':
updater = Updater("YOUR_TELEGRAM_BOT_TOKEN") # Замените токен на ваш

dp = updater.dispatcher
dp.add_handler(CommandHandler("start", start))
dp.add_handler(MessageHandler(Filters.text & ~Filters.command, handle_message))

updater.start_polling()
updater.idle()


Что делает этот бот? Он отвечает каждым сообщением обратно пользователю с текстом, который вы ему отправили. Конечно, это лишь основа. Вы можете легко добавить обработку команд, интеграцию с базами данных или API других сервисов.

---

### Расширяем функционал

1. Распознавание текста. С помощью библиотеки nltk или spaCy можно добавлять распознавание ключевых слов или даже анализ тональности.

2. Запуск по расписанию. Планируйте автоматические уведомления с помощью модуля schedule.

3. Интеграция с базами данных. Подключите sqlite3 или любую другую базу для хранения информации о пользователях.

4. Ответы на основе ИИ
👍4🔥1
- Обеспечение качества кода с typing и mypy
👍1
Обеспечение качества кода с typing и mypy

Если вы когда-либо сталкивались с неожиданными ошибками в Python, связанными с неверным типом данных, то, возможно, уже задумывались об инструментах, которые помогли бы находить такие ошибки заранее. Python изначально был задуман как динамически типизированный язык, что сделало его любимцем для быстрых прототипов и проектов. Но у этой гибкости есть свои минусы: никто (включая сам Python) не гарантирует, что ваши переменные используют правильный тип.

К счастью, с Python 3.5 появилась прекрасная возможность - модуль typing. А еще появилось нечто, что защищает ваши проекты от ошибок, как надежный телохранитель: статический анализатор кода mypy. Давайте разберемся, как с их помощью повысить качество вашего кода.

---

### typing: давайте покажем кодекс строгих типов

typing позволяет добавлять аннотации типов в ваш код. Это не делает Python строго типизированным языком, но позволяет явно указывать, что и какой тип должно иметь. Например:

from typing import List

def calculate_sum(numbers: List[int]) -> int:
return sum(numbers)

print(calculate_sum([1, 2, 3]))


В примере мы говорим: numbers - это список целых чисел (List[int]), а возвращаемое значение функции — тоже целое число (int). Если вы случайно передадите, например, строку вместо числа, сам Python никак не возмутится (пока вы не нарветесь на ошибку), но проверить, всё ли правильно, поможет mypy.

---

### mypy: находка для забывчивых (или ленивых)

mypy — это инструмент, который проверяет ваш код на соответствие аннотациям. Например, возьмем тот же пример и нарочно сделаем ошибку:

# Оставим аннотацию прежней
def calculate_sum(numbers: List[int]) -> int:
return sum(numbers)

calculate_sum(["oops", 3, "error"]) # Очевидный хаос


Если запустить такую программу, Python не сразу заметит проблему. Однако mypy проявит себя на высоте. Сначала установим его, если еще не сделали это:

pip install mypy


Теперь проверим наш злополучный код:

mypy script.py


И увидим что-то вроде такого:

error: List item 0 has incompatible type "str"; expected "int"


Бинго! mypy подскажет, что список содержит элементы неправильного типа! Так легко и просто можно выловить множество подобных ошибок еще до запуска программы.

---

### Удобные типы: от простого до сложного

Модуль typing поддерживает широкий арсенал типизации, включая сложные структуры. Например, если у нас есть функция, возвращающая Optional (то есть либо значение, либо None), это можно указать так:

from typing import Optional

def find_value(data: dict, key: str) -> Optional[int]:
return data.get(key)

print(find_value({"a": 10, "b": 20}, "b")) # Вернет 20
print(find_value({"a": 10}, "c")) # Вернет None


Или, допустим, функция может возвращать разные типы:

from typing import Union

def process_value(value: Union[str, int]) -> str:
if isinstance(value, int):
return f"Number: {value}"
return f"String: {value}"

print(process_value("Hello"))
print(process_value(42))


Union[str, int] говорит, что допустимы оба типа: и строки, и числа.

---

### Практика: как внедрять?

На первых порах typing и mypy могут показаться лишней нагрузкой, особенно на небольших проектах. Однако, практиковаться можно постепенно. Например, начните с типизации наиболее важных функций. А для больших команд и долгосрочных проектов это и вовсе маст-хэв, который экономит часы поиска багов.

И главное, пусть typing не пугает вас. Это не запрет, а скорее указательный знак для вашего же блага. А mypy — не строгий учитель, а надежный помощник. Вместе они превращают Python в куда более надежный инструмент, не теряя его изначальную гибкость.

Попробуйте, и, возможно, вы уже никогда не захотите писать по-другому.
👍2🔥1
- Как создать собственный декоратор для логирования выполнения функций.
Как создать собственный декоратор для логирования выполнения функций

Если вы хоть раз заглядывали в мир Python, то наверняка слышали о декораторах — мощном инструменте, который может творить чудеса с вашими функциями. Сегодня я расскажу, как написать свой собственный декоратор для логирования выполнения функций. Представьте: вы запускаете код, и в логах автоматически фиксируются вызовы функций, переданные аргументы и даже время их выполнения. Звучит круто, правда? А главное — это просто, даже если вы только начинаете свой путь в программировании.

### Что такое декоратор? Напомним...

Декоратор в Python — это функция, которая принимает другую функцию как аргумент, добавляет к ней дополнительную функциональность и возвращает изменённую функцию. Иными словами, это способ "обернуть" функцию для расширения её возможностей, не изменяя её самого кода.

### Зачем нужно логирование?

Логирование помогает нам отслеживать, что происходит в программе: какие функции вызываются, с какими аргументами, какие результаты они возвращают. Это особенно полезно на этапе отладки или анализа работы сложных проектов.

Теперь давайте сделаем практическое погружение и создадим декоратор, который логирует действия функций:

---

### Шаг 1. Простое логирование вызова функции

Начнём с самого основного — будем выводить в консоль имя функции и переданные аргументы. Вот как можно реализовать такой декоратор:

import functools

def log_decorator(func):
@functools.wraps(func)
def wrapper(*args, **kwargs):
print(f"Calling function: {func.__name__}")
print(f"Arguments: {args} {kwargs}")
result = func(*args, **kwargs)
print(f"Returned: {result}")
return result
return wrapper


Разберёмся, что тут происходит:

1. @functools.wraps(func) — это нужно, чтобы декорируемая функция сохраняла своё имя и документацию. Без этого Python "забудет", как оригинальная функция называется.
2. *args и **kwargs — они позволяют передать все позиции и именованные аргументы в функцию, не зная их заранее.
3. Мы обёртываем вызов функции func и добавляем к нему свой код — логирование имени, аргументов и результата.

### Шаг 2. Используем декоратор

Украсим нашу функцию этим волшебством:

@log_decorator
def add(a, b):
return a + b

add(2, 3)


Запустив код, вы увидите следующее:

Calling function: add
Arguments: (2, 3) {}
Returned: 5


Самое классное в декораторах в том, что вы можете использовать их для любых функций, не внося изменения в их структуру. Хоть сложение двух чисел, хоть парсинг веб-страниц — одинаково просто!

---

### Шаг 3. Логирование времени выполнения

Теперь добавим ещё одну полезную штуку: измерение времени выполнения функции. Это поможет понять, какие участки кода "тормозят".

Для этого используем модуль time:

import time
import functools

def timing_log_decorator(func):
@functools.wraps(func)
def wrapper(*args, **kwargs):
start_time = time.time()
result = func(*args, **kwargs)
end_time = time.time()
execution_time = end_time - start_time
print(f"Function: {func.__name__} executed in {execution_time:.4f} seconds")
return result
return wrapper


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

@timing_log_decorator
def slow_function():
time.sleep(2)
print("Done!")

slow_function()


Что вы увидите:

Done!
Function: slow_function executed in 2.0001 seconds


Теперь декоратор не только логирует вызов функции, но и помогает анализировать её производительность.

---

### Шаг 4. Логирование в файл

Если вас раздражает захламлённая консоль, можно сохранить все логируемые данные в файл.
Для этого используем модуль logging:

import logging
import functools

logging.basicConfig(filename='app.log', level=logging.INFO)

def file_log_decorator(func):
@functools.wraps(func)
def wrapper(*args, **kwargs):
logging.info(f"Calling function: {func.__name__} with args={args}, kwargs={kwargs}")
result = func(*args, **kwargs)
logging.info(f"Function {func.__name__} returned: {result}")
return result
return wrapper


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

@file_log_decorator
def multiply(x, y):
return x * y

multiply(4, 5)


Теперь всё логирование отправляется в файл app.log, что гораздо удобнее для длительного анализа.

---

### Заключение

Декораторы — это удивительный инструмент, который экономит время и делает код чище. Логирование функций помогает вам лучше понимать, что происходит в вашем коде, а использование собственного декоратора — это ещё и море удовольствия от правки и настройки под ваши нужды.

Теперь вы знаете, как создавать декораторы для логирования и улучшать свои функции. Так почему бы не начать прямо сейчас? Берите код из статьи и экспериментируйте! 🚀
👍4
- Введение в библиотеку pywin32 для работы с Windows API.