Репозиторий содержит расширенные возможности языка Python версии 3.7 и выше (Reviewed on 3.11).
Проекты данного репозитория охватывают:
- ООП. Классы: ассоциация
- ООП. Классы: наследование
- ООП. Классы: абстрактный класс и интерфейс
- Парсинг html-данных: BeautifulSoup
- Работа с БД sqlite
- Использование ORM: SQLAlchemy
- Работа с БД MongoDB
Понятие класса, его членов, а также объектов и вложенных объектов
Проект эмулирует перемешивание игральной карточной колоды (52 карты). Требуется вывести отсортированную колоду карт, перемешать ее и вывести перемешанную.
Class Card (карта):
- конструктор
__init__(self, suit, rank)создает объект карты - переопределенный метод
__str__(self)выводит имя карты, например "jack of hearts"
Class Deck (колода):
- содержит два поля (списки) ранга и масти карты
- конструктор
__init__(self)создает объект колоды: список 52 объектов класса Card - метод
shuffle(self)перемешивает карты в колоде с использованием модуля random - переопределенный метод
__str__(self)выводит список карт в колоде
Диаграмма классов:
Понятие наследования. Переопределение методов родительского класса
Проект определяет иерархию классов и переиспользование методов родительских классов (в Python не требуется объявлять методы виртуальными).
Class Shape (фигура):
- 3 поля по умоланию (potected): имя фигурыe, площадь и периметр
- метод
ComputePerim(self)virtual-like (для переопределения в классе-наследнике) - необязателен - метод
ComputeArea(self)virtual-like (для переопределения в классе-наследнике) - необязателен - переопределенный метод
__str__(self)выводит имя фигуры и вычисленные площадь и периметр
Class Circle (круг):
- наследник класса Shape
- конструктор
__init__(self, radius)задает радиус круга - overrided method
ComputePerim(self)вычисляет длину окружности - overrided method
ComputeArea(self)вычисляет площадь круга
Class Rectangle (прямоугольник):
- наследник класса Shape
- конструктор
__init__(self, width, height)задает ширину и высоту прямоугольника - переопределенный метод
ComputePerim(self)вычисляет периметр прямоугольника - переопределенный метод
ComputeArea(self)вычисляет площадь прямоугольника
Class Square (квадрат):
- наследник класса Rectangle
- конструктор
__init__(self, width)задает сторону квадрата и вызывает конструктор родительского класса (constructor chaining).
Понятие абстрактного класса. Обязательное переопределение методов абстрактного класса. Использование свойств.
Данный проект и UML-диаграмма были взяты из примера для C#/Java, чтобы провести аналогию между ООП подходом в Python и C#/Java. Понятие интерфейса в Python излишне: Python использует множественное наследование, а C#/Java - одиночное. Пример с интерфейсом включен в проект только в качестве лабораторного примера.
Модуль ABC (abstract class) входит в Python Standart Library. Для интерфейсов можно использовать модуль zope.
pip install zopeClass HotDrink (абстрактный, напиток):
from abc import ABC, abstractmethod- 2 защищенных поля: milk = 3, sugar = 3 (значения по умолчанию для классов-наследниов)
- 2 абстратных свойства: Milk, Sugar
- 3 абстратных метода: AddMilk, AddSugar, Drink
- все члены класса с атрибутом декоратора
@abstractmethodДОЛЖНЫ быть переопределены в классах-наследниках.
Interface ICup (интерфейс, емкость):
from zope.interface import Interface, Attribute- 2 свойства
- 2 метода
Class CupOfCoffee (чашка кофе):
- реализует интерфейс ICup
- наследник абстрактного класса HotDrink
- определяет собственное свойство BeanType: arabica или robusta
@implementer(ICup)
class CupOfCoffee(HotDrink):
passClass CupOfTea:
- реализует интерфейс ICup
- наследник абстрактного класса HotDrink
- определяет собственное свойство LeafType: green или black
@implementer(ICup)
class CupOfTea(HotDrink):
passBeautifulSoup + static content
Парсинг календаря полнолуний fullmoon.info web site за 150 лет. Каждый год с данными о полнолуниях отображается на отдельной странице:https://www.fullmoon.info/en/fullmoon-calendar/X, где X - год от 1900 до 2050.
Записать данные в текстовый файл
Записать данные в таблицу БД sqlite
- Установка библиотек:
pip install beautifulsoup4
pip install requestsBeautiful Soup (bs4) = библиотека для парсинга HTML и XML.
requests = библиотека HTTP
sqlite3 = входит в Python standard library.
- Функция с параметром (список годов) для получения данных со 150 страниц. Каждая html-страница содержит span, например для
https://www.fullmoon.info/en/fullmoon-calendar/1901.html. Требуется получитьclass="table-calendar":
<table class="table-calendar">
<tbody>
<tr><td class="weekday">Saturday</td><td class="date">5 January 1901</td><td class="time">1:13:24 am</td><td class="notes"> </td></tr>
<tr><td class="weekday">Sunday</td><td class="date">3 February 1901</td><td class="time">4:29:42 pm</td><td class="notes"> </td></tr>
<tr><td class="weekday">Tuesday</td><td class="date">5 March 1901</td><td class="time">9:04:06 am</td><td class="notes"> </td></tr>
<tr><td class="weekday">Thursday</td><td class="date">4 April 1901</td><td class="time">2:20:06 am</td><td class="notes"> </td></tr>
<tr><td class="weekday">Friday</td><td class="date">3 May 1901</td><td class="time">7:18:42 pm</td><td class="notes"> [/]</td></tr>
<tr><td class="weekday">Sunday</td><td class="date">2 June 1901</td><td class="time">10:52:42 am</td><td class="notes"> </td></tr>
<tr><td class="weekday">Tuesday</td><td class="date">2 July 1901</td><td class="time">12:17:36 am</td><td class="notes"> </td></tr>
<tr><td class="weekday">Wednesday</td><td class="date">31 July 1901</td><td class="time">11:33:42 am</td><td class="notes"> [+]</td></tr>
<tr><td class="weekday">Thursday</td><td class="date">29 August 1901</td><td class="time">9:20:48 pm</td><td class="notes"> </td></tr>
<tr><td class="weekday">Saturday</td><td class="date">28 September 1901</td><td class="time">6:35:42 am</td><td class="notes"> </td></tr>
<tr><td class="weekday">Sunday</td><td class="date">27 October 1901</td><td class="time">4:06:12 pm</td><td class="notes"> [*]</td></tr>
<tr><td class="weekday">Tuesday</td><td class="date">26 November 1901</td><td class="time">2:17:30 am</td><td class="notes"> </td></tr>
<tr><td class="weekday">Wednesday</td><td class="date">25 December 1901</td><td class="time">1:15:48 pm</td><td class="notes"> </td></tr>
</tbody>
</table>- Полный набор данных в .csv: Full Moon Calendar 1900-2050
- Перед записью данных в таблицу БД требуется сконвертировать дату и время в один объект:
5 January 1901 1:13:24 am -> 1901-01-05 01:13:24.
BeautifulSoup + static content
Загрузка данных с сайта minerals.net: создание каталогов с названием другоценных камней и сохранение изображений в соответствующие каталоги.
- Страница list of all gemstones содержит таблицу со списком камней:
page = 'https://www.minerals.net/GemStoneMain.aspx'
resp = requests.get(page)
if resp.status_code == 200:
html = resp.text
soup = BeautifulSoup(html, 'html.parser')
table_gems=soup.find_all('table',{'id':'ctl00_ContentPlaceHolder1_DataList1'})-
Считать ссылки на страницы к каждому драгоценному камню и создать словарь
{gemstone name : link }. -
Распарсить каждую страницу и получить изображения.
table_images=soup.find_all('table',{'id':'ctl00_ContentPlaceHolder1_DataList1'})BeautifulSoup + dynamic content
Cобирает информацию о вакансиях с сайта Habr Career и представляет её в виде объектов класса.
- Принимает поисковый запрос (например, "аналитик")
- Отправляет GET-запрос к https://career.habr.com/vacancies?q={запрос}
- Парсит HTML-страницу с помощью BeautifulSoup
- Извлекает информацию по каждой вакансии
- Создаёт экземпляры класса Vacancy и помещает их в список
BeautifulSoup + SQLite
Получение данных из gismeteo.ru: город + период. Сохранение данных в БД с помощью ORM sqlalchemy v2
- Установка пакетов:
pip install beautifulsoup4
pip install sqlalchemy- Пример страницы: погода в Москве за последние 14 дней. HTML-элемент класса
widget-items. - Выгрузить день недели, дату, описание, температуру (max), температуру (min), скорость ветра (м/с), направление ветра, осадки, влажность, уровень радиации.
- Создать класс Weather с соответствующими полями.
- Создать SqlAlchemy Engine (подключение), SqlAlchemy Table с 10 столбцами и mapper между классом Weather и SqlAlchemy Table.
- Обработать данные с сайта так, чтобы получить строку, дату, число с плавающей запятой и т.д. Вставить данные в БД. Учесть возможное дублирование данных.
Работа с nosql базой данных с помощью python.
Базовые операции при работе с MongoDB с помощью модуля pymongo.
opt: скачать и установить GUI Compass
pip install pymongoБаза данных примера: weather.json. Импортировать данные в экземпляр MongoDB и изучить коллекцию документов: Schema -> Analyze.
Проверить запросы с помощью mongosh/Compass:
{"airTemperature.value": 3}
{"airTemperature.value": {$gt: 10}}
{"wind.type": {$ne: "N"}}
{"atmosphericPressureChange" : {$exists: true}}- Реализовать CRUD операции к MongoDB с помощью pymongo:
insert_one (insert_many), find, update_one (update_many), delete_one (delete_many). Данные функции принимают на вход словарь/словари в качестве параметров.