Написать функцию, реализующую вывод таблицы умножения размерностью
AxB. Первый и второй множитель должны задаваться в виде аргументов функции. Значения каждой строки таблицы должны быть представлены списком, который формируется в цикле. После этого осуществляется вызов внешней lambda-функции, которая формирует на основе списка строку. Полученная строка выводится в главной функции. Элементы строки (элементы таблицы умножения) должны разделяться табуляцией.
Дополнить следующую функцию недостающим кодом:
def print_directory_contents(sPath):
""" Функция принимает имя каталога и распечатывает его содержимое в виде «путь и имя файла», а также любые другие файлы во вложенных каталогах.
Эта функция подобна os.walk. Использовать функцию os.walk нельзя. Данная задача показывает ваше умение работать с вложенными структурами.
""" # заполните далее
Разработать генератор случайных чисел. В функцию передавать начальное и конечное число генерации (нуль необходимо исключить). Заполнить этими данными список и словарь. Ключи словаря должны создаваться по шаблону: “elem_<номер_элемента>”. Вывести содержимое созданных списка и словаря.
Написать программу «Банковский депозит». Она должна состоять из функции и ее вызова с аргументами. Клиент банка делает депозит на определенный срок. В зависимости от суммы и срока вклада определяется процентная ставка: 1000–10000 руб (6 месяцев — 5 % годовых, год — 6 % годовых, 2 года — 5 % годовых). 10000–100000 руб (6 месяцев — 6 % годовых, год — 7 % годовых, 2 года – 6.5 % годовых). 100000–1000000 руб (6 месяцев — 7 % годовых, год — 8 % годовых, 2 года — 7.5 % годовых). Необходимо написать функцию, в которую будут передаваться параметры: сумма вклада и срок вклада. Каждый из трех банковских продуктов должен быть представлен в виде словаря с ключами (
begin_sum,end_sum,6,12,24). Ключам соответствуют значения начала и конца диапазона суммы вклада и значения процентной ставки для каждого срока. В функции необходимо проверять принадлежность суммы вклада к одному из диапазонов и выполнять расчет по нужной процентной ставке. Функция возвращает сумму вклада на конец срока.
Усовершенствовать программу «Банковский депозит». Третьим аргументом в функцию должна передаваться фиксированная ежемесячная сумма пополнения вклада. Необходимо в главной функции реализовать вложенную функцию подсчета процентов для пополняемой суммы. Примем, что клиент вносит средства в последний день каждого месяца, кроме первого и последнего. Например, при сроке вклада в 6 месяцев пополнение происходит в течение 4 месяцев. Вложенная функция возвращает сумму дополнительно внесенных средств (с процентами), а главная функция — общую сумму по вкладу на конец периода.
Проверить механизм наследования в Python. Для этого создать два класса. Первый — родительский (
ItemDiscount), должен содержать статическую информацию о товаре: название и цену. Второй — дочерний (ItemDiscountReport), должен содержать функцию (get_parent_data), отвечающую за отображение информации о товаре в одной строке. Проверить работу программы, создав экземпляр (объект) родительского класса.
Инкапсулировать оба параметра (название и цену) товара родительского класса. Убедиться, что при сохранении текущей логики работы программы будет сгенерирована ошибка выполнения. Усовершенствовать родительский класс таким образом, чтобы получить доступ к защищенным переменным. Результат выполнения заданий 1 и 2 должен быть идентичным.
Реализовать возможность переустановки значения цены товара. Необходимо, чтобы и родительский, и дочерний классы получили новое значение цены. Следует проверить это, вызвав соответствующий метод родительского класса и функцию дочернего (функция, отвечающая за отображение информации о товаре в одной строке).
Реализовать расчет цены товара со скидкой. Величина скидки должна передаваться в качестве аргумента в дочерний класс. Выполнить перегрузку методов конструктора дочернего класса (метод
__init__, в который должна передаваться переменная — скидка), и перегрузку метода__str__дочернего класса. В этом методе должна пересчитываться цена и возвращаться результат — цена товара со скидкой. Чтобы все работало корректно, не забудьте инициализировать дочерний и родительский классы (вторая и третья строка после объявления дочернего класса).
Проверить на практике возможности полиморфизма. Необходимо разделить дочерний класс
ItemDiscountReportна два класса. Инициализировать классы необязательно. Внутри каждого поместить функциюget_info, которая в первом классе будет отвечать за вывод названия товара, а вторая — его цены. Далее реализовать выполнение каждой из функции тремя способами.
Написать программу, которая будет содержать функцию для получения имени файла из полного пути до него. При вызове функции в качестве аргумента должно передаваться имя файла с расширением. В функции необходимо реализовать поиск полного пути по имени файла, а затем «выделение» из этого пути имени файла (без расширения).
Написать программу, которая запрашивает у пользователя ввод числа. На введенное число она отвечает сообщением, целое оно или дробное. Если дробное — необходимо далее выполнить сравнение чисел до и после запятой. Если они совпадают, программа должна возвращать значение
True, иначеFalse.
Создать два списка с различным количеством элементов. В первом должны быть записаны ключи, во втором — значения. Необходимо написать функцию, создающую из данных ключей и значений словарь. Если ключу не хватает значения, в словаре для него должно сохраняться значение
None. Значения, которым не хватило ключей, необходимо отбросить.
Написать программу, в которой реализовать две функции. В первой должен создаваться простой текстовый файл. Если файл с таким именем уже существует, выводим соответствующее сообщение. Необходимо открыть файл и подготовить два списка: с текстовой и числовой информацией. Для создания списков использовать генераторы. Применить к спискам функцию
zip(). Результат выполнения этой функции должен должен быть обработан и записан в файл таким образом, чтобы каждая строка файла содержала текстовое и числовое значение. Вызвать вторую функцию. В нее должна передаваться ссылка на созданный файл. Во второй функции необходимо реализовать открытие файла и простой построчный вывод содержимого. Вся программа должна запускаться по вызову первой функции.
Усовершенствовать первую функцию из предыдущего примера. Необходимо во втором списке часть строковых значений заменить на значения типа
example345(строка+число). Далее — усовершенствовать вторую функцию из предыдущего примера (функцию извлечения данных). Дополнительно реализовать поиск определенных подстрок в файле по следующим условиям: вывод первого вхождения, вывод всех вхождений. Реализовать замену всех найденных подстрок на новое значение и вывод всех подстрок, состоящих из букв и цифр и имеющих пробелы только в начале и конце — например,example345.
Создать виртуальное окружение проекта, под которым установить необходимый инструментарий (файл
requirements.txt).
Под виртуальным окружением создать Django-проект и одно приложение, настроить файл
settings.py, выполнить базовые миграции. Запустить Django-сервер для проверки работоспособности проекта.
В каталоге приложения создать модель, которая должна хранить информацию о поступивших товарах: название, дату поступления, цену, единицу измерения, имя поставщика. Выполнить миграции
Проверить правильность созданной модели, зарегистрировав ее в админке приложения.
На основе модели добавить класс формы указания данных о товаре. Использовать наследование от
forms.ModelForm.
Настроить файл
urls.pyвнутреннего каталога проекта. Он должен содержать два шаблона url-адресов: привязку к url-адресу админки проекта (будет в файле по умолчанию после создания проекта) и привязку к набору шаблонов url-адресов созданного приложения (операторinclude).
Создать и настроить файл привязок
urls.pyдля приложения. В этом файле создать две привязки: к url-адресу главной страницы проекта и к странице добавления товара. Для каждой из привязок указать функцию-контроллер и название. Функции-контроллеры должны отвечать за загрузку списка товаров на главной странице и добавление товара на второй странице.
В файле
views.pyкаталога проекта реализовать два контроллера в формате функций. Первый должен извлекать все записи из модели с каталогом товаром и передавать переменную со списком товаров в контекст шаблона (html-страница со списком товаров). Во втором контроллере должен создаваться объект формы для ввода данных о товаре и выполняться рендеринг шаблона страницы добавления товара. В контекст шаблона необходимо передавать объект формы.
В корне проекта создать директорию
templatesс двумя стандартными шаблонами: базовым (base.html) и шаблоном формы (form.html). Базовый шаблон будет соответствовать каркасу главной страницы. В нем необходимо реализовать один динамически обновляемый блок — например,{% block content %}{% endblock %}. Он будет содержать таблицу со списком товаров, которая динамически подгружается из шаблона-наследника (html-страница со списком товаров). В файлеbase.htmlнеобходимо подключить статику и указать ссылку на CSS-файл со стилизацией проекта. Можно воспользоваться файломbootstrap.min.css(его нужно скачать и поместить в каталог.static/css).
В шаблоне формы
form.html, используя теги шаблонов, реализовать разметку формы. При этом использовать переменную контекста шаблона, содержащую объект формы, — например, form. К надписям полей обращаться поfield.label, к самим полям —field.
В каталоге приложения создать директорию
templatesс двумя шаблонами: шаблоном html-страницы со списком товаров (goods_list.html) и html-страницы (формы) их добавления (good_create.html). В первом шаблоне необходимо указать шаблон-родительbase.html, кнопку добавления товара и разметить html-таблицу. Каждая из ее строк (кроме той, что с заголовками) должна формироваться при переборе содержимого переменной со списком товаров — мы ее предварительно передали в контекст данного шаблона из соответствующего контроллера. Для каждого из значений переменной (фактически — это запись базы данных), полученного в цикле, необходимо обратиться к нужному полю и вывести его в соответствующей ячейке. К кнопке привязать ссылку на страницу добавления товара. Для этого использовать имя нужного шаблона url-адреса файлаurls.pyприложения.
В шаблоне
good_create.htmlсоздать html-тегform. В него поместить тегinclude, добавляющий html-разметку формы (form.html) и кнопку добавления товара. Для тегаformнеобходимо определить два атрибута:methodсо значениемpostиenctypeсо значениемmultipart/form-data.
Продолжим работать над каталогом товаров. На данный момент приложение действует в синхронном режиме, т.е. пользователь нажимает кнопку добавления, после чего выполняется переход на соответствующую страницу. Усовершенствуем работу проекта: сделаем его более похожим на десктопное приложение — без всяких перезагрузок страницы. Форма должна загружаться, как модальное окно, как бы «поверх» содержимого главной страницы. После этого пользователь может указать данные нового товара и сохранить его в базе. При этом модальное окно формы должно закрываться, а изменения, т.е. строка с добавленным товаром, должна отобразиться в таблице на главной странице. Таким образом мы реализуем асинхронную работу приложения. Для этого необходимо использовать знания языка программирования JavaScript и библиотеки jQuery. Разобьем выполнение задания на несколько этапов:
В первую очередь необходимо внести изменения в шаблон
goods_list.html. Создадим пустую структуру вложенных блочных элементовdiv(три элемента). Ее содержимое будет динамически изменяться при нажатии кнопки добавления товара, т.е. будет загружаться модальное окно формы добавления товара
В этом файле необходимо добавить подключение библиотеки jQuery. Для локального подключения следует скачать и поместить в директорию static/js файл с кодом библиотеки — например,
jquery-3.3.1.min.js. В эту же директорию следует добавить файлbootstrap.min.js, который позволит упростить стилизацию элементов страницы.
Это шаблон, в котором находится разметка формы добавления товара. Его следует модифицировать, указав в атрибуте
actionтегаformимя url-шаблона адреса, при переходе на который запускается контроллер записи в модель введенных данных. В нашем случае это шаблонgood_create.html. Также в данный шаблон необходимо поместить тег импорта разметки самой формыform.htmlв блочный элемент и добавить две кнопки: сохранения данных в форме и ее закрытия.
В шаблон формы необходимо выполнить загрузку инструментов пакета
django-widget-tweaks:
Задание 2. Доработка контроллеров (Я реализую более современный вариант, на CBV! Соответственно в методах выполнения есть различия, но результат выполненного задания идентичен)
Необходимо доработать один из двух наших контроллеров и написать третий. С первым —
good_list— все в порядке, а во втором контроллере необходимо реализовать только проверку типа запроса:POSTилиGET. При этом также должен генерироваться экземпляр формы. Возвращать этот контроллер должен вызов дополнительного контроллера-функцииsave_good_formс со следующими параметрами: объект запроса, объект формы, шаблон. Поскольку данный контроллер должен «открыть» форму добавления товара, в качестве шаблона следует передаватьgood_create.html. Контроллерsave_good_formиспользуется для проверки валидности и формирования словаряdata, в котором мы будем указывать, является ли форма валидной, а также передавать преобразованный в строку шаблон и контекст (методrender_to_string). Данный контроллер будет возвращать ответ в форматеJSON. Это позволит работать с формой и контекстом из файла скрипта средствами библиотеки jQuery, то есть асинхронно делать форму и передавать данные на сторону сервера.
Этот скрипт должен обрабатывать переданные в формате JSON данные: обращаться с помощью селекторов к элементам веб-страницы и осуществлять манипуляции над ними. Подразумевается динамическое обновление содержимого главной страницы: подгрузка шаблона формы, а также асинхронное (без перезагрузки главной страницы) сохранение данных в модель. Для этого в файле сценария должны быть реализованы две функции. Первая отвечает за загрузку формы, вторая — за сохранение введенных в форму данных. Для запуска первой функции необходимо выполнить ее привязку к событию нажатия на кнопку добавления товара. Для запуска второй привязка должна быть выполнена к событию отправки формы. И функции, и инструкции их вызова должны быть сохранены в функции-обертке
$(function(){....программный код….});, чтобы решить всю задачу средствами библиотеки jQuery.
Практическое задание шестого и седьмого урока — разработать десктопное приложение с графическим интерфейсом пользователя, предназначенное для ведения простого складского учета. Это приложение с оконным интерфейсом будет реализовано в привязке к СУБД SQLite и позволит заносить в базу данных сведения о номенклатуре товаров, поставщиках и сотрудниках предприятия. На данном этапе работы с проектом выполним первую часть практическое задания: подготовим фрагменты программного кода, отвечающие за создание таблиц базы данных. В седьмом уроке отображение этих таблиц реализуем в специальных виджетах. Ниже приведено описание необходимых блоков программного кода.
С помощью одного из менеджеров баз данных (например, SQLiteStudio) создать пустой файл SQLite-базы данных.
Выполнить импорт модуля с Python DB-API для реализации взаимодействия с СУБД SQLite. Создать подключение к базе данных, путь к которой записан в переменную
db_path. Создать объект-курсор для выполнения операций с данными.
Написать запрос создания таблицы
categories(с проверкой ее существования). Таблица должна содержать два поля:category_name(категория),category_description(описание). Все поля должны быть не пустыми. Полеcategoryдолжно быть первичным ключом.
Написать запрос создания таблицы
unitsс проверкой ее существования. Таблица должна содержать одно поле —unit(единица измерения). Оно должно быть не пустым и выступать первичным ключом.
Написать запрос создания таблицы
positions(с проверкой ее существования). Таблица должна содержать одно поле —position(должность). Оно должно быть не пустым и выступать первичным ключом.
Написать запрос создания таблицы
goodsс проверкой ее существования. Таблица должна содержать четыре поля:good_id(номер товара — первичный ключ),good_name(название товара),good_unit(единица измерения товара — внешний ключ на таблицуunits),good_cat(категория товара — внешний ключ на таблицуcategories).
Написать запрос создания таблицы
employeesс проверкой ее существования. Таблица должна содержать три поля:employee_id(номер сотрудника — первичный ключ),employee_fio(ФИО сотрудника),employee_position(должность сотрудника — внешний ключ на таблицуpositions).
Написать запрос создания таблицы
vendorsс проверкой ее существования. Таблица должна содержать шесть полей:vendor_id(номер поставщика — первичный ключ),vendor_name(название поставщика),vendor_ownerchipform(форма собственности поставщика),vendor_address(адрес поставщика),vendor_phone(телефон поставщика),vendor_email(email поставщика).