Python для начинающих
1.12K subscribers
359 photos
3 videos
232 files
67 links
Python для начинающих
Download Telegram
Привет! Я Иван, программист, и сегодня расскажу, как можно анализировать и даже кластеризовать текст с помощью Python и магического инструмента — библиотеки scikit-learn (sklearn). Это будет идеальный первый шаг, если вы хотите автоматизировать обработку отзывов, статей или любой другой текстовой информации.

## 1. Векторизация текста

Компьютеры любят числа! Нас же интересуют буквы, слова и тексты. Чтобы машинке было понятнее, переводим текст в числовой вид с помощью CountVectorizer или TfidfVectorizer.

from sklearn.feature_extraction.text import TfidfVectorizer

texts = [
"Python is easy to learn",
"Python and sklearn are powerful",
"Data science is fun"
]
vectorizer = TfidfVectorizer()
features = vectorizer.fit_transform(texts)
print(features.shape) # (3, 8): 3 документа, 8 уникальных слов


Теперь каждый документ — это вектор из чисел, где каждое число отражает важность определенного слова.

## 2. Кластеризация: учим машину находить похожее

Допустим, у нас куча текстов, и надо понять — какие из них говорят об одном и том же. Для этого идеально подходит KMeans:

from sklearn.cluster import KMeans

num_clusters = 2
kmeans = KMeans(n_clusters=num_clusters, random_state=42)
kmeans.fit(features)

print(kmeans.labels_) # Например: [0 0 1]


Каждому тексту присваивается номер кластера — теперь похожие тексты собраны вместе!

## 3. Мини-применение

Посмотрим, как распределились наши тексты:

for idx, label in enumerate(kmeans.labels_):
print(f"Text: '{texts[idx]}' — Cluster: {label}")


Теперь вы знаете, как можно быстро превратить тексты в числа, и даже найти в них скрытые группы! Модули TfidfVectorizer и KMeans — отличный старт для анализа текстов: они просты в использовании, но мощные по возможностям.

Творите с Python — и пусть тексты больше не будут "тёмным лесом"!
👍2
- Создание сетевых классных комнат с использованием Jitsi API
Привет! С вами Иван, и сегодня мы будем говорить о создании собственной сетевой "классной комнаты" с помощью Python и могучего Jitsi API. Если вы не слышали о Jitsi — это бесплатная и открытая платформа для видеоконференций, которую можно интегрировать в свой проект буквально "на коленке". А ведь сколько возможностей открывается: онлайн-уроки, дистанционные кружки, даже занятия английским по вечерам!

Jitsi: Видеозвонки из Python

Jitsi не имеет нативного Python SDK, но у него есть REST API и iframe интеграция. Самый простой путь — создавать "комнаты" и управлять ими через web-интерфейс Jitsi Meet, генерируя ссылки через Python.

### Создаём комнату и отправляем приглашение

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

import random
import string

def generate_room_name(length=10):
chars = string.ascii_lowercase + string.digits
return ''.join(random.choices(chars, k=length))

room_name = generate_room_name()
jitsi_url = f"https://meet.jit.si/{room_name}"
print("Classroom link:", jitsi_url)


Этот код генерирует уникальное имя класса и выдаёт ссылку. Осталось только отправить её ученикам — хоть по email, хоть через чат-бота!

### Добавляем управление через API

А вот пример запроса к Jitsi Videobridge для получения статистики о комнатах (необходима авторизация):

import requests

server = "https://your-jitsi-server.com"
stats_url = f"{server}/colibri/stats"
response = requests.get(stats_url, auth=('user', 'password'))
print(response.json())


Используя такие запросы, можно отслеживать загруженность сервера: если классов стало слишком много — поднимаем ещё один инстанс.

### Встраиваем Jitsi в веб-приложение

Jitsi легко добавляется на сайт через iframe. Python-проекты на Flask или Django могут генерировать HTML-шаблон с вашей уникальной комнатой:

<iframe allow="camera; microphone; fullscreen; display-capture"
src="https://meet.jit.si/{{ room }}"
style="height: 500px; width: 100%;"></iframe>

Подставьте в {{ room }} имя, которое сгенерировал ваш Python-скрипт — и ваша собственная видеоклассная комната готова!

Вывод:
С помощью пары строк Python и мощи Jitsi можно быстро настроить интерактивные уроки, не разбираясь в сложных API и видеостримах. Экспериментируйте, и пусть ваши виртуальные классы всегда будут полны энтузиазма!
2
- Работа с session объектами для управления состоянием пользователей
Привет, друзья! На связи Иван — сегодня поговорим о магии управления состоянием пользователей в Python с помощью session-объектов.

### Сессии: что это вообще такое?

Когда пользователь взаимодействует с веб-приложением, серверу часто нужно "помнить", кто этот пользователь и что он делал минуту назад. Именно в этом случае на сцену выходят session-объекты: они позволяют сохранить состояние между запросами, создавая иллюзию постоянного соединения клиента с сервером.

### Flask и сессии

Один из самых простых способов работы с сессиями в Python — использовать микрофреймворк Flask. Здесь сессии реализованы очень удобно:

from flask import Flask, session, redirect, url_for, request

app = Flask(__name__)
app.secret_key = 'super_secret_key' # Необходима для криптографии!

@app.route('/login', methods=['POST'])
def login():
user = request.form['username']
session['username'] = user
return redirect(url_for('profile'))

@app.route('/profile')
def profile():
if 'username' in session:
return f"Hello, {session['username']}!"
return 'You are not logged in.'

# Для запуска: app.run()


Здесь благодаря session['username'] сохранится имя пользователя, и при следующем запросе сервер быстро узнает, кто к нему пришел.

### Requests и cookies

Если вам нужно управлять состоянием не на сервере, а в клиенте (например, писать бота для сайта), пригодится модуль requests. В нем есть Session-объект, который автоматически сохраняет cookies:

import requests

s = requests.Session()
login_payload = {'user': 'bob', 'password': 'qwerty'}
s.post('https://example.com/login', data=login_payload)

resp = s.get('https://example.com/profile')
print(resp.text) # Профиль Bob'а, если логин успешен!


Сессия позволяет использовать одни и те же cookies для всех запросов, сразу открывая большие возможности для автоматизации.

### На что обратить внимание:

- Всегда храните секретные ключи вне кода!
- Сессии — не лучший способ хранить крупные объекты или большие объемы данных.
- Удалять данные из session можно с помощью session.pop('key', None) или session.clear().

### Итоги

Сессии — это сердце любого сложного веб-приложения: без них ни аутентификацию, ни корзину покупок реализовать не получится. Используйте возможности Flask и requests на полную катушку, не забывая о безопасности. Удачного кодинга!
👍2
- Как построить свой лексический анализатор с модулем re
Привет, с вами Иван! Сегодня разберём интересную тему — как написать свой собственный лексический анализатор (lexer) на Python, используя модуль re. Это умение полезно, если вы хотите понять, как работают языки программирования изнутри или написать парсер для небольшого языка.

## Немного теории

Лексический анализатор — это инструмент, который разбивает текст на “токены”: числа, идентификаторы, слова, спецсимволы и т.д. Например, строку x = 5 + y лексер превращает в список токенов: имя, знак равно, число, плюс, имя.

Модуль re (regular expressions) делает этот процесс максимально простым и лаконичным.

## Делаем свой мини-лексер

Рассмотрим пример — напишем лексер для простых арифметических выражений (числа, знаки операций, скобки):

import re

# Описываем типы токенов и шаблоны для них
token_spec = [
("NUMBER", r'\d+(\.\d*)?'), # целое или дробное число
("IDENT", r'[A-Za-z_]\w*'), # идентификатор
("PLUS", r'\+'), # плюс
("MINUS", r'-'), # минус
("MULT", r'\*'), # умножение
("DIV", r'/'), # деление
("LPAREN", r'\('), # левая скобка
("RPAREN", r'\)'), # правая скобка
("SKIP", r'[ \t]+'), # пропускаем пробелы и табы
("MISMATCH", r'.'), # неизвестный символ — ошибка
]

token_regex = '|'.join(f'(?P<{name}>{pattern})' for name, pattern in token_spec)

def tokenize(code):
for match in re.finditer(token_regex, code):
kind = match.lastgroup
value = match.group()
if kind == "SKIP":
continue
elif kind == "MISMATCH":
raise RuntimeError(f"Unexpected character: {value}")
yield (kind, value)


Давайте проверим на практике:

expr = "a1 = 3.5 + (b2 - 7) * 4"
tokens = list(tokenize(expr))
print(tokens)


Результат:

[('IDENT', 'a1'), ('MISMATCH', '='), ('NUMBER', '3.5'), ('PLUS', '+'),
('LPAREN', '('), ('IDENT', 'b2'), ('MINUS', '-'), ('NUMBER', '7'),
('RPAREN', ')'), ('MULT', '*'), ('NUMBER', '4')]


## Как это работает?

- Для каждого токена задаём регулярное выражение.
- re.finditer проходит по всей строке, находя совпадения с шаблонами.
- Если токен — пробел или таб, пропускаем его. Если неизвестный символ — бросаем ошибку.

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

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

Создавать лексеры на Python просто — достаточно комбинировать немного re и креативности. Это отличный эксперимент для углубления знаний о языках и внутренних механизмах их работы!

На связи, Иван.
- Использование celery для отложенных задач и процессинга
Привет! Меня зовут Иван, и сегодня мы поговорим о настоящей магии асинхронных задач в Python — модуле Celery. Представьте, что ваш сайт отправляет письма пользователям или обрабатывает тяжелые отчёты. Если выполнять это прямо в запросе пользователя — он уснёт, дожидаясь ответа. А вот если передать дело “отложенному работнику” — всё становится куда быстрее. Именно таким работником и выступает Celery.

## Кратко: что такое Celery?

Celery — это распределённый исполнитель задач, написанный на Python. Он позволяет запускать любые функции в фоне, не блокируя основной поток программы. Для работы ему потребуется брокер сообщений, например, Redis или RabbitMQ — через них Celery отправляет задачи своим воркерам.

## Первый пример — отправка письма

Давайте рассмотрим простой пример. Сначала установим необходимые пакеты:

pip install celery redis


Создадим файл tasks.py:

from celery import Celery

app = Celery('my_tasks', broker='redis://localhost:6379/0')

@app.task
def send_welcome_email(user_email):
print(f"Sending welcome email to {user_email}")
# тут могла бы быть интеграция с реальной email-системой


Теперь можно вызвать задачу асинхронно:

# main.py
from tasks import send_welcome_email

send_welcome_email.delay('newuser@example.com')


Функция delay — и есть магия: она “отправляет” задачу воркеру Celery, а не запускает её прямо сейчас.

## Второй пример — продолжительный процессинг

Что делать, если вам надо обработать много данных, например, генерировать PDF-отчёты? Запускаем это тоже через Celery!

@app.task
def generate_report(report_id):
print(f"Generating report {report_id}...")
# Симуляция долгой работы
import time
time.sleep(5)
print(f"Report {report_id} is ready!")


Теперь задача “варится” в фоне, не мешая пользователям сайта.

## Почему Celery популярен?

- Гибкость: задачи могут быть очередями с разными приоритетами.
- Масштабируемость: запускайте хоть сотню воркеров — всё заработает.
- Мониторинг: Celery легко интегрируется с Flower — инструментом визуального контроля за задачами.

Celery — идеальный выбор, если быстрые фокусы уже не спасают, а задачи требуются “класть на потом”. Попробуйте применить его в своих проектах — и код задышит полной грудью!
👍1
- Введение в веб-ботов с протоколом WebSocket и Python
Привет! С вами Иван, и сегодня мы окунемся в магию живых, мгновенных соединений с помощью WebSocket и Python.

Когда слышишь слово “бот”, сразу представляешь автоматизацию рутины: рассылки, ответы, акции. Но большинство таких ботов работает с HTTP-запросами — обычными односторонними сообщениями. А что если нужен живой диалог, например, чат-бот или отслеживание биржевых цен в режиме реального времени? Вот тут и появляется герой сегодняшнего выпуска — протокол WebSocket!

WebSocket — это двустороннее соединение: клиент и сервер могут отправлять данные друг другу как только захотят. И Python готов работать с этим напрямую через библиотеку websockets.

### Первый пример: клиент на WebSocket

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

import asyncio
import websockets

async def listen():
uri = "ws://localhost:8765"
async with websockets.connect(uri) as websocket:
while True:
message = await websocket.recv()
print(f"Received: {message}")

asyncio.run(listen())


Всего несколько строк — и вы уже получаете данные в реальном времени!

### Второй пример: сервер WebSocket на Python

Запустить свой сервер тоже просто:

import asyncio
import random
import websockets

async def send_random(websocket):
while True:
number = random.randint(1, 100)
await websocket.send(str(number))
await asyncio.sleep(1)

async def main():
async with websockets.serve(send_random, "localhost", 8765):
await asyncio.Future() # run forever

asyncio.run(main())


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

### Идеи для ботов

С помощью WebSocket вы можете сделать:
- чат-бота, который отвечает мгновенно, реагируя на каждое сообщение;
- сборщика уведомлений из разных систем в одном месте;
- монитор трейдов и бирж, чтобы получать апдейты моментально.

Используйте WebSocket для ускорения реакции в своих Python-проектах — этот протокол буквально открывает двери в мир мгновенного обмена данными.
👍1
- Секреты эффективной работы с модулями shutil и os
Привет, на связи Иван! Сегодня расскажу о двух хитрых помощниках Python — модулях shutil и os, которые превращают скучную работу с файлами и папками в настоящее шоу. Узнаем, как быстро манипулировать файлами, автоматизировать рутину и не бояться "переезда" данных.

### Модуль os: база для маневров

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

import os

current_dir = os.getcwd() # Текущая рабочая директория
files = os.listdir(current_dir) # Список файлов в папке
os.mkdir('new_folder') # Создаём новую папку
os.rename('file.txt', 'renamed_file.txt') # Переименование файла


Секрет №1: всегда проверяйте существование файлов и папок перед операциями! Это спасёт от ненужных ошибок.

if not os.path.exists('new_folder'):
os.mkdir('new_folder')


### Модуль shutil: мастер “телепортации” данных

Когда нужно не просто узнать, а двигать файлы или целые каталоги, приходит время shutil. Этот модуль умеет копировать, переносить и удалять данные, и делает это красиво и безопасно.

import shutil

shutil.copy('data.txt', 'backup/data.txt') # Копируем файл
shutil.move('backup/data.txt', 'archive/data.txt') # Перемещаем файл
shutil.rmtree('archive') # Удаляем целую папку cо всеми файлами!


Секрет №2: Используйте shutil.copytree() для копирования целых каталогов, а ещё — можно фильтровать, какие файлы копировать!

def ignore_txt_files(dir, files):
return [f for f in files if f.endswith('.txt')]

shutil.copytree('original', 'copy', ignore=ignore_txt_files)


### Combo: автоматизация на максимум

Комбинируя os и shutil, можно создать свои файловые менеджеры или скрипты для бэкапа. Например, копировать все файлы с определённым расширением:

import os
import shutil

for filename in os.listdir('docs'):
if filename.endswith('.pdf'):
shutil.copy(os.path.join('docs', filename), 'pdf_backup')


### Итог

shutil и os — тандем для любой работы с файлами и папками. Запомните ключевые методы, всегда проверяйте операции на существование объектов и пробуйте писать автоматизации под себя! Всегда рад делиться секретами продуктивной работы на Python — до новых встреч, ваш Иван.
👍1
- Как использовать модуль mmap для оптимизации ввода-вывода
Привет! С вами Иван и сегодня поговорим о настоящей магии — модуле mmap в Python. Все мы привыкли работать с файлами по-старинке: открыли, прочитали в память, закрыли. Но что если файл огромный, а нам нужно обработать только его часть? Пожалуй, тут на сцену выходит герой дня — mmap.

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

mmap позволяет отображать файл в память и работать с ним как с обычным массивом байтов. Это особенно круто при работе с большими файлами, когда нет смысла тратить память на всё содержимое сразу. Всё, что тебе нужно — доступно по байтовому адресу!

## Пример 1: Чтение кусочка огромного файла

Допустим, у нас есть гигантский лог-файл, а мы хотим прочитать только первые 100 байт.

import mmap

with open('huge.log', 'rb') as f:
with mmap.mmap(f.fileno(), length=0, access=mmap.ACCESS_READ) as mm:
snippet = mm[:100]
print(snippet.decode('utf-8', errors='ignore'))


Здесь мы не загружаем весь файл в память, а просто работаем с окном нужного размера. Удобно и быстро!

## Пример 2: Поиск без загрузки файла

А если нужен поиск по файлу? Смотри, как просто ищется подстрока:

import mmap

search_phrase = b'ERROR'

with open('huge.log', 'rb') as f:
with mmap.mmap(f.fileno(), length=0, access=mmap.ACCESS_READ) as mm:
pos = mm.find(search_phrase)
if pos != -1:
print(f'Found at position {pos}')


Как в строке, только по файлу, и всё ― без лишней траты памяти.

## Пример 3: Редактирование файла на месте

mmap позволяет даже изменять файлы на лету. Например, заменить первые 5 байт на другие:

import mmap

with open('data.bin', 'r+b') as f:
with mmap.mmap(f.fileno(), length=0) as mm:
mm[0:5] = b'HELLO'


Изменения сразу отражаются в файле!

## Итог

mmap станет отличным подспорьем, если вы хотите ускорить работу с файлами, не жертвуя оперативной памятью. Работать с файлами становится действительно удобно ― вы просто манипулируете данными как с массивом, и всё прозрачно сохраняется на диск. Обязательно попробуйте в своих проектах!

— Иван, ваш проводник в мир эффективного Python
👍1
- Основы синтаксического анализа и построения деревьев с lxml
Привет! На связи Иван, и сегодня разберём один из мощных инструментов для работы с XML и HTML — библиотеку lxml. Если вы когда-либо сталкивались с необходимостью "разобрать" XML-файл или вытянуть кусочек информации из HTML, lxml сделает это за считанные строки кода. Давайте посмотрим, как работает синтаксический анализ и построение деревьев с этим модулем на практике.

## Загрузка и структура XML

Для начала представим классический XML:

<data>
<user id="1">
<name>John</name>
<age>30</age>
</user>
<user id="2">
<name>Ann</name>
<age>25</age>
</user>
</data>


С помощью lxml превратить этот текст в дерево проще простого:

from lxml import etree

xml_text = '''
<data>
<user id="1">
<name>John</name>
<age>30</age>
</user>
<user id="2">
<name>Ann</name>
<age>25</age>
</user>
</data>
'''

root = etree.fromstring(xml_text)


Теперь root — вершина дерева, а каждый "user" — его потомок. Посмотреть, кто есть кто:

for user in root.findall("user"):
print(user.get("id"), user.findtext("name"))


Вывод будет:
1 John  
2 Ann


## Парсинг HTML и XPath

Работает lxml и с HTML! Очень удобно, если нужно вытащить ссылки или заголовки со странички.

from lxml import html

html_text = '''
<html>
<body>
<h2>Cool title</h2>
<a href="https://example.com">Read more</a>
</body>
</html>
'''

tree = html.fromstring(html_text)
link = tree.xpath('//a/@href')[0]
title = tree.xpath('//h2/text()')[0]
print(title, link)


## Зачем всё это?

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

В результате: lxml незаменим, когда появляется задача парсить XML или HTML, вытаскивать данные, модифицировать структуру, или даже генерировать новые файлы. Всего три-четыре строки кода — и у вас весь документ, как на ладони.
- Как безопасно работать с конфиденциальными данными в Python
Привет! С вами Иван, и сегодня хочу поговорить о том, как работать с конфиденциальными данными в Python и не дать утечкам информации сломать вам карьеру (или, не дай бог, жизнь).

Работая с конфиденциальной информацией — паролями, токенами, API-ключами, персональными данными — нельзя слепо полагаться на "авось пронесёт". Давайте пройдёмся по базовым, жизненно необходимым приемам защиты данных на практике.

1. Не храните секреты в коде

Каждый видел примеры вроде:
password = "SuperSecret123"

Это антипаттерн! Любой, у кого есть доступ к коду, увидит ваш пароль. Используйте переменные окружения:

import os

password = os.getenv("DB_PASSWORD")


Храните настоящие значения в файле .env и никогда не загружайте его в git-репозиторий.

2. Используйте dotenv для удобства

Модуль python-dotenv поможет легко считывать переменные окружения из файла. Просто создайте .env-файл:

DB_PASSWORD=SuperSecret123


И загрузите их:

from dotenv import load_dotenv
import os

load_dotenv()
password = os.getenv("DB_PASSWORD")


3. Никогда не логируйте чувствительные данные

Если вы ведёте логи, не заносите в них пароли, токены, номера карт. Используйте параметр mask в логах своего приложения или самостоятельно следите, что именно выводит ваш print/logging:

import logging

logging.info("User logged in") # А вот такого - избегайте: logging.info(f"Password: {password}")


4. Шифруйте данные на диске и в передаче

Для простого симметричного шифрования идеально подходит модуль cryptography:

from cryptography.fernet import Fernet

key = Fernet.generate_key()
f = Fernet(key)

token = f.encrypt(b"My secret data")
print(token)
print(f.decrypt(token))


Храните ключ отдельно от самого приложения!

5. Не забывайте про права доступа

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

Вывод:
Работа с конфиденциальной информацией – это не только про модные фреймворки, но и про вашу репутацию. Грамотно подходите к вопросам хранения и передачи секретов, а Python и пара библиотек вам в этом помогут.
👍1
- Введение в генераторы AST (Abstract Syntax Tree) в Python