From f4cae0071ac2571c8e6f59efa7e58636e1266f92 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=94=D0=B5=D0=BD=D0=B8=D1=81=20=D0=9A=D0=BE=D0=BF=D0=BD?= =?UTF-8?q?=D0=B8=D0=BD?= Date: Wed, 19 Jun 2024 10:34:45 +0300 Subject: [PATCH] done --- .vs/ProjectSettings.json | 3 ++ .vs/PythonSettings.json | 3 ++ .vs/VSWorkspaceState.json | 7 ++++ .vs/hse-python-2024/v17/.wsuo | Bin 0 -> 17920 bytes .vs/hse-python-2024/v17/DocumentLayout.json | 27 +++++++++++++ .vs/slnx.sqlite | Bin 0 -> 90112 bytes tasks/practice1/practice1.py | 4 +- tasks/practice2/practice2.py | 22 +++++++++++ tasks/practice3/practice3.py | 41 ++++++++++++++++++-- tasks/practice4/practice4.py | 14 ++++++- tasks/practice5/employee.py | 26 ++++++++++--- tasks/practice5/team.py | 17 ++++++-- 12 files changed, 148 insertions(+), 16 deletions(-) create mode 100644 .vs/ProjectSettings.json create mode 100644 .vs/PythonSettings.json create mode 100644 .vs/VSWorkspaceState.json create mode 100644 .vs/hse-python-2024/v17/.wsuo create mode 100644 .vs/hse-python-2024/v17/DocumentLayout.json create mode 100644 .vs/slnx.sqlite diff --git a/.vs/ProjectSettings.json b/.vs/ProjectSettings.json new file mode 100644 index 0000000..f8b4888 --- /dev/null +++ b/.vs/ProjectSettings.json @@ -0,0 +1,3 @@ +{ + "CurrentProjectSetting": null +} \ No newline at end of file diff --git a/.vs/PythonSettings.json b/.vs/PythonSettings.json new file mode 100644 index 0000000..d99c9fb --- /dev/null +++ b/.vs/PythonSettings.json @@ -0,0 +1,3 @@ +{ + "SuppressConfigureTestFrameworkPrompt": "true" +} \ No newline at end of file diff --git a/.vs/VSWorkspaceState.json b/.vs/VSWorkspaceState.json new file mode 100644 index 0000000..364354e --- /dev/null +++ b/.vs/VSWorkspaceState.json @@ -0,0 +1,7 @@ +{ + "ExpandedNodes": [ + "" + ], + "SelectedNode": "\\C:\\Users\\Denis\\Source\\Repos\\hse-python-2024", + "PreviewInSolutionExplorer": false +} \ No newline at end of file diff --git a/.vs/hse-python-2024/v17/.wsuo b/.vs/hse-python-2024/v17/.wsuo new file mode 100644 index 0000000000000000000000000000000000000000..69d7ee32866ff01732dcb09a098248a7fc6f1857 GIT binary patch literal 17920 zcmeHOdvIJ;89$p+q|jnt1Y3%1X($xgvadXmm?mjTrAgByO^aPxckgc6Z8r~gw=|Jy zN2?TNl)+&fL1vsP{-cZmtQHh}P)nfBU>V0LBR-&((T<~oo#`M|Z2bN1y=V7kH+yq- z)1<7kC-d#O_uO;NcOKvSoV<2?-do>#X7Ndpk?O?^aej1`xYSbaz;l^=pDV;AcxKu8 z(a}*B&j8@Dl!|BtIz&JIlENugi$3IWF~qG@PUT`|YR_j*(5fN&;E}~g-f&!jdJT(> z%I(0|FLsKxz}|zW)naghUdDbd2Sr+!d+gWo-*%uF;{&Yh+_VP?H0_Q`Vo`CokQk4IDde+@PrN%G%x@_!6?OZ=}de@b>z9#9TQK9oG~ zM7g9w75X3bA=B51~ zpD*M(P1pVt-&CeXSiJq9u3lKXapbCYFUV0(OJILG@I?K=aT=xeziaWCyv@`Fyb0i4 z2U|A*OSn_)&~5M}ID(dO!l;(>m-a9HPUeQE}x-=Fy_MiSB^}Z_p zX4L(@*+nOMj_I6k;4tXC2N<`bG_L#L#uu|eMs^GKKi~N`p%2;)OzXk*J4Gw7#j|*< z+m`Z;_TYa9?IJk_qtyPl5ueM7Nqfb^1LQzbP6D}BRBN9( z@YgX9u_Q_cQYR=v z+>X16JSDmsI%_t+5d%>|r4klU$snN;xe4nwZQ^}h}u z7XVb_pFz}>>)#2PrkR|=GfzfT;)u6op3AJn2`$ellA;mcgSxlCbF>DqfZTgk{Oiz8 z%I#K2(~W{Lqp{~e)|eBj=S<5Bz~74A$W}}$>(Bcnxf0i(^R7Sz)%mxfu3Uc={Jhta zE0O-4_{cL*Rs0>On-BgH|L0a<9{~Q>?@|@Y|JL)~R-LbdI14poz$Vx;w1L(`mokq) zI%Fnq0sP0Ur@07kIOZUdn*3vw4rmxYb0@#3;*$ z{!02ko3skCKQFNUcQ`RD-kVkBf2;ma(}Wk?N-ws0__Kp6XN|n{-Fp^Y`K5=>c8>0A zKlRPP2FH{4k9=j`-h;e=J4WKDVr9GRbYKeUpE|;bpz_`vpSNXk0%a6u{bFFnZ9n|N z=(eB!;I|dYFRpEEdE!UEzxHJO&~r0h9@>4TeJe-KnOYOe9-6}O=jPu^@b5PKG3vsT zR6ZN?IQ8_=#z)^@vhW-KIs3|E{Xed_ad_3+;m03Y_nogjcFkbNb9C&-%!5&m5G2fY zQ|rt7h`a+veb0ABJs67~?-p1U^xquxNgtYP!~Q2qb*LcqPbPleeZ*#8d7 z-}wMl{KOqH6>x6+L$ESzk$=Rx~OedVdn=BVPRa0l*W-+6ZfBZ%TcI`ev)NqNtWB?oV&FD?C^K%Gf(Pwq(iB>vqcyy!^oqc|Ls_U+`z7epW!6( zE7Qf3U!-&6KQ4zb&xk3%s-9Xq^6smrTkhE(d;apRXRfGf`rSVlF7J&$qmBOQ**7co zWs`H2xiOQ%eqSvQES-$~R~Xh0POG&3=Up3W!o~ZVzWUzW6OSCY;oT1H_508L`49UK zZ1nyl^g#L0%Lo7Q?-zU(e)IXW@$LKOGf?c4`eqH}2EwP_$D+uu?-TvVJ8d4hBkJk8Fk4#2ARPbkG zO=DsFmuFDR0IK*uj=DW&7n%4cvbW7(O8?c~|D#V!i`1C)){)uE7VYx9f9S4bZI8b6ms5Y&-urj*zBf-F8;QIYc=8z8 JBWueivP92SAE}M8Sgdb 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 HCxQP3gGimD literal 0 HcmV?d00001 diff --git a/tasks/practice1/practice1.py b/tasks/practice1/practice1.py index 030da70..2d109c0 100644 --- a/tasks/practice1/practice1.py +++ b/tasks/practice1/practice1.py @@ -9,7 +9,7 @@ def concatenate_strings(a: str, b: str) -> str: """ # пиши свой код здесь - + result = a + b return result @@ -23,5 +23,7 @@ def calculate_salary(total_compensation: int) -> float: """ # пиши свой код здесь + tax = 0.13 + result = total_compensation * (1 - tax) return result diff --git a/tasks/practice2/practice2.py b/tasks/practice2/practice2.py index 008f6d1..230e765 100644 --- a/tasks/practice2/practice2.py +++ b/tasks/practice2/practice2.py @@ -1,4 +1,5 @@ from typing import Iterable +import random UNCULTURED_WORDS = ('kotleta', 'pirog') @@ -13,6 +14,7 @@ def greet_user(name: str) -> str: """ # пиши код здесь + greeting = "Hello " + name return greeting @@ -29,6 +31,7 @@ def get_amount() -> float: """ # пиши код здесь + amount = round(random.uniform(100, 1000000), 2) return amount @@ -43,6 +46,12 @@ def is_phone_correct(phone_number: str) -> bool: """ # пиши код здесь + result = False + if phone_number[0] == '+': + if phone_number[1] == '7': + if len(phone_number) == 12: + if phone_number[1:].isdigit(): + result = True return result @@ -59,6 +68,9 @@ def is_amount_correct(current_amount: float, transfer_amount: str) -> bool: """ # пиши код здесь + result = True + if float(transfer_amount) > current_amount: + result = False return result @@ -78,6 +90,14 @@ def moderate_text(text: str, uncultured_words: Iterable[str]) -> str: """ # пиши код здесь + a = text + a = ' '.join(a.split()) + a = a.capitalize() + a = a.replace("'", "") + a = a.replace('"', '') + a = a.replace('kotleta', '#######') + a = a.replace('pirog', '#####') + result = a return result @@ -101,4 +121,6 @@ def create_request_for_loan(user_info: str) -> str: """ # пиши код здесь + data = user_info.split(',') + result = "Фамилия: " + data[0] + "\nИмя: " + data[1] + "\nОтчество: " + data[2] + "\nДата рождения: " + data[3] + "\nЗапрошенная сумма: " + data[4] return result diff --git a/tasks/practice3/practice3.py b/tasks/practice3/practice3.py index 9115c9c..e7c2015 100644 --- a/tasks/practice3/practice3.py +++ b/tasks/practice3/practice3.py @@ -1,6 +1,9 @@ from pathlib import Path from typing import Dict, Any, List, Optional +import csv + +PUNCTUATION_MARKS = ['.', ',', ';', '?', '!', '-', ':', '"', '\'', '(', ')'] def count_words(text: str) -> Dict[str, int]: """ @@ -27,8 +30,18 @@ def count_words(text: str) -> Dict[str, int]: """ # пиши свой код здесь + text = text.lower() + for mark in PUNCTUATION_MARKS: + if mark in text: + text = text.replace(mark, '') + words = text.split() + dictionary = {} + for word in words: + if dictionary.get(word) == None and word.isalpha(): + dictionary[word] = words.count(word) + + return dictionary - return {} def exp_list(numbers: List[int], exp: int) -> List[int]: @@ -41,8 +54,9 @@ def exp_list(numbers: List[int], exp: int) -> List[int]: """ # пиши свой код здесь + result = [number ** exp for number in numbers] - return [] + return result def get_cashback(operations: List[Dict[str, Any]], special_category: List[str]) -> float: @@ -58,6 +72,14 @@ def get_cashback(operations: List[Dict[str, Any]], special_category: List[str]) :return: размер кешбека """ + result = 0 + for operation in operations: + if operation['category'] in special_category: + result += operation['amount'] * 0.05 + else: + result += operation['amount'] * 0.01 + + return result @@ -100,5 +122,16 @@ def csv_reader(header: str) -> int: """ # пиши свой код здесь - - return 0 + column = [] + with open(get_path_to_file()) as file: + csv_file = csv.DictReader(file) + for row in csv_file: + column.append(row[header]) + + unique_elements = [] + for element in column: + if element not in unique_elements: + unique_elements.append(element) + + return len(unique_elements) + diff --git a/tasks/practice4/practice4.py b/tasks/practice4/practice4.py index a7d6b8d..f31d00d 100644 --- a/tasks/practice4/practice4.py +++ b/tasks/practice4/practice4.py @@ -39,5 +39,15 @@ def search_phone(content: Any, name: str) -> Optional[str]: """ # пиши свой код здесь - - return None + if isinstance(content, list): + for value in content: + result = search_phone(value, name) + if result is not None: + return result + elif isinstance(content, dict): + if name in content.values(): + return content.get('phone') + for value in content.values(): + result = search_phone(value, name) + if result is not None: + return result \ No newline at end of file diff --git a/tasks/practice5/employee.py b/tasks/practice5/employee.py index 1d7bad8..fdfeb62 100644 --- a/tasks/practice5/employee.py +++ b/tasks/practice5/employee.py @@ -37,14 +37,22 @@ def __init__(self, name: str, position: str, salary: int): """ Задача: реализовать конструктор класса, чтобы все тесты проходили """ - + self.name = name + if not isinstance(name, str): + raise ValueError('name must be a string') + self.position = position + if not isinstance(position, str): + raise ValueError('position must be a string') + self._salary = salary + if not isinstance(salary, int): + raise ValueError('salary must be int') # пиши свой код здесь def get_salary(self) -> int: """ Метод возвращает зарплату сотрудника. """ - + return self._salary # пиши свой код здесь def __eq__(self, other: object) -> bool: @@ -54,7 +62,12 @@ def __eq__(self, other: object) -> bool: Сравнение происходит по уровню позиции см. `get_position_level`. Если что-то идет не так - бросаются исключения. Смотрим что происходит в тестах. """ - + if not isinstance(other, Employee): + raise TypeError("Cannot compare Employee with non-Employee object") + try: + return get_position_level(self.position) == get_position_level(other.position) + except NoSuchPositionError: + raise ValueError("Cannot compare Employee objects with undefined positions") # пиши свой код здесь def __str__(self): @@ -62,7 +75,7 @@ def __str__(self): Задача: реализовать строковое представление объекта. Пример вывода: 'name: Ivan position manager' """ - + return f'name: {self.name} position: {self.position}' # пиши свой код здесь def __hash__(self): @@ -81,7 +94,8 @@ def __init__(self, name: str, salary: int, language: str): """ Задача: реализовать конструктор класса, используя конструктор родителя """ - + super().__init__(name, self.position, salary) + self.language = language # пиши свой код здесь @@ -96,5 +110,5 @@ def __init__(self, name: str, salary: int): """ Задача: реализовать конструктор класса, используя конструктор родителя """ - + super().__init__(name, self.position, salary) # пиши свой код здесь diff --git a/tasks/practice5/team.py b/tasks/practice5/team.py index 934796c..ecfd545 100644 --- a/tasks/practice5/team.py +++ b/tasks/practice5/team.py @@ -26,7 +26,9 @@ def __init__(self, name: str, manager: Manager): Конструктор должен присвоить значения публичным атрибутам и инициализировать контейнер `__members` """ - + self.name = name + self.manager = manager + self.__members = set() # пиши свой код здесь def add_member(self, member: Employee) -> None: @@ -34,7 +36,9 @@ def add_member(self, member: Employee) -> None: Задача: реализовать метод добавления участника в команду. Добавить можно только работника. """ - + if not isinstance(member, Employee): + raise TypeError("Only instances of Employee can be added to the team") + self.__members.add(member) # пиши свой код здесь def remove_member(self, member: Employee) -> None: @@ -42,7 +46,11 @@ def remove_member(self, member: Employee) -> None: Задача: реализовать метод удаления участника из команды. Если в команде нет такого участника поднимается исключение `NoSuchMemberError` """ - + if not isinstance(member, Employee): + raise TypeError("Only instances of Employee can be removed from the team") + if member not in self.__members: + raise NoSuchMemberError(self.name, member) + self.__members.remove(member) # пиши свой код здесь def get_members(self) -> Set[Employee]: @@ -50,7 +58,10 @@ def get_members(self) -> Set[Employee]: Задача: реализовать метод возвращения списка участков команды та, чтобы из вне нельзя было поменять список участников внутри класса """ + return self.__members.copy() + def __str__(self): + return f'team: {self.name} manager: {self.manager.name} number of members: {len(self.__members)}' # пиши свой код здесь def show(self) -> None: