
- •3) Создать массив размерностью 5 на 5. Использовать срезы для доступа к частям массива:
- •4) Выполнить простые арифметические операции с массивами. Создать две матрицы (с которыми можно выполнять указанные операции)
- •5) Ознакомится с универсальными функциями. Для этого также создать два двумерных
- •6) Работа с многомерными массивами. Создать два двухмерных массива и применить к ним следующие функции:
- •Import numpy as np
- •Import numpy as np
Import numpy as np
array = np.array([1, 2, 3, 4, 5])
indices = np.where(array > 2)
print(indices) # Выведет: (array([2, 3, 4]),)
array = np.array([1, 2, 3, 4, 5])
# Находим индексы элементов массива, которые больше 2
indices = np.where(array > 2)
print(indices) # Выведет: (array([2, 3, 4]),)
print('\n' * 2)
print("10)")
Задание:
Используя библиотеку np.where() решить следующие задачу:
Создайте массив, содержащий какие-то данные, включая пропущенные значения (например, значения None). Используйтеnp.where() для замены пропущенных значений на определенное значение или для удаления их из массива.
# Создание массива с пропущенными значениями (None)
data = np.array([1, 2, None, 4, None, 6])
# Определение значения, которым нужно заменить пропущенные значения
replacement_value = 0
# Замена пропущенных значений на указанное значение
data_filled = np.where(data == None, replacement_value, data)
print("Массив после замены пропущенных значений:\n", data_filled)
Задача 2. Решить задачу используя классы, конструктор классов, наследование классов.
А) За основу берем выполненную задачу из лабораторной работы №6
Б) Реализовать элемент полиморфизма в задаче по варианту в виде перегрузке методов в классе (минимум 3 метода).
В) Реализовать в программе перегрузку операторов с помощью магических методов.
Г) Добавить абстрактный метод в родительский класс, в первом подклассе не реализовывать этот метод, во второй подклассе реализовать.
Д) Переделать любую часть программы, реализовав в неё взаимодействие с библиотекой numpy.
Блок-схемы программы
Рисунок 1 – Начало кода программы пункта Б)
Рисунок 2 – Конец кода программы пункта Б)
Рисунок 3 – Код программы пункта В)
Рисунок 4 – Код программы пункта Г)
Рисунок 5 – Код программы пункта Д)
Рисунок 6 – Перегруженный метод info_product
Рисунок 7 – Перегруженный метод total_cost
Рисунок 8 – Перегруженный метод sell_product
Рисунок 9 –Метод перегруженного оператора, __add__
Рисунок 10 –Метод перегруженного оператора, __sub__
Рисунок 11 – Реализация абстрактного метода tax
Пример работы программы:
Листинг программы:
Import numpy as np
from abc import ABC, abstractmethod
class OnlineStoreItem(ABC):
def __init__(self, productName, price, countInStock):
self.__productName = productName
self.__price = price
self.__countInStock = countInStock
@property
def product_name(self):
return self.__productName
@product_name.setter
def product_name(self, name):
if isinstance(name, str):
self.__productName = name
else:
print("Недопустимое название")
@property
def price(self):
return self.__price
@price.setter
def price(self, price):
if isinstance(price, (int, float)):
self.__price = price
else:
print("Недопустимое значение")
@property
def count_in_stock(self):
return self.__countInStock
@count_in_stock.setter
def count_in_stock(self, count):
if isinstance(count, int):
self.__countInStock = count
else:
print("Недопустимое значение")
@staticmethod
def update_product(obj, index, argStr1=None, argInt1=None, argInt2=None, argStr2=None, argInt3=None, argInt4=None):
if index < len(obj):
if argStr1 is not None:
obj[index].product_name = argStr1
if argInt1 is not None:
obj[index].price = argInt1
if argInt2 is not None:
obj[index].count_in_stock = argInt2
if argStr2 is not None:
obj[index].rack = argStr2
if argInt3 is not None:
obj[index].cell = argInt3
if argInt4 is not None:
obj[index].serialNumber = argInt4
print("Продукт по индексу", index, "обновлен.")
else:
print("Индекс выходит за пределы массива.")
return obj
@staticmethod
def deleter(objects, product_name):
# Получаем индексы объектов с заданным именем продукта
indices = np.where([obj.product_name == product_name for obj in objects])[0]
if len(indices) > 0:
# Удаляем объекты по найденным индексам
for index in reversed(indices): # Используем reversed() для удаления с конца списка
objects.pop(index)
print(f"Товар '{product_name}' успешно удален из магазина.")
else:
print(f"Товар '{product_name}' нет в магазине.")
@staticmethod
def write_to_file(content, fileName):
with open(fileName, 'w+') as file:
file.write(content)
print("Данные записаны в файл", fileName)
@staticmethod
def write_summary(objects, fileName):
summary = ""
for product in objects:
summary += f"Товар: {product.product_name}, Цена: {product.price}, Количество: {product.count_in_stock}\n"
OnlineStoreItem.write_to_file(summary, fileName)
@classmethod
def read_from_file(obj, fileName):
objects = []
with open(fileName, 'r') as file:
for line in file:
customer_name, price, products_count, rack, cell, serialNumber = line.strip().split(',')
price = float(price)
products_count = int(products_count)
rack = str(rack)
cell = int(cell)
serialNumber = int(serialNumber)
new_export = obj(customer_name, price, products_count, rack, cell, serialNumber)
objects.append(new_export)
return objects
def __add__(self, other):
return self.price + other
# Перегрузка оператора вычитания (-)
def __sub__(self, other):
return self.price - other
'''
@abstractmethod
def tax(self):
pass
'''
#подкласс наследник OnlineStoreItem
class Warehouse(OnlineStoreItem):
def __init__(self, productName=None, price=None, countInStock=None, rack=None, cell=None, serialNumber=None):
if cell is not None and cell <= 1000:
super().__init__(productName, price, countInStock) # вызываем конструктор родительского класса
self.__rack = rack
self.__cell = cell
self.__serialNumber = serialNumber
else:
# Присваиваем значения по умолчанию для cell и serialNumber
default_cell = 1000
default_serialNumber = 1000
super().__init__(productName, price, countInStock)
self.__rack = rack
self.__cell = default_cell
self.__serialNumber = default_serialNumber
# Геттеры для атрибутов rack, cell и serialNumber
@property
def rack(self):
return self.__rack
@rack.setter
def rack(self, rack):
if isinstance(rack, str):
self.__rack = rack
else:
print("Недопустимое название")
@property
def cell(self):
return self.__cell
@cell.setter
def cell(self, cell):
if isinstance(cell, (int, float)):
self.__cell = cell
else:
print("Недопустимое значение")
@property
def serialNumber(self):
return self.__serialNumber
@serialNumber.setter
def serialNumber(self, serialNumber):
if isinstance(serialNumber, (int, float)):
self.__serialNumber = serialNumber
else:
print("Недопустимое значение")
def info_product(self):
return f"Товар: {self.product_name}, Цена: {self.price}, Количество на складе: {self.count_in_stock}, Стеллаж: {self.rack}, Ячейка: {self.cell}, Серийный номер: {self.serialNumber}"
def total_cost(self):
return self.price * self.count_in_stock
def sell_product(self, amount):
sold_amount = min(amount, self.count_in_stock)
self.count_in_stock -= sold_amount
print(f"Продано {sold_amount} единиц товара {self.product_name}.")
# подкласс наследник Warehouse
class Export(Warehouse):
def set_product_export(self, product_export):
self.__customer_name = product_export
def set_SellingPrice(self, SellingPrice):
self.__SellingPrice = SellingPrice
def set_products_count(self, products_count):
self.__products_count = products_count
def info_product(self):
return f"Экспортируемый товар: {self.product_name}, Количество: {self.count_in_stock}, Покупатель: {self.__customer_name}, Цена продажи: {self.__SellingPrice}"
def total_cost(self):
return self.__SellingPrice * self.__products_count
def sell_product(self, amount):
sold_amount = min(amount, self.count_in_stock)
self.count_in_stock -= sold_amount
print(f"Отгружено {sold_amount} единиц товара {self.product_name} для экспорта.")
def tax(self):
tax_price = self.price * 1.1 # Увеличиваем цену на 10%
return tax_price
print("Б)")
# объекты класса Warehouse и Export
warehouse_item = Warehouse("Книги", 10.99, 100, "A1", 1, 12345)
export_item = Export("Флешки", 5.99, 50, "B2", 2, 54321)
# Вывод информации о продукте на складе
print("Информация о продукте на складе:")
print(warehouse_item.info_product())
# Вывод информации о продукте для экспорта
export_item.set_product_export("Компания N")
export_item.set_SellingPrice(7.99)
export_item.set_products_count(20)
print("\nИнформация о продукте для экспорта:")
print(export_item.info_product())
# Расчет общей стоимости продуктов
print("\nОбщая стоимость продуктов на складе:", warehouse_item.total_cost())
print("Общая стоимость продуктов для экспорта:", export_item.total_cost())
print("\nПродажа товара со склада:")
warehouse_item.sell_product(20) # Продаем 20 единиц товара со склада
print("Остаток на складе:", warehouse_item.count_in_stock)
print("\nПродажа товара для экспорта:")
export_item.sell_product(30) # Продаем 30 единиц товара для экспорта
print("Остаток для экспорта:", export_item.count_in_stock)
print("\nВ)")
# объект класса OnlineStoreItem
item = OnlineStoreItem("Клавиатура", 200, 50)
# Примеры использования перегруженных операторов
print("Цена товара до увеличения:", item.price)
item += 5 # Увеличение цены товара на 5
print("Цена товара после увеличения:", item)
print("\nЦена товара до уменьшения:", item)
item -= 3 # Уменьшение цены товара на 3
print("Цена товара после уменьшения:", item)
'''
print("Г)")
# Создаем экземпляр класса Export
export_item = Export("Флешка", 400, 10)
# Вызываем метод tax для расчета цены с учетом налога
taxed_price = export_item.tax()
# Вывод
print(f"Цена с учетом налога: {taxed_price:.2f}")
'''
print("\nД)")
objects = [
OnlineStoreItem('Phone', 300, 45),
OnlineStoreItem('Tomato', 45, 132),
OnlineStoreItem('Keyboard', 155, 73)
]
Export.deleter(objects, "Phone")
fileName = 'exports2.txt'
Export.write_summary(objects, "exports2.txt") # Вызываем метод write_summary
Вывод: в ходе лабораторной работы ознакомились и практически использовали наследования, полиморфизм, инкапсуляции классов Python.