Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
30 changes: 30 additions & 0 deletions task1_palindrome/palindrome_shefler.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
# Задача 1: Проверка является ли строка палиндромом
def is_palindrome(s: str) -> bool:
# входной параметр s - строка
# возвращаем true или false (палиндром или нет)

# приводим к нижнему регистру и оставляем только буквы и цифры
cleaned = ''.join(char.lower() for char in s if char.isalnum())

# сравниваем строку с её перевёрнутой версией
return cleaned == cleaned[::-1]

def main():
# тестируем
test_cases = [
"Hello, world!",
"И темен город. Мороз, узором дорог не мети.",
"12321",
"A man, a plan, a canal, Panama!",
"Не палиндром",
"",
"m",
]

print("Тест:")
for test in test_cases:
result = is_palindrome(test)
print(f"'{test}' - {result}")

if __name__ == "__main__":
main()
71 changes: 71 additions & 0 deletions task2_filter/filter_shefler.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,71 @@
# Задача 2: Фильтрация массива строк с помощью лямбда-функций
from typing import Callable, List
import re

def filter_strings(filter_func: Callable[[str], bool], strings: List[str]) -> List[str]:
# фильтрует массив строк согласно лямбда-функции
# входные параметры: strings - строки для фильтрации
# filter_func - функция фильтрации, возвращает значение типа bool
# возвращаем отфильтрованные строки

return [s for s in strings if filter_func(s)]


def main():
# тестируем
test_strings = [
"hello world",
"dog",
"cat",
"amazing",
"awful",
"python",
"c++"
"a",
" ",
"long string with spaces",
"long_string_without_spaces",
"кит",
"12345",
"a good person"
]

print("Исходный массив строк:")
for i, s in enumerate(test_strings, 1):
print(f" {i}. '{s}'")

# Фильтр 1: Исключить строки с пробелами
print("\n" + "="*60)
print("1. Исключены строки с пробелами:")
no_spaces_filter = lambda s: ' ' not in s
result1 = filter_strings(no_spaces_filter, test_strings)
for s in result1:
print(f" '{s}'")

# Фильтр 2: Исключить строки, начинающиеся с буквы "a" (не зависит от регистра и алфавита)
print("\n" + "="*60)
print("2. Исключены строки, начинающиеся с буквы 'a':")
not_start_with_a = lambda s: not s.lower().startswith('a') or s.lower().startswith('а')
result2 = filter_strings(not_start_with_a, test_strings)
for s in result2:
print(f" '{s}'")

# Фильтр 3: Исключить строки, длина которых меньше 5
print("\n" + "="*60)
print("3. Исключены строки, длина которых меньше 5:")
length_ge_5 = lambda s: len(s) >= 5
result3 = filter_strings(length_ge_5, test_strings)
for s in result3:
print(f" '{s}'")

# Комбинация фильтров
print("\n" + "="*60)
print("Исключены строки короче 5 И начинающиеся не с 'a':")
combined_filter = lambda s: len(s) >= 5 and not s.lower().startswith('a')
result4 = filter_strings(combined_filter, test_strings)
for s in result4:
print(f" '{s}'")


if __name__ == "__main__":
main()
180 changes: 180 additions & 0 deletions task3_shapes/shapes_shefler.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,180 @@
#Задача 3: Иерархия классов геометрических фигур
from abc import ABC, abstractmethod
from math import pi
from typing import Union

class Shape(ABC):
#базовый класс для всех фигур

@abstractmethod
#вычисление площади
def area(self) -> float:
pass

@abstractmethod
#вычисление периметра
def perimeter(self) -> float:
pass

def compare_area(self, other: 'Shape') -> str:
#сравнение площадей фигуры self (текушей) с other (другой)
# возвращает строку с пояснением
if self.area() > other.area():
return f"Площадь {self.__class__.__name__} ({self.area():.2f}) > площади {other.__class__.__name__} ({other.area():.2f})"
elif self.area() < other.area():
return f"Площадь {self.__class__.__name__} ({self.area():.2f}) < площади {other.__class__.__name__} ({other.area():.2f})"
else:
return f"Площади равны: {self.area():.2f}"

def compare_perimeter(self, other: 'Shape') -> str:
#сравнение перметра фигуры self (текушей) с other (другой)
# возвращает строку с пояснением
if self.perimeter() > other.perimeter():
return f"Периметр {self.__class__.__name__} ({self.perimeter():.2f}) > периметра {other.__class__.__name__} ({other.perimeter():.2f})"
elif self.perimeter() < other.perimeter():
return f"Периметр {self.__class__.__name__} ({self.perimeter():.2f}) < периметра {other.__class__.__name__} ({other.perimeter():.2f})"
else:
return f"Периметры равны: {self.perimeter():.2f}"


class Square(Shape):

def __init__(self, side: float):
#инициализация квадрата по длине стороны
#обработка при ошбке
if side <= 0:
raise ValueError("Сторона должна быть положительным числом")
self.side = side

def area(self) -> float:
# вычисление площади квадрата
return self.side ** 2

def perimeter(self) -> float:
# вычисление периметра квадрата
return 4 * self.side

# пояснение касательно конкретного квадрата
def __str__(self) -> str:
return f"Квадрат (сторона={self.side})"


class Rectangle(Shape):

def __init__(self, width: float, height: float):
#инициализация прямоугольника по длине сторон
#обработка при ошбке
if width <= 0 or height <= 0:
raise ValueError("Ширина и высота должны быть положительными числами")
self.width = width
self.height = height

def area(self) -> float:
# площадь
return self.width * self.height

def perimeter(self) -> float:
#периметр
return 2 * (self.width + self.height)

def __str__(self) -> str:
return f"Прямоугольник (ширина={self.width}, высота={self.height})"


class Triangle(Shape):

def __init__(self, side_a: float, side_b: float, side_c: float):
# инициализация трегуольник апо трем сторонам
#обработк апри ошибке (в том числе на неравенство, чтобы треугольник существовал)
if side_a <= 0 or side_b <= 0 or side_c <= 0:
raise ValueError("Все стороны должны быть положительными числами")
if (side_a + side_b <= side_c) or (side_a + side_c <= side_b) or (side_b + side_c <= side_a):
raise ValueError("Стороны не образуют треугольник")

self.side_a = side_a
self.side_b = side_b
self.side_c = side_c

def area(self) -> float:
#площадь треугольника (формула Герона)
p = self.perimeter() / 2
return (p * (p - self.side_a) * (p - self.side_b) * (p - self.side_c)) ** 0.5

def perimeter(self) -> float:
# периметр
return self.side_a + self.side_b + self.side_c

def __str__(self) -> str:
return f"Треугольник (стороны={self.side_a}, {self.side_b}, {self.side_c})"


class Circle(Shape):

def __init__(self, radius: float):
#инициализация круга по радиусу и обработка ошибок
if radius <= 0:
raise ValueError("Радиус должен быть положительным числом")
self.radius = radius

def area(self) -> float:
#площадь круга
return pi * self.radius ** 2

def perimeter(self) -> float:
#периметр круга
return 2 * pi * self.radius

def __str__(self) -> str:
return f"Круг (радиус={self.radius})"


def main():
# Тестирование

# Создаем фигуры
square = Square(6)
rectangle = Rectangle(3, 7)
triangle = Triangle(2, 4, 4)
circle = Circle(7)

shapes = [square, rectangle, triangle, circle]

print("=" * 60)
print("Информация о фигурах:")
print("=" * 60)

for shape in shapes:
print(f"\n{shape}")
print(f" Площадь: {shape.area():.2f}")
print(f" Периметр: {shape.perimeter():.2f}")

# Сравнение площадей
print("\n" + "=" * 60)
print("Сравнение площадей:")
print("=" * 60)
print(square.compare_area(rectangle))
print(square.compare_area(circle))
print(triangle.compare_area(square))
print(circle.compare_area(rectangle))

# Сравнение периметров
print("\n" + "=" * 60)
print("Сравнение периметров:")
print("=" * 60)
print(square.compare_perimeter(rectangle))
print(rectangle.compare_perimeter(circle))
print(triangle.compare_perimeter(square))
print(circle.compare_perimeter(triangle))

# сравнение одинаковых по площади и периметру квадрата и прямоугольника
print("\n" + "=" * 60)
print("Сравнение одинаковых по площади и периметру квадрата и прямоугольника (3 на 3):")
print("=" * 60)
square2 = Square(3)
rectangle2 = Rectangle(3, 3)
print(square2.compare_area(rectangle2))
print(square2.compare_perimeter(rectangle2))


if __name__ == "__main__":
main()
104 changes: 104 additions & 0 deletions task4_students/students_shefler.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,104 @@
# Задача 4: Студенты и аспиранты
# Создаем классы, которые будут связаны друг с другом (аспирант - особый вид студента)

class Student:
# базовый класс студент

def __init__(self, full_name: str, age: int, group_number: str, average_grade: float):
# у студента есть ФИО, возраст, номер группы и средний балл
self.full_name = full_name
self.age = age
self.group_number = group_number
self.average_grade = average_grade

def get_info(self) -> str:
#возвращает информацию о человеке
return f"ФИО: {self.full_name}, Возраст: {self.age} лет, Номер группы: {self.group_number}, Средний балл: {self.average_grade}"

def get_scholarship(self) -> int:
#буду считать, что без стипендии студент остается, если средний балл 4 и больше
if self.average_grade == 5.0:
return 6000
elif self.average_grade < 5.0 and self.average_grade >= 4.0:
return 4000
else:
# Если балл ниже 3.0 или например отрицательный
return 0

def compare_scholarship(self, other) -> str:
# сравниваем стипендии студентов как это делали с параметрами фигур
my_scholarship = self.get_scholarship()
other_scholarship = other.get_scholarship()

if my_scholarship > other_scholarship:
return f"Стипендия {self.full_name} ({my_scholarship}р) > стипендии {other.full_name} ({other_scholarship}р)"
elif my_scholarship < other_scholarship:
return f"Стипендия {self.full_name} ({my_scholarship}р) < стипендии {other.full_name} ({other_scholarship}р)"
else:
return f"Стипендии равны: {my_scholarship}р у {self.full_name} и {other.full_name}"


class GraduateStudent(Student):
# класс аспирант с научной работой

def __init__(self, full_name: str, age: int, group_number: str, average_grade: float, research_topic: str):
#вызываем метод родителя через super() чтобы задать параметры студента, а затем добавляем науч работу
super().__init__(full_name, age, group_number, average_grade)
self.research_topic = research_topic # добавляем новое свойство - тему научной работы

def get_info(self) -> str:
#дополняем также метод вывода научной работой
base_info = super().get_info() # берем родительскую инфу (ФИО и возраст)
return f"{base_info}, Научная работа: '{self.research_topic}'"

def get_scholarship(self) -> int:
#переопределяем метод расчета стипендии, потому что у аспирантов она больше
if self.average_grade == 5.0:
return 8000
elif self.average_grade < 5.0 and self.average_grade >= 4.0:
return 6000
else:
return 0

def main():
#Тестируем
print("=" * 60)
print("СОЗДАНИЕ СТУДЕНТОВ И АСПИРАНТОВ")
print("=" * 60)

# Создаем обычных студентов
student1 = Student("Сычева Лина Игоревна", 20, "5142704/50801", 5.0)
student2 = Student("Петров Иван Иванович", 20, "5142704/50701", 3.2)
student3 = Student("Шефлер Валерия Александровна", 22, "5142704/50801", 4.8) # плохая успеваемость

# Создаем аспирантов
grad1 = GraduateStudent("Иванов Петр Петрович", 24, "5144704/53301", 5.0, "Искусственный интеллект и промышленные вентиляторы")
grad2 = GraduateStudent("Викторов Виктор Викторович", 24, "5174704/53321", 4.5, "Интернет вещей как инновация")

print("\nИНФОРМАЦИЯ О ЛЮДЯХ:")
print("-" * 40)
print(student1.get_info())
print(student2.get_info())
print(grad1.get_info())
print(grad2.get_info())

print("\n" + "=" * 60)
print("СТИПЕНДИИ:")
print("=" * 60)
print(f"{student1.full_name}: {student1.get_scholarship()}р (средний балл {student1.average_grade})")
print(f"{student2.full_name}: {student2.get_scholarship()}р (средний балл {student2.average_grade})")
print(f"{student3.full_name}: {student3.get_scholarship()}р (средний балл {student3.average_grade})")
print(f"{grad1.full_name}: {grad1.get_scholarship()}р (средний балл {grad1.average_grade})")
print(f"{grad2.full_name}: {grad2.get_scholarship()}р (средний балл {grad2.average_grade})")

print("\n" + "=" * 60)
print("СРАВНЕНИЕ СТИПЕНДИЙ:")
print("=" * 60)
print(student1.compare_scholarship(student2))
print(student2.compare_scholarship(grad1))
print(grad1.compare_scholarship(grad2))
print(student3.compare_scholarship(student1))
print(grad2.compare_scholarship(student2))

if __name__ == "__main__":
main()
Loading