Привет! Сегодня мы отправимся в мир движения — а вернее, построим визуализацию кинематической цепи при помощи Python и библиотеки PyPlot. Нет, не нужно быть инженером-механиком, чтобы понять, как «ходят» шестерёнки. Достаточно немного кода и чуточку воображения.
Кинематическая цепь — это модель системы, в которой звенья соединены подвижными сочленениями. Например, рука человека: плечо, локоть, кисть — каждая часть связана с другой и может двигаться. Аналогично, в робототехнике или анимации персонажей используется описание звеньев и их движений.
Для наглядности мы создадим простую двумерную цепь из нескольких сегментов, каждый из которых соединён с предыдущим. Наша задача — визуализировать положение каждого звена в разных конфигурациях, используя библиотеку matplotlib.pyplot.
Начнём с обязательного импорта и настроек:
Создадим функцию, которая на основе углов и длин звеньев будет генерировать координаты:
В этой функции
Следующая функция займётся отображением цепи:
Теперь соберем всё вместе и поиграемся с разными положениями:
Вы увидите трёхзвенную цепь, где каждый следующий сегмент под углом относительно предыдущего. Попробуйте изменить углы — например, анимировать движение:
Это приведёт к простой анимации — не самой плавной, но эффектной.
Зачем всё это? Такие визуализации важны в робототехнике, где тонко настраивается движение манипуляторов, или в разработке игр, где требуется реализовать движение конечностей персонажа. Более того, основа такой цепи может быть применена в аналитике движений (motion capture), симуляциях или обучении нейросетей захвату объектов.
PyPlot — не единственный инструмент, конечно. Но если вы только начинаете осваивать Python и хотите визуализировать свои идеи без сложной 3D-графики, он — отличная стартовая точка.
Играйтесь с углами, добавляйте больше звеньев, усложняйте модели — ведь граница только одна: ваше воображение.
Кинематическая цепь — это модель системы, в которой звенья соединены подвижными сочленениями. Например, рука человека: плечо, локоть, кисть — каждая часть связана с другой и может двигаться. Аналогично, в робототехнике или анимации персонажей используется описание звеньев и их движений.
Для наглядности мы создадим простую двумерную цепь из нескольких сегментов, каждый из которых соединён с предыдущим. Наша задача — визуализировать положение каждого звена в разных конфигурациях, используя библиотеку matplotlib.pyplot.
Начнём с обязательного импорта и настроек:
import matplotlib.pyplot as plt
import numpy as np
Создадим функцию, которая на основе углов и длин звеньев будет генерировать координаты:
def generate_chain_positions(angles, lengths):
positions = [(0, 0)]
angle_total = 0
for i in range(len(angles)):
angle_total += angles[i]
x = positions[-1][0] + lengths[i] * np.cos(angle_total)
y = positions[-1][1] + lengths[i] * np.sin(angle_total)
positions.append((x, y))
return positions
В этой функции
angles
— список углов (в радианах), а lengths
— длины каждого звена. Мы накапливаем общее смещение по углу (angle_total
), чтобы правильно отрисовать концы звеньев при повороте каждого следующего.Следующая функция займётся отображением цепи:
def draw_chain(positions):
x_coords, y_coords = zip(*positions)
plt.figure(figsize=(6, 6))
plt.plot(x_coords, y_coords, marker='o', linewidth=3, markersize=8)
plt.xlim(-10, 10)
plt.ylim(-10, 10)
plt.gca().set_aspect('equal')
plt.grid(True)
plt.title('Kinematic Chain Visualization')
plt.show()
Теперь соберем всё вместе и поиграемся с разными положениями:
angles1 = [np.pi/6, np.pi/4, -np.pi/3]
lengths = [3, 2.5, 2]
positions1 = generate_chain_positions(angles1, lengths)
draw_chain(positions1)
Вы увидите трёхзвенную цепь, где каждый следующий сегмент под углом относительно предыдущего. Попробуйте изменить углы — например, анимировать движение:
import time
for i in range(10):
angles = [np.pi/6 + i*0.1, np.pi/4 - i*0.05, -np.pi/6 + i*0.07]
positions = generate_chain_positions(angles, lengths)
draw_chain(positions)
time.sleep(0.1)
Это приведёт к простой анимации — не самой плавной, но эффектной.
Зачем всё это? Такие визуализации важны в робототехнике, где тонко настраивается движение манипуляторов, или в разработке игр, где требуется реализовать движение конечностей персонажа. Более того, основа такой цепи может быть применена в аналитике движений (motion capture), симуляциях или обучении нейросетей захвату объектов.
PyPlot — не единственный инструмент, конечно. Но если вы только начинаете осваивать Python и хотите визуализировать свои идеи без сложной 3D-графики, он — отличная стартовая точка.
Играйтесь с углами, добавляйте больше звеньев, усложняйте модели — ведь граница только одна: ваше воображение.
Привет! Сегодня поговорим о том, как использовать PyTest для разработки приложений, связанных с тестированием пользовательского интерфейса. Да-да, PyTest – не только про юнит-тесты и проверку бизнес-логики. С его помощью можно очень удобно организовать тестирование UI, особенно если ты уже используешь Selenium или Playwright.
Когда мы говорим о UI-тестах, первое, что может прийти в голову — это длинные, медленные, хрупкие тесты. Но если подойти к процессу с умом, PyTest превращается в мощный инструмент — с поддержкой фикстур, параметризации, удобной организации кода и настроек. Главное понять, как “подружить” его с UI-инструментами.
Начнем с Selenium. Допустим, ты тестируешь веб-приложение.
Установим все:
pip install pytest selenium
Создаём базовую фикстуру для браузера:
# conftest.py
import pytest
from selenium import webdriver
@pytest.fixture
def browser():
driver = webdriver.Chrome()
yield driver
driver.quit()
Теперь пишем наш первый UI-тест:
# testlogin.py
def testloginform(browser):
browser.get("https://example.com/login")
usernameinput = browser.findelement("name", "username")
passwordinput = browser.findelement("name", "password")
loginbutton = browser.findelement("id", "login")
usernameinput.sendkeys("admin")
passwordinput.sendkeys("123456")
loginbutton.click()
assert "Dashboard" in browser.pagesource
А теперь магия: эти тесты можно запускать, как обычный PyTest-тест, с отчетами, параметрами, фильтрами — как угодно. Если добавить @pytest.mark.parametrize, можно прогнать этот тест с разными значениями логинов/паролей.
PyTest также позволяет внедрить флаг "--headless", чтобы запускать тесты без открытия окна браузера — полезно для CI/CD.
А что насчет Playwright? Это современная альтернатива Selenium, отлично подходящая для UI-тестов. Установим:
pip install pytest-playwright
playwright install
Далее почти всё также. Фреймворк автоматически предоставляет фикстуру 'page':
# testsearch.py
def testsearchfunctionality(page):
page.goto("https://example.com")
page.fill("inputname='q'", "Python")
page.click("buttontype='submit'")
assert page.url.contains("search")
С PyTest и Playwright легко запускать тесты в разных браузерах и окружениях, записывать видео, делать скриншоты при ошибках. Всё это поддерживается “из коробки”.
Ещё один плюс PyTest — структура. Можно группировать тесты по классам, использовать фикстуры для авторизации, навигации, состояния сессии. А если потренироваться, можно автоматически формировать отчёты в формате HTML.
Вывод? PyTest — это не просто способ проверить, делится ли два на два. Это настоящая тестовая платформа, в которую прекрасно вписываются UI-инструменты. С ней удобно, быстро и понятно. А ещё — командная строка для запуска, гибкая конфигурация, расширения (например, pytest-html или pytest-xdist для параллельных прогонов).
Так что, если ты хочешь не просто "тыкать по кнопкам", а делать стабильные и наглядные UI-тесты — PyTest хватает с запасом. Главное — не бояться писать код, даже если ты тестируешь мышкой.
Когда мы говорим о UI-тестах, первое, что может прийти в голову — это длинные, медленные, хрупкие тесты. Но если подойти к процессу с умом, PyTest превращается в мощный инструмент — с поддержкой фикстур, параметризации, удобной организации кода и настроек. Главное понять, как “подружить” его с UI-инструментами.
Начнем с Selenium. Допустим, ты тестируешь веб-приложение.
Установим все:
pip install pytest selenium
Создаём базовую фикстуру для браузера:
# conftest.py
import pytest
from selenium import webdriver
@pytest.fixture
def browser():
driver = webdriver.Chrome()
yield driver
driver.quit()
Теперь пишем наш первый UI-тест:
# testlogin.py
def testloginform(browser):
browser.get("https://example.com/login")
usernameinput = browser.findelement("name", "username")
passwordinput = browser.findelement("name", "password")
loginbutton = browser.findelement("id", "login")
usernameinput.sendkeys("admin")
passwordinput.sendkeys("123456")
loginbutton.click()
assert "Dashboard" in browser.pagesource
А теперь магия: эти тесты можно запускать, как обычный PyTest-тест, с отчетами, параметрами, фильтрами — как угодно. Если добавить @pytest.mark.parametrize, можно прогнать этот тест с разными значениями логинов/паролей.
PyTest также позволяет внедрить флаг "--headless", чтобы запускать тесты без открытия окна браузера — полезно для CI/CD.
А что насчет Playwright? Это современная альтернатива Selenium, отлично подходящая для UI-тестов. Установим:
pip install pytest-playwright
playwright install
Далее почти всё также. Фреймворк автоматически предоставляет фикстуру 'page':
# testsearch.py
def testsearchfunctionality(page):
page.goto("https://example.com")
page.fill("inputname='q'", "Python")
page.click("buttontype='submit'")
assert page.url.contains("search")
С PyTest и Playwright легко запускать тесты в разных браузерах и окружениях, записывать видео, делать скриншоты при ошибках. Всё это поддерживается “из коробки”.
Ещё один плюс PyTest — структура. Можно группировать тесты по классам, использовать фикстуры для авторизации, навигации, состояния сессии. А если потренироваться, можно автоматически формировать отчёты в формате HTML.
Вывод? PyTest — это не просто способ проверить, делится ли два на два. Это настоящая тестовая платформа, в которую прекрасно вписываются UI-инструменты. С ней удобно, быстро и понятно. А ещё — командная строка для запуска, гибкая конфигурация, расширения (например, pytest-html или pytest-xdist для параллельных прогонов).
Так что, если ты хочешь не просто "тыкать по кнопкам", а делать стабильные и наглядные UI-тесты — PyTest хватает с запасом. Главное — не бояться писать код, даже если ты тестируешь мышкой.
Привет, друзья! Сегодня у нас интересная тема — создание настольных приложений с помощью библиотеки PyQt.
Если вы когда-нибудь задумывались: "А как вообще пишут программы с окнами, кнопками и выпадающими списками?" — то добро пожаловать в мир графических интерфейсов. И PyQt — один из самых мощных инструментов для этого в арсенале Python-разработчика.
PyQt — это набор привязок (bindings) к фреймворку Qt, который используют такие крупные приложения, как Dropbox и даже интерфейсы в Autodesk Maya. Он кроссплатформенный, стабильный и безумно гибкий.
Начнем с простого окна. Установка PyQt5:
pip install PyQt5
Теперь создадим базовое окно. Это наш «Hello, world!» в мире GUI:
from PyQt5.QtWidgets import QApplication, QWidget
import sys
app = QApplication(sys.argv)
window = QWidget()
window.setWindowTitle("My First App")
window.resize(300, 200)
window.show()
sys.exit(app.exec())
Здесь QApplication запускает цикл события — сердце любого GUI-приложения. QWidget — это базовый строительный блок интерфейсов. Метод show() делает наше окно видимым.
Теперь добавим кнопку и обработчик события — пусть при нажатии выводится сообщение в терминал:
from PyQt5.QtWidgets import QApplication, QWidget, QPushButton
import sys
def onbuttonclick():
print("Button clicked!")
app = QApplication(sys.argv)
window = QWidget()
window.setWindowTitle("Button Example")
window.resize(300, 200)
button = QPushButton("Click me", window)
button.move(100, 80)
button.clicked.connect(onbuttonclick)
window.show()
sys.exit(app.exec())
Метод connect позволяет связать событие (signal) кнопки с функцией-обработчиком. Все просто и элегантно.
Давайте сделаем еще шаг — добавим поле ввода и выведем текст из него:
from PyQt5.QtWidgets import QApplication, QWidget, QPushButton, QLineEdit, QLabel
import sys
def showtext():
userinput = inputfield.text()
label.setText(f"Hello, {userinput}!")
app = QApplication(sys.argv)
window = QWidget()
window.setWindowTitle("Input Example")
window.resize(300, 150)
inputfield = QLineEdit(window)
inputfield.move(20, 20)
button = QPushButton("Greet", window)
button.move(200, 20)
button.clicked.connect(showtext)
label = QLabel("", window)
label.move(20, 60)
window.show()
sys.exit(app.exec())
Теперь программа реагирует на действия пользователя, как настоящее приложение. При желании можно подключать меню, вкладки, таблицы, диалоги выбора файлов и даже рисовать на холсте. Именно так создаются полноценные графические программы.
Если хочется упорядочить расположение элементов — используйте layout-менеджеры: QVBoxLayout, QHBoxLayout и др. Это избавит от ручного указания координат.
PyQt поддерживает более 100 виджетов, работу со стилями (под капотом Qt Style Sheets — аналог CSS), интеграцию с базами данных, OpenGL, WebEngine и даже анимации.
Минус один — PyQt имеет двойную лицензию, GPL и коммерческую. Если вы планируете продавать своё приложение и делать его закрытым, стоит обратить внимание на Qt for Python (бывший PySide2 или PySide6) — он полностью бесплатен для коммерции.
PyQt — отличный инструмент, чтобы перейти от скриптов к настоящим программам. Он позволяет создавать мощные интерфейсы, не покидая удобный и знакомый Python. Попробуйте — и увидите, насколько это круто.
Если вы когда-нибудь задумывались: "А как вообще пишут программы с окнами, кнопками и выпадающими списками?" — то добро пожаловать в мир графических интерфейсов. И PyQt — один из самых мощных инструментов для этого в арсенале Python-разработчика.
PyQt — это набор привязок (bindings) к фреймворку Qt, который используют такие крупные приложения, как Dropbox и даже интерфейсы в Autodesk Maya. Он кроссплатформенный, стабильный и безумно гибкий.
Начнем с простого окна. Установка PyQt5:
pip install PyQt5
Теперь создадим базовое окно. Это наш «Hello, world!» в мире GUI:
from PyQt5.QtWidgets import QApplication, QWidget
import sys
app = QApplication(sys.argv)
window = QWidget()
window.setWindowTitle("My First App")
window.resize(300, 200)
window.show()
sys.exit(app.exec())
Здесь QApplication запускает цикл события — сердце любого GUI-приложения. QWidget — это базовый строительный блок интерфейсов. Метод show() делает наше окно видимым.
Теперь добавим кнопку и обработчик события — пусть при нажатии выводится сообщение в терминал:
from PyQt5.QtWidgets import QApplication, QWidget, QPushButton
import sys
def onbuttonclick():
print("Button clicked!")
app = QApplication(sys.argv)
window = QWidget()
window.setWindowTitle("Button Example")
window.resize(300, 200)
button = QPushButton("Click me", window)
button.move(100, 80)
button.clicked.connect(onbuttonclick)
window.show()
sys.exit(app.exec())
Метод connect позволяет связать событие (signal) кнопки с функцией-обработчиком. Все просто и элегантно.
Давайте сделаем еще шаг — добавим поле ввода и выведем текст из него:
from PyQt5.QtWidgets import QApplication, QWidget, QPushButton, QLineEdit, QLabel
import sys
def showtext():
userinput = inputfield.text()
label.setText(f"Hello, {userinput}!")
app = QApplication(sys.argv)
window = QWidget()
window.setWindowTitle("Input Example")
window.resize(300, 150)
inputfield = QLineEdit(window)
inputfield.move(20, 20)
button = QPushButton("Greet", window)
button.move(200, 20)
button.clicked.connect(showtext)
label = QLabel("", window)
label.move(20, 60)
window.show()
sys.exit(app.exec())
Теперь программа реагирует на действия пользователя, как настоящее приложение. При желании можно подключать меню, вкладки, таблицы, диалоги выбора файлов и даже рисовать на холсте. Именно так создаются полноценные графические программы.
Если хочется упорядочить расположение элементов — используйте layout-менеджеры: QVBoxLayout, QHBoxLayout и др. Это избавит от ручного указания координат.
PyQt поддерживает более 100 виджетов, работу со стилями (под капотом Qt Style Sheets — аналог CSS), интеграцию с базами данных, OpenGL, WebEngine и даже анимации.
Минус один — PyQt имеет двойную лицензию, GPL и коммерческую. Если вы планируете продавать своё приложение и делать его закрытым, стоит обратить внимание на Qt for Python (бывший PySide2 или PySide6) — он полностью бесплатен для коммерции.
PyQt — отличный инструмент, чтобы перейти от скриптов к настоящим программам. Он позволяет создавать мощные интерфейсы, не покидая удобный и знакомый Python. Попробуйте — и увидите, насколько это круто.
Создание собственного чат-бота звучит как магия будущего, но в Python это может быть делом буквально нескольких десятков строк. Сегодня я расскажу тебе о библиотеке ChatterBot — простом инструменте для обучения и создания диалоговых систем. Даже начинающий программист может собрать своего виртуального собеседника за вечер. Поехали!
Что такое ChatterBot?
ChatterBot — это Python-библиотека, которая позволяет создавать самообучающиеся чат-боты. Она использует алгоритмы машинного обучения для генерации ответов, основываясь на примерах диалогов. Бот анализирует входящие сообщения и подбирает наиболее уместный ответ из своей базы знаний.
Установка
Для начала нужно установить библиотеку (лучше в отдельном виртуальном окружении):
pip install chatterbot==1.0.5
pip install chatterbotcorpus
Внимание: ChatterBot не обновлялся с 2020 года, так что он может не поддерживаться в будущих версиях Python. Точная работа гарантирована, например, на Python 3.8.
Создание простого чат-бота
Начнем с минимального примера:
from chatterbot import ChatBot
from chatterbot.trainers import ChatterBotCorpusTrainer
chatbot = ChatBot('SimpleBot')
trainer = ChatterBotCorpusTrainer(chatbot)
trainer.train('chatterbot.corpus.english')
response = chatbot.getresponse("Hello, how are you?")
print(response)
Что тут происходит:
- Создаем экземпляр ChatBot с именем 'SimpleBot'.
- Используем ChatterBotCorpusTrainer для обучения бота на встроенных английских диалогах из chatterbotcorpus.
- После тренировки бот уже может отвечать на простые приветствия и бытовые фразы.
Добавим свои реплики
Корпус англоязычных диалогов — это хорошо, но что если мы хотим научить бота специальной тематике или стилю?
from chatterbot.trainers import ListTrainer
customdialogue =
"Hi",
"Hello there!",
"What is your name?",
"My name is CodeBot.",
"What do you do?",
"I help you write Python code."
trainer = ListTrainer(chatbot)
trainer.train(customdialogue)
Теперь бот сможет отвечать в стиле, заданном нами. Это особенно полезно для создания узкоспециализированных ботов: техподдержка, FAQ, помощник для онлайн-курса.
Улучшение правдоподобия
ChatterBot использует механизм сравнения строк и выбор наиболее похожего ответа. Но чтобы бот звучал чуть умнее, его нужно «кормить» большим количеством похожих на реальную переписку диалогов.
Можно комбинировать:
- Стандартные корпуса: greetings, conversations, computers и другие из chatterbotcorpus.
- Свои цепочки реплик: списки на ListTrainer.
Также можно подключить логирование:
import logging
logging.basicConfig(level=logging.INFO)
Так ты сможешь видеть, как бот принимает решения при выборе ответа.
Ограничения
Стоит помнить, что ChatterBot — не инструмент для создания суперумных ботов уровня GPT. Он не понимает смысл текста, не использует нейросети (только локальное машинное обучение), и плохо справляется с генерализацией вне обученной логики. Но как вводная платформа — он отличен. Хочешь создать Telegram-бота с ChatterBot внутри? Пожалуйста. Нужно сделать чат-бота для сайта с базовым FAQ? Тоже не проблема.
Заключение
ChatterBot — это замечательный способ начать работать с чат-ботами на Python. Он прост, открыт, легко расширяется. Конечно, у него есть ограничения, но для знакомства с темой и несложных задач — он как находка.
Будь то ваш первый бот-помощник или просто эксперимент для новых знаний — попробуйте создать свою версию и пообщайтесь с ней. А вдруг она окажется интереснее некоторых людей?
Что такое ChatterBot?
ChatterBot — это Python-библиотека, которая позволяет создавать самообучающиеся чат-боты. Она использует алгоритмы машинного обучения для генерации ответов, основываясь на примерах диалогов. Бот анализирует входящие сообщения и подбирает наиболее уместный ответ из своей базы знаний.
Установка
Для начала нужно установить библиотеку (лучше в отдельном виртуальном окружении):
pip install chatterbot==1.0.5
pip install chatterbotcorpus
Внимание: ChatterBot не обновлялся с 2020 года, так что он может не поддерживаться в будущих версиях Python. Точная работа гарантирована, например, на Python 3.8.
Создание простого чат-бота
Начнем с минимального примера:
from chatterbot import ChatBot
from chatterbot.trainers import ChatterBotCorpusTrainer
chatbot = ChatBot('SimpleBot')
trainer = ChatterBotCorpusTrainer(chatbot)
trainer.train('chatterbot.corpus.english')
response = chatbot.getresponse("Hello, how are you?")
print(response)
Что тут происходит:
- Создаем экземпляр ChatBot с именем 'SimpleBot'.
- Используем ChatterBotCorpusTrainer для обучения бота на встроенных английских диалогах из chatterbotcorpus.
- После тренировки бот уже может отвечать на простые приветствия и бытовые фразы.
Добавим свои реплики
Корпус англоязычных диалогов — это хорошо, но что если мы хотим научить бота специальной тематике или стилю?
from chatterbot.trainers import ListTrainer
customdialogue =
"Hi",
"Hello there!",
"What is your name?",
"My name is CodeBot.",
"What do you do?",
"I help you write Python code."
trainer = ListTrainer(chatbot)
trainer.train(customdialogue)
Теперь бот сможет отвечать в стиле, заданном нами. Это особенно полезно для создания узкоспециализированных ботов: техподдержка, FAQ, помощник для онлайн-курса.
Улучшение правдоподобия
ChatterBot использует механизм сравнения строк и выбор наиболее похожего ответа. Но чтобы бот звучал чуть умнее, его нужно «кормить» большим количеством похожих на реальную переписку диалогов.
Можно комбинировать:
- Стандартные корпуса: greetings, conversations, computers и другие из chatterbotcorpus.
- Свои цепочки реплик: списки на ListTrainer.
Также можно подключить логирование:
import logging
logging.basicConfig(level=logging.INFO)
Так ты сможешь видеть, как бот принимает решения при выборе ответа.
Ограничения
Стоит помнить, что ChatterBot — не инструмент для создания суперумных ботов уровня GPT. Он не понимает смысл текста, не использует нейросети (только локальное машинное обучение), и плохо справляется с генерализацией вне обученной логики. Но как вводная платформа — он отличен. Хочешь создать Telegram-бота с ChatterBot внутри? Пожалуйста. Нужно сделать чат-бота для сайта с базовым FAQ? Тоже не проблема.
Заключение
ChatterBot — это замечательный способ начать работать с чат-ботами на Python. Он прост, открыт, легко расширяется. Конечно, у него есть ограничения, но для знакомства с темой и несложных задач — он как находка.
Будь то ваш первый бот-помощник или просто эксперимент для новых знаний — попробуйте создать свою версию и пообщайтесь с ней. А вдруг она окажется интереснее некоторых людей?
Ты хочешь, чтобы твой Python-скрипт сообщил всем в Twitter, что ты пьешь утренний кофе? Или, может, каждый день в 9:00 выкладывал мудрую цитату? Что ж, пора познакомиться с одним из самых интересных практических аспектов Python — работой с Twitter API.
Да, Twitter (точнее, X) предоставляет открытое API, к которому можно обращаться через HTTP-запросы. А в Python есть готовые удобные библиотеки, которые позволяют сэкономить массу времени. Наш выбор — Tweepy. Это легковесная и популярная обёртка для Twitter API.
Первым делом — регистрация приложения в консоли разработчика Twitter (https://developer.twitter.com/). После этого вы получите четыре ключевых параметра: API key, API key secret, Access token и Access token secret. Без них не получится выполнять ни одного запроса.
Устанавливаем tweepy:
Теперь — сам код. Простой скрипт, который публикует статус:
Всё. Этот код опубликует твит от имени пользователя, чьи токены ты указал. Серьёзно, всего несколько строк — и ты уже автоматизируешь публикации.
А что насчёт автоматизации по расписанию? Тут пригодится модуль schedule:
Пример: публиковать сообщение каждый день в определённое время:
Можно не ограничиваться текстами. С помощью Tweepy можно прикреплять изображения или даже видео — лишь бы придерживаться формата Twitter и не превышать лимитов.
Кстати, не забывайте о rate limits: Twitter не позволит вам публиковать тысячи твитов в час. Ознакомьтесь с документацией — там всё чётко расписано.
Интересный трюк: создайте JSON-файл с массивом строк, которые бот будет публиковать случайным образом. Чуть-чуть random, чуть-чуть json — и уже почти интеллектуальный твиттер-агент!
В следующем шаге можно добавить реакцию на события. Например, бот отслеживает определённый хэштег — и отвечает на твиты в реальном времени. Сам Tweepy поддерживает stream-интерфейс, что делает это вполне реализуемым даже для новичка.
Работа с Twitter API — отличный способ почувствовать себя разработчиком "боевого" кода. Это не учебные задачи, это реальная интеграция, которая живёт в сети и взаимодействует с другими людьми. Причём на языке Python, который прекрасно справляется с такими задачами: лаконично, красиво и надёжно.
Да, Twitter (точнее, X) предоставляет открытое API, к которому можно обращаться через HTTP-запросы. А в Python есть готовые удобные библиотеки, которые позволяют сэкономить массу времени. Наш выбор — Tweepy. Это легковесная и популярная обёртка для Twitter API.
Первым делом — регистрация приложения в консоли разработчика Twitter (https://developer.twitter.com/). После этого вы получите четыре ключевых параметра: API key, API key secret, Access token и Access token secret. Без них не получится выполнять ни одного запроса.
Устанавливаем tweepy:
pip install tweepy
Теперь — сам код. Простой скрипт, который публикует статус:
import tweepy
api_key = "YOUR_API_KEY"
api_secret = "YOUR_API_SECRET"
access_token = "YOUR_ACCESS_TOKEN"
access_secret = "YOUR_ACCESS_SECRET"
auth = tweepy.OAuth1UserHandler(api_key, api_secret, access_token, access_secret)
api = tweepy.API(auth)
status_text = "Доброе утро, Twitter! #python"
api.update_status(status=status_text)
Всё. Этот код опубликует твит от имени пользователя, чьи токены ты указал. Серьёзно, всего несколько строк — и ты уже автоматизируешь публикации.
А что насчёт автоматизации по расписанию? Тут пригодится модуль schedule:
pip install schedule
Пример: публиковать сообщение каждый день в определённое время:
import schedule
import time
import tweepy
def post_daily_status():
status_text = "Автоматическое утро: солнце, Python и немного кофе. ☕ #GoodMorning"
api.update_status(status=status_text)
auth = tweepy.OAuth1UserHandler(api_key, api_secret, access_token, access_secret)
api = tweepy.API(auth)
schedule.every().day.at("09:00").do(post_daily_status)
while True:
schedule.run_pending()
time.sleep(30)
Можно не ограничиваться текстами. С помощью Tweepy можно прикреплять изображения или даже видео — лишь бы придерживаться формата Twitter и не превышать лимитов.
Кстати, не забывайте о rate limits: Twitter не позволит вам публиковать тысячи твитов в час. Ознакомьтесь с документацией — там всё чётко расписано.
Интересный трюк: создайте JSON-файл с массивом строк, которые бот будет публиковать случайным образом. Чуть-чуть random, чуть-чуть json — и уже почти интеллектуальный твиттер-агент!
В следующем шаге можно добавить реакцию на события. Например, бот отслеживает определённый хэштег — и отвечает на твиты в реальном времени. Сам Tweepy поддерживает stream-интерфейс, что делает это вполне реализуемым даже для новичка.
Работа с Twitter API — отличный способ почувствовать себя разработчиком "боевого" кода. Это не учебные задачи, это реальная интеграция, которая живёт в сети и взаимодействует с другими людьми. Причём на языке Python, который прекрасно справляется с такими задачами: лаконично, красиво и надёжно.
X
Use Cases, Tutorials, & Documentation
Publish & analyze posts, optimize ads, & create unique customer experiences with the X API, X Ads API, & X Embeds.
👍1
Когда слышишь «3D-графика на Python», первое, что приходит в голову — это что-то громоздкое и сложное, с кучей зависимостей и километрами кода. Однако библиотека Pyglet ломает этот стереотип: она позволяет создавать 3D-сцены прямо в Python без плясок с бубном и внешних движков.
Pyglet — это чистая библиотека на Python для создания мультимедийных приложений, таких как игры и визуализации. Она предоставляет доступ к OpenGL напрямую, что делает её отличным инструментом для работы с 3D.
Начнем с самого простого — создадим окно и отрисуем внутри него 3D-объект. Для этого нам понадобится pyglet и немного OpenGL-магии, которая прячется внутри модуля pyglet.gl.
Пример создания окна и вращающегося куба:
Запуская этот код, вы увидите вращающийся во все стороны цветной куб. Секрет прост: pyglet предоставляет окно и событийный цикл, OpenGL отвечает за математику и отрисовку граней.
Важно: Pyglet не делает абстракций уровнем выше, как это делают движки — если хочешь тени, освещение, текстуры или камеры — всё ты делаешь своими руками. Это и плюс, и вызов: ты лучше понимаешь, что происходит «под капотом», но должен быть готов разобраться с OpenGL-терминами вроде матриц и вершин.
Pyglet также хорош тем, что позволяет подключать шрифты, музыку, текстуры и многое другое буквально одной строкой. Хочешь навесить текстуру на куб? Просто подгрузи изображение через pyglet.image и добавь его при рендере.
Итог. Pyglet — удобная песочница для 3D-экспериментов, особенно если ты хочешь изучить основы OpenGL, не вылезая из Python. Не самый быстрый путь к полноценной игре, но отличный шаг к пониманию графики изнутри.
Pyglet — это чистая библиотека на Python для создания мультимедийных приложений, таких как игры и визуализации. Она предоставляет доступ к OpenGL напрямую, что делает её отличным инструментом для работы с 3D.
Начнем с самого простого — создадим окно и отрисуем внутри него 3D-объект. Для этого нам понадобится pyglet и немного OpenGL-магии, которая прячется внутри модуля pyglet.gl.
Пример создания окна и вращающегося куба:
import pyglet
from pyglet.gl import *
import math
window = pyglet.window.Window(800, 600, "3D Cube with Pyglet", resizable=True)
rotation = 0
@window.event
def on_draw():
global rotation
window.clear()
# Настройка 3D-проекции
glMatrixMode(GL_PROJECTION)
glLoadIdentity()
gluPerspective(65, window.width / window.height, 0.1, 100)
glMatrixMode(GL_MODELVIEW)
glLoadIdentity()
glTranslatef(0, 0, -5)
glRotatef(rotation, 1, 1, 0)
draw_cube()
def draw_cube():
glBegin(GL_QUADS)
# Front face (red)
glColor3f(1, 0, 0)
glVertex3f(-1, -1, 1)
glVertex3f( 1, -1, 1)
glVertex3f( 1, 1, 1)
glVertex3f(-1, 1, 1)
# Back face (green)
glColor3f(0, 1, 0)
glVertex3f(-1, -1, -1)
glVertex3f(-1, 1, -1)
glVertex3f( 1, 1, -1)
glVertex3f( 1, -1, -1)
# Top face (blue)
glColor3f(0, 0, 1)
glVertex3f(-1, 1, -1)
glVertex3f(-1, 1, 1)
glVertex3f( 1, 1, 1)
glVertex3f( 1, 1, -1)
# Bottom face (yellow)
glColor3f(1, 1, 0)
glVertex3f(-1, -1, -1)
glVertex3f( 1, -1, -1)
glVertex3f( 1, -1, 1)
glVertex3f(-1, -1, 1)
# Right face (cyan)
glColor3f(0, 1, 1)
glVertex3f( 1, -1, -1)
glVertex3f( 1, 1, -1)
glVertex3f( 1, 1, 1)
glVertex3f( 1, -1, 1)
# Left face (magenta)
glColor3f(1, 0, 1)
glVertex3f(-1, -1, -1)
glVertex3f(-1, -1, 1)
glVertex3f(-1, 1, 1)
glVertex3f(-1, 1, -1)
glEnd()
def update(dt):
global rotation
rotation += 50 * dt
pyglet.clock.schedule(update)
pyglet.app.run()
Запуская этот код, вы увидите вращающийся во все стороны цветной куб. Секрет прост: pyglet предоставляет окно и событийный цикл, OpenGL отвечает за математику и отрисовку граней.
Важно: Pyglet не делает абстракций уровнем выше, как это делают движки — если хочешь тени, освещение, текстуры или камеры — всё ты делаешь своими руками. Это и плюс, и вызов: ты лучше понимаешь, что происходит «под капотом», но должен быть готов разобраться с OpenGL-терминами вроде матриц и вершин.
Pyglet также хорош тем, что позволяет подключать шрифты, музыку, текстуры и многое другое буквально одной строкой. Хочешь навесить текстуру на куб? Просто подгрузи изображение через pyglet.image и добавь его при рендере.
Итог. Pyglet — удобная песочница для 3D-экспериментов, особенно если ты хочешь изучить основы OpenGL, не вылезая из Python. Не самый быстрый путь к полноценной игре, но отличный шаг к пониманию графики изнутри.
🔥2👍1🥰1
Когда вы пишете веб-приложение на Python, рано или поздно возникает вопрос: «А как всё это запускать в продакшене?». Просто сказать
Что такое Gunicorn?
Gunicorn (Green Unicorn) — это предварительно форкающий WSGI-сервер. Простыми словами, он запускает основное приложение и создаёт дочерние процессы (воркеры), что обеспечивает параллельную обработку запросов. Это даёт выигрыш в производительности и отказоустойчивости.
Начнём с установки:
Допустим, у вас простой Flask-приложение:
Чтобы запустить это приложение через Gunicorn:
Здесь
По умолчанию Gunicorn запускает 1 воркер. Можно указать больше:
На сколько воркеров стоит ориентироваться?
Рекомендуется: количество ядер × 2 + 1. Например, если у вас 2 ядра, оптимально использовать 5 воркеров. Это обеспечит хорошую параллельность.
Gunicorn поддерживает разные типы воркеров. Например,
Добавим логирование (чтобы понимать, что происходит при сбоях и нагрузке):
Для надёжной работы в продакшене Gunicorn лучше не запускать как самостоятельный процесс, а обернуть его в процесс-менеджер. Например,
Конфигурировать Gunicorn можно двумя способами:
1. Через аргументы командной строки (как выше);
2. Через Python-конфигурационный файл:
А запустить всё так:
Если у вас Django-проект, запуск чуть другой:
Итого: Gunicorn — это ключевой компонент деплоя Python-приложения. Он лёгкий, быстрый, гибкий и замечательно работает с современными фреймворками. Настроив его один раз, можно забыть о приставке “dev server” и перейти на серьёзный уровень — стабильный, отказоустойчивый, боевой.
python my_app.py
— недостаточно. Нужен настоящий сервер, способный обрабатывать множество запросов, управлять процессами и не «падать» при первом чихе. Тут на сцену выходит Gunicorn — подходящий инструмент для развёртывания серверных приложений на Python, особенно тех, что используют WSGI (например, Flask или Django).Что такое Gunicorn?
Gunicorn (Green Unicorn) — это предварительно форкающий WSGI-сервер. Простыми словами, он запускает основное приложение и создаёт дочерние процессы (воркеры), что обеспечивает параллельную обработку запросов. Это даёт выигрыш в производительности и отказоустойчивости.
Начнём с установки:
pip install gunicorn
Допустим, у вас простой Flask-приложение:
# app.py
from flask import Flask
app = Flask(__name__)
@app.route("/")
def hello_world():
return "Hello from Gunicorn!"
Чтобы запустить это приложение через Gunicorn:
gunicorn app:app
Здесь
app:app
означает: импортируй из модуля app
переменную app
, которая представляет собой Flask-приложение.По умолчанию Gunicorn запускает 1 воркер. Можно указать больше:
gunicorn app:app --workers 4
На сколько воркеров стоит ориентироваться?
Рекомендуется: количество ядер × 2 + 1. Например, если у вас 2 ядра, оптимально использовать 5 воркеров. Это обеспечит хорошую параллельность.
Gunicorn поддерживает разные типы воркеров. Например,
sync
— по умолчанию, gevent
— для асинхронных задач:gunicorn app:app -k gevent --workers 4
Добавим логирование (чтобы понимать, что происходит при сбоях и нагрузке):
gunicorn app:app --access-logfile access.log --error-logfile error.log
Для надёжной работы в продакшене Gunicorn лучше не запускать как самостоятельный процесс, а обернуть его в процесс-менеджер. Например,
systemd
(если речь идёт о Linux-сервере), или вы можете использовать supervisor
.Конфигурировать Gunicorn можно двумя способами:
1. Через аргументы командной строки (как выше);
2. Через Python-конфигурационный файл:
# gunicorn_config.py
bind = "0.0.0.0:8000"
workers = 4
accesslog = "access.log"
errorlog = "error.log"
А запустить всё так:
gunicorn app:app -c gunicorn_config.py
Если у вас Django-проект, запуск чуть другой:
gunicorn myproject.wsgi:application
Итого: Gunicorn — это ключевой компонент деплоя Python-приложения. Он лёгкий, быстрый, гибкий и замечательно работает с современными фреймворками. Настроив его один раз, можно забыть о приставке “dev server” и перейти на серьёзный уровень — стабильный, отказоустойчивый, боевой.
Контейнеризация с Docker: как Python-проекты обретают суперсилу
Если вы когда-либо разворачивали Python-проект "голыми руками" — на сыром сервере, с настройкой окружения, системными пакетами, разрушающими зависимости, и мистическими багами, которые возникают только в "бою", то Docker для вас — как спасательный круг для утопающего.
Контейнеризация — это не просто модный термин, а реальное решение извечных проблем с "у меня работает". И для Python-проектов она особенно ценна.
Представим типичную ситуацию: у команды есть несколько микросервисов на Python — один парсит веб-сайты, второй обрабатывает данные, третий отдает API. Каждый использует разные версии библиотек, системных зависимостей, переменных окружения. Проблема номер один — воспроизводимость. Без Docker попытка развернуть всё это на сервере превращается в танцы с бубном.
С Docker каждый микросервис получает своё изолированное окружение. У вас есть Dockerfile — рецепт, по которому собирается образ: нужная версия Python, точные зависимости из requirements.txt, переменные, команды запуска. Команда docker build — и у вас готовый артефакт, который будет одинаково работать на разработке, в CI/CD или на проде.
Пример:
// Dockerfile
FROM python:3.10-slim
WORKDIR /app
COPY requirements.txt .
RUN pip install -r requirements.txt
COPY . .
CMD "python", "main.py"
Это — вся магия запуска Python-приложения в изоляции. Никакого "где искать libxml2", никаких конфликтов версий pip или глобального Python.
Ещё одна суперспособность Docker — масштабирование. Например, для обработки миллионов задач вы запускаете несколько контейнеров с celery worker'ами. Они берут задачи из Redis, обрабатывают в параллели, и масштабируются по нагрузке. Не нужен отдельный сервер, просто запускаете больше контейнеров — и всё.
Также Docker незаменим в CI/CD. При пуше в Git ваш пайплайн может собрать Docker-образ, прогнать тесты в контейнере, и задеплоить его на сервер или в Kubernetes. Весь путь — от кода до продакшена — автоматизирован и стабилен.
А как насчет разработки? Docker позволяет создать docker-compose.yml, где в одном файле описываются все сервисы: база данных, бекенд, очереди, фронт — всё запускается одной командой docker-compose up. Нужно PostgreSQL для разработки? Просто добавьте:
services:
db:
image: postgres:14
environment:
POSTGRESUSER: user
POSTGRESPASSWORD: pass
И вы работаете с полноценной базой в пару кликов.
Контейнеры решают задачи не только инфраструктуры, но и тестирования. Вы можете запускать юнит-тесты в izолированном контейнере, чтобы быть уверенным: никакие артефакты системы не влияют на поведение кода.
И наконец, контейнеризация — это комфорт и уверенность. Ваш Python-код живёт в предсказуемом, управляемом окружении. Вы точно знаете, как он будет работать, и можете легко обновлять, переносить и масштабировать свой проект.
Docker стал неотъемлемой частью современного Python-стека. Он не делает код лучше, но делает работу с кодом — быстрее, стабильнее и безопаснее. А это уже немалый шаг к зрелой разработке.
Если вы когда-либо разворачивали Python-проект "голыми руками" — на сыром сервере, с настройкой окружения, системными пакетами, разрушающими зависимости, и мистическими багами, которые возникают только в "бою", то Docker для вас — как спасательный круг для утопающего.
Контейнеризация — это не просто модный термин, а реальное решение извечных проблем с "у меня работает". И для Python-проектов она особенно ценна.
Представим типичную ситуацию: у команды есть несколько микросервисов на Python — один парсит веб-сайты, второй обрабатывает данные, третий отдает API. Каждый использует разные версии библиотек, системных зависимостей, переменных окружения. Проблема номер один — воспроизводимость. Без Docker попытка развернуть всё это на сервере превращается в танцы с бубном.
С Docker каждый микросервис получает своё изолированное окружение. У вас есть Dockerfile — рецепт, по которому собирается образ: нужная версия Python, точные зависимости из requirements.txt, переменные, команды запуска. Команда docker build — и у вас готовый артефакт, который будет одинаково работать на разработке, в CI/CD или на проде.
Пример:
// Dockerfile
FROM python:3.10-slim
WORKDIR /app
COPY requirements.txt .
RUN pip install -r requirements.txt
COPY . .
CMD "python", "main.py"
Это — вся магия запуска Python-приложения в изоляции. Никакого "где искать libxml2", никаких конфликтов версий pip или глобального Python.
Ещё одна суперспособность Docker — масштабирование. Например, для обработки миллионов задач вы запускаете несколько контейнеров с celery worker'ами. Они берут задачи из Redis, обрабатывают в параллели, и масштабируются по нагрузке. Не нужен отдельный сервер, просто запускаете больше контейнеров — и всё.
Также Docker незаменим в CI/CD. При пуше в Git ваш пайплайн может собрать Docker-образ, прогнать тесты в контейнере, и задеплоить его на сервер или в Kubernetes. Весь путь — от кода до продакшена — автоматизирован и стабилен.
А как насчет разработки? Docker позволяет создать docker-compose.yml, где в одном файле описываются все сервисы: база данных, бекенд, очереди, фронт — всё запускается одной командой docker-compose up. Нужно PostgreSQL для разработки? Просто добавьте:
services:
db:
image: postgres:14
environment:
POSTGRESUSER: user
POSTGRESPASSWORD: pass
И вы работаете с полноценной базой в пару кликов.
Контейнеры решают задачи не только инфраструктуры, но и тестирования. Вы можете запускать юнит-тесты в izолированном контейнере, чтобы быть уверенным: никакие артефакты системы не влияют на поведение кода.
И наконец, контейнеризация — это комфорт и уверенность. Ваш Python-код живёт в предсказуемом, управляемом окружении. Вы точно знаете, как он будет работать, и можете легко обновлять, переносить и масштабировать свой проект.
Docker стал неотъемлемой частью современного Python-стека. Он не делает код лучше, но делает работу с кодом — быстрее, стабильнее и безопаснее. А это уже немалый шаг к зрелой разработке.
Иногда меньше — это больше. Особенно, когда речь заходит о матрицах, в которых абсолютное большинство элементов равны нулю. Такие матрицы называются разреженными (sparse), и если хранить их как обычные двумерные массивы в NumPy, то можно легко потратить кучу памяти впустую. Вот тут на сцену выходит библиотека SciPy с модулем scipy.sparse — быстрым, компактным и удобным инструментом для работы с разреженными матрицами.
Разреженные матрицы часто встречаются в машинном обучении, при обработке графов, работе с текстами в виде "мешка слов" и моделировании физических процессов. В SciPy есть несколько форматов хранения разреженных матриц. Рассмотрим самые ходовые.
Начнем с Compressed Sparse Row (CSR) — формат, удобный для быстрого умножения матриц и извлечения строк.
Пример:
Вывод:
Для сравнения, обычная матрица размером 10000x10000 потребляет почти 800 МБ памяти. А если в ней всего 0.01% ненулевых элементов, то разреженное представление на тех же данных использует минимум ресурсов.
Следующий формат — Compressed Sparse Column (CSC), оптимален для извлечения по столбцам. Создать такую матрицу можно просто вызвав
Еще один полезный тип — LIL (List of Lists). Он хорош для пошагового добавления элементов:
После наполнения её удобно конвертировать в CSR или CSC для дальнейших операций:
Хотите работать с матрицами как с NumPy? Легко. Многие операции поддерживаются напрямую: сложение, умножение, транспонирование, извлечение подматриц. Но важно помнить: несмотря на общее API, sparse-матрицы — это не обычные ndarray. Прямой доступ к элементам может быть менее производителен, а вызовы типа
Узнать плотность матрицы просто:
Если результат меньше 0.01 — вы точно всё делаете правильно.
SciPy позволяет даже решать системы линейных уравнений и выполнять разложение sparse-матриц. Например:
Зачем использовать SciPy для редких данных? Потому что компактность, эффективность и удобство — это ключ к хорошей производительности. Когда ваш датасет вмещается целиком в кэш процессора, даже самые тяжёлые задачи идут налегке.
Так что если ваши матрицы — это в основном нули, не спешите забивать ими память. SciPy.sparse превращает недостаток в преимущество.
Разреженные матрицы часто встречаются в машинном обучении, при обработке графов, работе с текстами в виде "мешка слов" и моделировании физических процессов. В SciPy есть несколько форматов хранения разреженных матриц. Рассмотрим самые ходовые.
Начнем с Compressed Sparse Row (CSR) — формат, удобный для быстрого умножения матриц и извлечения строк.
Пример:
from scipy.sparse import csr_matrix
data = [1, 2, 3]
rows = [0, 1, 2]
cols = [2, 0, 1]
sparse_matrix = csr_matrix((data, (rows, cols)), shape=(3, 3))
print(sparse_matrix)
Вывод:
(0, 2) 1
(1, 0) 2
(2, 1) 3
Для сравнения, обычная матрица размером 10000x10000 потребляет почти 800 МБ памяти. А если в ней всего 0.01% ненулевых элементов, то разреженное представление на тех же данных использует минимум ресурсов.
Следующий формат — Compressed Sparse Column (CSC), оптимален для извлечения по столбцам. Создать такую матрицу можно просто вызвав
.tocsc()
у CSR:csc_example = sparse_matrix.tocsc()
Еще один полезный тип — LIL (List of Lists). Он хорош для пошагового добавления элементов:
from scipy.sparse import lil_matrix
matrix_lil = lil_matrix((3, 3))
matrix_lil[0, 1] = 5
matrix_lil[1, 2] = 8
print(matrix_lil)
После наполнения её удобно конвертировать в CSR или CSC для дальнейших операций:
matrix_final = matrix_lil.tocsr()
Хотите работать с матрицами как с NumPy? Легко. Многие операции поддерживаются напрямую: сложение, умножение, транспонирование, извлечение подматриц. Но важно помнить: несмотря на общее API, sparse-матрицы — это не обычные ndarray. Прямой доступ к элементам может быть менее производителен, а вызовы типа
.toarray()
тянут действительную матрицу в память — осторожно с большими массивами!Узнать плотность матрицы просто:
density = sparse_matrix.count_nonzero() / (sparse_matrix.shape[0] * sparse_matrix.shape[1])
print(f"Density: {density:.6f}")
Если результат меньше 0.01 — вы точно всё делаете правильно.
SciPy позволяет даже решать системы линейных уравнений и выполнять разложение sparse-матриц. Например:
from scipy.sparse.linalg import spsolve
A = csr_matrix([[3, 0, 1], [0, 4, 0], [1, 0, 2]])
b = [5, 8, 5]
x = spsolve(A, b)
print(x)
Зачем использовать SciPy для редких данных? Потому что компактность, эффективность и удобство — это ключ к хорошей производительности. Когда ваш датасет вмещается целиком в кэш процессора, даже самые тяжёлые задачи идут налегке.
Так что если ваши матрицы — это в основном нули, не спешите забивать ими память. SciPy.sparse превращает недостаток в преимущество.