diff --git a/tasks/practice1/practice1.py b/tasks/practice1/practice1.py index 030da70..a761ff3 100644 --- a/tasks/practice1/practice1.py +++ b/tasks/practice1/practice1.py @@ -8,7 +8,7 @@ def concatenate_strings(a: str, b: str) -> str: :return: результат сложения """ - # пиши свой код здесь + result = a + b return result @@ -22,6 +22,6 @@ def calculate_salary(total_compensation: int) -> float: :return: сумма заплаты после вычета налога """ - # пиши свой код здесь + result = total_compensation * (1 - 0.13) return result diff --git a/tasks/practice2/practice2.py b/tasks/practice2/practice2.py index 008f6d1..284a58c 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') @@ -12,7 +13,8 @@ def greet_user(name: str) -> str: :return: приветствие """ - # пиши код здесь + greeting = f"Привет, {name}!" + return greeting @@ -28,7 +30,8 @@ def get_amount() -> float: :return: случайную сумму на счете """ - # пиши код здесь + amount = round(random.uniform(100, 1000000), 2) + return amount @@ -42,7 +45,15 @@ def is_phone_correct(phone_number: str) -> bool: False - если номер некорректный """ - # пиши код здесь + result = False + if len(phone_number) == 12: + if phone_number[0] == '+' and phone_number[1] == '7': + for i in range(2, len(phone_number)): + if phone_number[i].isdigit(): + result = True + else: + result = False + break return result @@ -58,7 +69,11 @@ def is_amount_correct(current_amount: float, transfer_amount: str) -> bool: False - если денег недостаточно """ - # пиши код здесь + try: + transfer_amount = float(transfer_amount) + result = current_amount >= transfer_amount + except ValueError: + result = False return result @@ -77,7 +92,14 @@ def moderate_text(text: str, uncultured_words: Iterable[str]) -> str: :return: текст, соответсвующий правилам """ - # пиши код здесь + text = text.strip() + text = text.replace('"', '') + text = text.replace("'", '') + text = text.replace(" ", " ") + text = text.capitalize() + for word in uncultured_words: + text = text.replace(word, '#' * len(word)) + result = text return result @@ -85,20 +107,23 @@ def create_request_for_loan(user_info: str) -> str: """ Генерирует заявку на кредит на основе входящей строки. Формат входящий строки: - + Иванов,Петр,Сергеевич,01.01.1991,10000 - + Что должны вернуть на ее основе: - + Фамилия: Иванов Имя: Петр Отчество: Сергеевич Дата рождения: 01.01.1991 Запрошенная сумма: 10000 - + :param user_info: строка с информацией о клиенте :return: текст кредитной заявки """ - # пиши код здесь + parts = user_info.split(',') + result = "Фамилия: {}\nИмя: {}\nОтчество: {}\nДата рождения: {}\nЗапрошенная сумма: {}".format(parts[0], parts[1], + parts[2], parts[3], + parts[4]) return result diff --git a/tasks/practice3/practice3.py b/tasks/practice3/practice3.py index 9115c9c..13a1524 100644 --- a/tasks/practice3/practice3.py +++ b/tasks/practice3/practice3.py @@ -1,6 +1,6 @@ from pathlib import Path from typing import Dict, Any, List, Optional - +import csv def count_words(text: str) -> Dict[str, int]: """ @@ -26,10 +26,16 @@ def count_words(text: str) -> Dict[str, int]: значение - количество вхождений слов в текст """ - # пиши свой код здесь - - return {} - + words = {} + for word in text.split(): + word = word.strip(".,!?;:'-") + if word.isalpha() and len(word) > 1: + word = word.lower() + if word in words: + words[word] += 1 + else: + words[word] = 1 + return words def exp_list(numbers: List[int], exp: int) -> List[int]: """ @@ -40,9 +46,7 @@ def exp_list(numbers: List[int], exp: int) -> List[int]: :return: список натуральных чисел """ - # пиши свой код здесь - - return [] + return [number ** exp for number in numbers] def get_cashback(operations: List[Dict[str, Any]], special_category: List[str]) -> float: @@ -58,7 +62,13 @@ def get_cashback(operations: List[Dict[str, Any]], special_category: List[str]) :return: размер кешбека """ - return result + cashback = 0 + for operation in operations: + if operation['category'] in special_category: + cashback += operation['amount'] * 0.05 + else: + cashback += operation['amount'] * 0.01 + return cashback def get_path_to_file() -> Optional[Path]: @@ -99,6 +109,12 @@ def csv_reader(header: str) -> int: :return: количество уникальных элементов в столбце """ - # пиши свой код здесь + unique_elements = set() + with open(get_path_to_file(), 'r', encoding='utf-8') as file: + reader = csv.reader(file) + headers = next(reader) + index = headers.index(header) + for row in reader: + unique_elements.add(row[index]) + return len(unique_elements) - return 0 diff --git a/tasks/practice4/practice4.py b/tasks/practice4/practice4.py index a7d6b8d..af98ef9 100644 --- a/tasks/practice4/practice4.py +++ b/tasks/practice4/practice4.py @@ -38,6 +38,17 @@ def search_phone(content: Any, name: str) -> Optional[str]: :return: номер телефона пользователя или None """ - # пиши свой код здесь - + if isinstance(content, dict): + if 'name' in content and content['name'] == name: + return content.get('phone') + else: + for value in content.values(): + result = search_phone(value, name) + if result is not None: + return result + elif isinstance(content, list): + for item in content: + result = search_phone(item, name) + if result is not None: + return result return None diff --git a/tasks/practice5/employee.py b/tasks/practice5/employee.py index 1d7bad8..945269b 100644 --- a/tasks/practice5/employee.py +++ b/tasks/practice5/employee.py @@ -12,7 +12,7 @@ def get_position_level(position_name: str) -> int: """ - Функция возвращает уровень позиции по ее названию. + Функция возвращает уровень позиции по ее названию. Если должности нет в базе поднимается исключение `NoSuchPositionError(position_name)` """ try: @@ -38,14 +38,21 @@ def __init__(self, name: str, position: str, salary: int): Задача: реализовать конструктор класса, чтобы все тесты проходили """ - # пиши свой код здесь + if not isinstance(salary, int): + raise ValueError() + if salary <= 0: + raise EmployeeError(position) + self.name = name + self.position = position + self._salary = salary + def get_salary(self) -> int: """ Метод возвращает зарплату сотрудника. """ - # пиши свой код здесь + return self._salary def __eq__(self, other: object) -> bool: """ @@ -55,7 +62,11 @@ def __eq__(self, other: object) -> bool: Если что-то идет не так - бросаются исключения. Смотрим что происходит в тестах. """ - # пиши свой код здесь + if not isinstance(other, Employee): + raise TypeError("Can only compare Employee objects") + if self.position not in POSITIONS or other.position not in POSITIONS: + raise ValueError("Position not found in the database") + return get_position_level(self.position) == get_position_level(other.position) def __str__(self): """ @@ -63,7 +74,7 @@ def __str__(self): Пример вывода: 'name: Ivan position manager' """ - # пиши свой код здесь + return f'name: {self.name} position: {self.position}' def __hash__(self): return id(self) @@ -82,7 +93,8 @@ def __init__(self, name: str, salary: int, language: str): Задача: реализовать конструктор класса, используя конструктор родителя """ - # пиши свой код здесь + super().__init__(name, self.position, salary) + self.language = language class Manager(Employee): @@ -97,4 +109,4 @@ def __init__(self, name: str, salary: int): Задача: реализовать конструктор класса, используя конструктор родителя """ - # пиши свой код здесь + super().__init__(name, self.position, salary) \ No newline at end of file diff --git a/tasks/practice5/team.py b/tasks/practice5/team.py index 934796c..b595697 100644 --- a/tasks/practice5/team.py +++ b/tasks/practice5/team.py @@ -27,7 +27,13 @@ def __init__(self, name: str, manager: Manager): и инициализировать контейнер `__members` """ - # пиши свой код здесь + if not isinstance(name, str): + raise TypeError("Team name must be a string") + if not isinstance(manager, Manager): + raise TypeError("Manager must be a Manager object") + self.name = name + self.manager = manager + self.__members: Set[Employee] = set() def add_member(self, member: Employee) -> None: """ @@ -35,7 +41,9 @@ def add_member(self, member: Employee) -> None: Добавить можно только работника. """ - # пиши свой код здесь + if not isinstance(member, Employee): + raise TypeError("Member must be an Employee object") + self.__members.add(member) def remove_member(self, member: Employee) -> None: """ @@ -43,7 +51,11 @@ def remove_member(self, member: Employee) -> None: Если в команде нет такого участника поднимается исключение `NoSuchMemberError` """ - # пиши свой код здесь + if not isinstance(member, Employee): + raise TypeError("Member must be an Employee object") + if member not in self.__members: + raise NoSuchMemberError(self.name, member) + self.__members.remove(member) def get_members(self) -> Set[Employee]: """ @@ -51,7 +63,15 @@ def get_members(self) -> Set[Employee]: чтобы из вне нельзя было поменять список участников внутри класса """ - # пиши свой код здесь + return self.__members.copy() + + def __str__(self): + """ + функция реализует строковое представление объекта. + Пример вывода: 'team: {team_name} manager: {manager_name} number of members: {members_count)}' + """ + return f'team: {self.name} manager: {self.manager.name} number of members: {len(self.get_members())}' + def show(self) -> None: """