1+ from typing import Iterable, Optional
2+
3+ class ImmutableNumberList:
4+ def __init__(self, elements: Iterable[int]):
5+ self.elements = [element for element in elements]
6+
7+ def first(self) -> Optional[int]:
8+ if not self.elements:
9+ return None
10+ return self.elements[0]
11+
12+ def last(self) -> Optional[int]:
13+ if not self.elements:
14+ return None
15+ return self.elements[-1]
16+
17+ def length(self) -> int:
18+ return len(self.elements)
19+
20+ def largest(self) -> Optional[int]:
21+ if not self.elements:
22+ return None
23+ largest = self.elements[0]
24+ for element in self.elements:
25+ if element > largest:
26+ largest = element
27+ return largest
28+
29+
30+ class SortedImmutableNumberList(ImmutableNumberList):
31+ def __init__(self, elements: Iterable[int]):
32+ super().__init__(sorted(elements))
33+
34+ def largest(self) -> Optional[int]:
35+ return self.last()
36+
37+ def max_gap_between_values(self) -> Optional[int]:
38+ if not self.elements:
39+ return None
40+ previous_element = None
41+ max_gap = -1
42+ for element in self.elements:
43+ if previous_element is not None:
44+ gap = element - previous_element
45+ if gap > max_gap:
46+ max_gap = gap
47+ previous_element = element
48+ return max_gap
49+
50+
51+ values = SortedImmutableNumberList([1, 20, 7, 13, 4])
52+ print(values.largest())
53+ print(values.max_gap_between_values())
54+
55+ unsorted_values = ImmutableNumberList([1, 19, 7, 13, 4])
56+ print(unsorted_values.largest())
57+ # print(unsorted_values.max_gap_between_values()). 'ImmutableNumberList' object has no attribute 'max_gap_between_values'
58+
59+
60+
61+ class Parent:
62+ def __init__(self, first_name: str, last_name: str):
63+ self.first_name = first_name
64+ self.last_name = last_name
65+
66+ def get_name(self) -> str:
67+ return f"{self.first_name} {self.last_name}"
68+
69+
70+ class Child(Parent):
71+ def __init__(self, first_name: str, last_name: str):
72+ super().__init__(first_name, last_name)
73+ self.previous_last_names = []
74+
75+ def change_last_name(self, last_name) -> None:
76+ self.previous_last_names.append(self.last_name)
77+ self.last_name = last_name
78+
79+ def get_full_name(self) -> str:
80+ suffix = ""
81+ if len(self.previous_last_names) > 0:
82+ suffix = f" (née {self.previous_last_names[0]})"
83+ return f"{self.first_name} {self.last_name}{suffix}"
84+
85+ person1 = Child("Elizaveta", "Alekseeva")
86+ print(person1.get_name())
87+ print(person1.get_full_name())
88+ person1.change_last_name("Tyurina")
89+ print(person1.get_name())
90+ print(person1.get_full_name())
91+
92+ person2 = Parent("Elizaveta", "Alekseeva")
93+ print(person2.get_name())
94+ # print(person2.get_full_name()) 'Parent' object has no attribute 'get_full_name'
95+ # person2.change_last_name("Tyurina") 'Parent' object has no attribute 'change_last_name'
96+ print(person2.get_name())
97+ # print(person2.get_full_name()) 'Parent' object has no attribute 'get_full_name'
0 commit comments