main

  1class Ammunition:
  2    def __init__(self, name: str, weight: float, price: float):
  3        if weight <= 0 or price <= 0:
  4            raise ValueError("вага/ціна мають бути > 0")
  5        self.name = name
  6        self.weight = weight
  7        self.price = price
  8
  9    def __repr__(self):
 10        return f"{self.__class__.__name__}({self.name}, вага:{self.weight}, ціна:{self.price})"
 11
 12
 13class Armor(Ammunition):
 14    def __init__(self, name: str, weight: float, price: float, defense: int):
 15        super().__init__(name, weight, price)
 16        self.defense = defense
 17
 18
 19class Weapon(Ammunition):
 20    def __init__(self, name: str, weight: float, price: float, damage: int):
 21        super().__init__(name, weight, price)
 22        self.damage = damage
 23
 24
 25class Node:
 26    def __init__(self, data: Ammunition):
 27        self.data = data
 28        self.next = None
 29        self.prev = None
 30
 31
 32class AmmunitionAestheticList:
 33    def __init__(self, data=None):
 34        self.head = None
 35        self.tail = None
 36        self._size = 0
 37
 38        # пер типу_констр
 39        if data is not None:
 40            if isinstance(data, Ammunition):
 41                self.append(data)
 42            elif hasattr(data, '__iter__') and not isinstance(data, (str, bytes)):
 43                for item in data:
 44                    self.append(item)
 45            else:
 46                raise TypeError("невірний тип констр")
 47
 48    def append(self, item: Ammunition):
 49        if not isinstance(item, Ammunition):
 50            raise TypeError("треба об амун")
 51
 52        new_node = Node(item)
 53        if not self.head:
 54            self.head = new_node
 55            self.tail = new_node
 56        else:
 57            self.tail.next = new_node
 58            new_node.prev = self.tail
 59            self.tail = new_node
 60        self._size += 1
 61
 62    def clear(self):
 63        self.head = None
 64        self.tail = None
 65        self._size = 0
 66
 67    def remove(self, item: Ammunition) -> bool:
 68        # лог вид вузла
 69        curr = self.head
 70        while curr:
 71            if curr.data == item:
 72                if curr.prev:
 73                    curr.prev.next = curr.next
 74                else:
 75                    self.head = curr.next
 76
 77                if curr.next:
 78                    curr.next.prev = curr.prev
 79                else:
 80                    self.tail = curr.prev
 81
 82                self._size -= 1
 83                return True
 84            curr = curr.next
 85        raise ValueError("елемент відсутній")
 86
 87    def __len__(self) -> int:
 88        return self._size
 89
 90    def __getitem__(self, index: int) -> Ammunition:
 91        if index < 0 or index >= self._size:
 92            raise IndexError("індекс за меж")
 93
 94        curr = self.head
 95        for _ in range(index):
 96            curr = curr.next
 97        return curr.data
 98
 99    def __iter__(self):
100        curr = self.head
101        while curr:
102            yield curr.data
103            curr = curr.next
104
105
106if __name__ == "__main__":
107    try:
108        # Тут виправлено: додали шкоду 45 для меча та 30 для лука
109        sword = Weapon("Меч", 3.5, 400, 45)
110        armor = Armor("Щит", 7.0, 250, 30)
111
112        # констр 1 порож
113        list_empty = AmmunitionAestheticList()
114        print(f"довжина: {len(list_empty)}")
115
116        # ... констр 2 один
117        list_single = AmmunitionAestheticList(sword)
118        for x in list_single:
119            print(x)
120
121        # констр 3 кол
122        standart_list = [sword, armor, Weapon("Лук", 1.8, 150, 30)]
123        list_coll = AmmunitionAestheticList(standart_list)
124
125        # елем кол
126        for item in list_coll:
127            print(item)
128
129        print(f"\nелемент за індексом 1: {list_coll[1]}")
130
131        list_coll.remove(armor)
132        # після вид елем
133        for item in list_coll:
134            print(item)
135
136        print(f"нова довжина: {len(list_coll)}")
137
138    except (ValueError, TypeError, IndexError) as e:
139        print(f"помилка виконання: {e}")
class Ammunition:
 2class Ammunition:
 3    def __init__(self, name: str, weight: float, price: float):
 4        if weight <= 0 or price <= 0:
 5            raise ValueError("вага/ціна мають бути > 0")
 6        self.name = name
 7        self.weight = weight
 8        self.price = price
 9
10    def __repr__(self):
11        return f"{self.__class__.__name__}({self.name}, вага:{self.weight}, ціна:{self.price})"
Ammunition(name: str, weight: float, price: float)
3    def __init__(self, name: str, weight: float, price: float):
4        if weight <= 0 or price <= 0:
5            raise ValueError("вага/ціна мають бути > 0")
6        self.name = name
7        self.weight = weight
8        self.price = price
name
weight
price
class Armor(Ammunition):
14class Armor(Ammunition):
15    def __init__(self, name: str, weight: float, price: float, defense: int):
16        super().__init__(name, weight, price)
17        self.defense = defense
Armor(name: str, weight: float, price: float, defense: int)
15    def __init__(self, name: str, weight: float, price: float, defense: int):
16        super().__init__(name, weight, price)
17        self.defense = defense
defense
Inherited Members
Ammunition
name
weight
price
class Weapon(Ammunition):
20class Weapon(Ammunition):
21    def __init__(self, name: str, weight: float, price: float, damage: int):
22        super().__init__(name, weight, price)
23        self.damage = damage
Weapon(name: str, weight: float, price: float, damage: int)
21    def __init__(self, name: str, weight: float, price: float, damage: int):
22        super().__init__(name, weight, price)
23        self.damage = damage
damage
Inherited Members
Ammunition
name
weight
price
class Node:
26class Node:
27    def __init__(self, data: Ammunition):
28        self.data = data
29        self.next = None
30        self.prev = None
Node(data: Ammunition)
27    def __init__(self, data: Ammunition):
28        self.data = data
29        self.next = None
30        self.prev = None
data
next
prev
class AmmunitionAestheticList:
 33class AmmunitionAestheticList:
 34    def __init__(self, data=None):
 35        self.head = None
 36        self.tail = None
 37        self._size = 0
 38
 39        # пер типу_констр
 40        if data is not None:
 41            if isinstance(data, Ammunition):
 42                self.append(data)
 43            elif hasattr(data, '__iter__') and not isinstance(data, (str, bytes)):
 44                for item in data:
 45                    self.append(item)
 46            else:
 47                raise TypeError("невірний тип констр")
 48
 49    def append(self, item: Ammunition):
 50        if not isinstance(item, Ammunition):
 51            raise TypeError("треба об амун")
 52
 53        new_node = Node(item)
 54        if not self.head:
 55            self.head = new_node
 56            self.tail = new_node
 57        else:
 58            self.tail.next = new_node
 59            new_node.prev = self.tail
 60            self.tail = new_node
 61        self._size += 1
 62
 63    def clear(self):
 64        self.head = None
 65        self.tail = None
 66        self._size = 0
 67
 68    def remove(self, item: Ammunition) -> bool:
 69        # лог вид вузла
 70        curr = self.head
 71        while curr:
 72            if curr.data == item:
 73                if curr.prev:
 74                    curr.prev.next = curr.next
 75                else:
 76                    self.head = curr.next
 77
 78                if curr.next:
 79                    curr.next.prev = curr.prev
 80                else:
 81                    self.tail = curr.prev
 82
 83                self._size -= 1
 84                return True
 85            curr = curr.next
 86        raise ValueError("елемент відсутній")
 87
 88    def __len__(self) -> int:
 89        return self._size
 90
 91    def __getitem__(self, index: int) -> Ammunition:
 92        if index < 0 or index >= self._size:
 93            raise IndexError("індекс за меж")
 94
 95        curr = self.head
 96        for _ in range(index):
 97            curr = curr.next
 98        return curr.data
 99
100    def __iter__(self):
101        curr = self.head
102        while curr:
103            yield curr.data
104            curr = curr.next
AmmunitionAestheticList(data=None)
34    def __init__(self, data=None):
35        self.head = None
36        self.tail = None
37        self._size = 0
38
39        # пер типу_констр
40        if data is not None:
41            if isinstance(data, Ammunition):
42                self.append(data)
43            elif hasattr(data, '__iter__') and not isinstance(data, (str, bytes)):
44                for item in data:
45                    self.append(item)
46            else:
47                raise TypeError("невірний тип констр")
head
tail
def append(self, item: Ammunition):
49    def append(self, item: Ammunition):
50        if not isinstance(item, Ammunition):
51            raise TypeError("треба об амун")
52
53        new_node = Node(item)
54        if not self.head:
55            self.head = new_node
56            self.tail = new_node
57        else:
58            self.tail.next = new_node
59            new_node.prev = self.tail
60            self.tail = new_node
61        self._size += 1
def clear(self):
63    def clear(self):
64        self.head = None
65        self.tail = None
66        self._size = 0
def remove(self, item: Ammunition) -> bool:
68    def remove(self, item: Ammunition) -> bool:
69        # лог вид вузла
70        curr = self.head
71        while curr:
72            if curr.data == item:
73                if curr.prev:
74                    curr.prev.next = curr.next
75                else:
76                    self.head = curr.next
77
78                if curr.next:
79                    curr.next.prev = curr.prev
80                else:
81                    self.tail = curr.prev
82
83                self._size -= 1
84                return True
85            curr = curr.next
86        raise ValueError("елемент відсутній")