Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Python 2 / Лаба 7 / Лабораторная №7.docx
Скачиваний:
1
Добавлен:
10.05.2024
Размер:
288.07 Кб
Скачать

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.

Соседние файлы в папке Лаба 7