diff --git a/lesson01/home_work/hw01_easy.py b/lesson01/home_work/hw01_easy.py index f927b0b06..bc3654367 100644 --- a/lesson01/home_work/hw01_easy.py +++ b/lesson01/home_work/hw01_easy.py @@ -1,5 +1,5 @@ -__author__ = 'Ваши Ф.И.О.' +__author__ = 'Субботин Андрей Владимирович' # Задача-1: Дано произвольное целое число (число заранее неизвестно). # Вывести поочередно цифры исходного числа (порядок вывода цифр неважен). @@ -7,7 +7,12 @@ # * постарайтесь решить задачу с применением арифметики и цикла while; # * при желании решите задачу с применением цикла for. -# код пишем тут... +num = 49845968549654165196878945165498674549874987747898 + +while num: + num_elment = num % 10 + print(num_elment) + num = num // 10 # Задача-2: Исходные значения двух переменных запросить у пользователя. @@ -18,7 +23,21 @@ # Не нужно решать задачу так: # print("a = ", b, "b = ", a) - это неправильное решение! +a = input('Enter first number: \n') +b = input('Enter second number: \n') + +a, b = b, a +print ('Now first number is: ', a, ' and the secoend is: ', b) + # Задача-3: Запросите у пользователя его возраст. # Если ему есть 18 лет, выведите: "Доступ разрешен", # иначе "Извините, пользование данным ресурсом только с 18 лет" + + +age = input('How old are you: \n') + +if int(age) > 18: + print('Access granted.') +else: + print("Sorry, this source is only for people older then 18.") diff --git a/lesson01/home_work/hw01_hard.py b/lesson01/home_work/hw01_hard.py index 7df268664..65b79318b 100644 --- a/lesson01/home_work/hw01_hard.py +++ b/lesson01/home_work/hw01_hard.py @@ -1,5 +1,5 @@ -__author__ = 'Ваши Ф.И.О.' +__author__ = 'Субботин Андрей Владимирович' # Задание-1: # Ваня набрал несколько операций в интерпретаторе и получал результаты: @@ -14,3 +14,9 @@ # если точно известно, что её значение не изменялось? # Подсказка: это значение точно есть ;) + +a = float('inf') + +print(a == a**2) +print(a == a*2) +print(a > 999999) \ No newline at end of file diff --git a/lesson01/home_work/hw01_normal.py b/lesson01/home_work/hw01_normal.py index 991724e9a..19ad42c81 100644 --- a/lesson01/home_work/hw01_normal.py +++ b/lesson01/home_work/hw01_normal.py @@ -1,5 +1,7 @@ -__author__ = 'Ваши Ф.И.О.' +__author__ = 'Субботин Андрей Владимирович' + +from math import sqrt # Задача-1: Дано произвольное целое число, вывести самую большую цифру этого числа. # Например, дается x = 58375. @@ -10,6 +12,20 @@ # * постарайтесь решить задачу с применением арифметики и цикла while; # * при желании и понимании решите задачу с применением цикла for. +num = 7854632568455841123657 +max_num = 0 + +while num: + num_element = num % 10 + if num_element == 9: + print("Maximum number is 9") + break + else: + if num_element > max_num: + max_num = num_element + num = num // 10 +else: + print(max_num) # Задача-2: Исходные значения двух переменных запросить у пользователя. # Поменять значения переменных местами. Вывести новые значения на экран. @@ -18,6 +34,11 @@ # * постарайтесь сделать решение через действия над числами; # * при желании и понимании воспользуйтесь синтаксисом кортежей Python. +a = input('Enter first number: \n') +b = input('Enter second number: \n') + +a, b = b, a +print ('Now first number is: ', a, ' and the secoend is: ', b) # Задача-3: Напишите программу, вычисляющую корни квадратного уравнения вида # ax² + bx + c = 0. @@ -25,3 +46,21 @@ # Для вычисления квадратного корня воспользуйтесь функцией sqrt() модуля math: # import math # math.sqrt(4) - вычисляет корень числа 4 + +print('Введите коэффициенты для квадратного уравнения (ax² + bx + c = 0):') +a = float(input('a =\n ')) +b = float(input('b =\n ')) +c = float(input('c =\n ')) + +discr = b ** 2 - 4 * a * c +print('Дискриминант D = %.2f' % discr) + +if discr > 0: + x1 = (-b + sqrt(discr)) / (2 * a) + x2 = (-b - sqrt(discr)) / (2 * a) + print('x1 = %.2f \nx2 = %.2f' % (x1, x2)) +elif discr == 0: + x = -b / (2 * a) + print('x = %.2f' % x) +else: + print('Корней нет') diff --git a/lesson02/home_work/hw02_easy.py b/lesson02/home_work/hw02_easy.py index ed4447e50..45397993f 100644 --- a/lesson02/home_work/hw02_easy.py +++ b/lesson02/home_work/hw02_easy.py @@ -1,3 +1,5 @@ +__author__ = 'Субботин Андрей Владимирович' + # Задача-1: # Дан список фруктов. # Напишите программу, выводящую фрукты в виде нумерованного списка, @@ -12,14 +14,33 @@ # 4. арбуз # Подсказка: воспользоваться методом .format() +fruits = ["яблоко", "банан", "киви", "арбуз"] +for i, fruit in enumerate(fruits): + print('{}.{:>7}'.format(i + 1, fruit)) # Задача-2: # Даны два произвольные списка. # Удалите из первого списка элементы, присутствующие во втором списке. +list_a = {1, 2, 3, 4, 5,} +list_b = {3, 4, 5, 6, 7,} + +print(list_a.difference(list_b)) # Задача-3: # Дан произвольный список из целых чисел. # Получите НОВЫЙ список из элементов исходного, выполнив следующие условия: # если элемент кратен двум, то разделить его на 4, если не кратен, то умножить на два. + +list_c = [1, 2, 3, 4, 5, 6, 7, 8, 9,] +list_d = [] + +for itm in list_c: + print(itm) + if (itm % 2) == 0: + list_d.append(itm / 4) + else: + list_d.append(itm * 2) + +print(list_d) \ No newline at end of file diff --git a/lesson02/home_work/hw02_hard.py b/lesson02/home_work/hw02_hard.py index c96843184..edb551ece 100644 --- a/lesson02/home_work/hw02_hard.py +++ b/lesson02/home_work/hw02_hard.py @@ -1,30 +1,3 @@ -# Задание-1: уравнение прямой вида y = kx + b задано в виде строки. -# Определить координату y точки с заданной координатой x. - -equation = 'y = -12x + 11111140.2121' -x = 2.5 -# вычислите и выведите y - - -# Задание-2: Дата задана в виде строки формата 'dd.mm.yyyy'. -# Проверить, корректно ли введена дата. -# Условия корректности: -# 1. День должен приводиться к целому числу в диапазоне от 1 до 30(31) -# (в зависимости от месяца, февраль не учитываем) -# 2. Месяц должен приводиться к целому числу в диапазоне от 1 до 12 -# 3. Год должен приводиться к целому положительному числу в диапазоне от 1 до 9999 -# 4. Длина исходной строки для частей должна быть в соответствии с форматом -# (т.е. 2 символа для дня, 2 - для месяца, 4 - для года) - -# Пример корректной даты -date = '01.11.1985' - -# Примеры некорректных дат -date = '01.22.1001' -date = '1.12.1001' -date = '-2.10.3001' - - # Задание-3: "Перевёрнутая башня" (Задача олимпиадного уровня) # # Вавилонцы решили построить удивительную башню — @@ -33,6 +6,11 @@ # затем идет два этажа, на каждом из которых по две комнаты, # затем идёт три этажа, на каждом из которых по три комнаты и так далее: # ... +# +# 27 28 29 30 +# 23 24 25 26 +# 19 20 21 22 +# 15 16 17 18 # 12 13 14 # 9 10 11 # 6 7 8 @@ -53,4 +31,34 @@ # Выход: 6 2 # # Вход: 11 -# Выход: 5 3 \ No newline at end of file +# Выход: 5 3 + +from math import sqrt + +def tower_elevator(seecing_room): + start_room = 0 + floors = 0 + + for floore_group in range(1,2000000): + rooms_count = start_room + floore_group ** 2 + if seecing_room in range(start_room, rooms_count + 1): + + if int((seecing_room - start_room) % sqrt(rooms_count - start_room)): + current_group_flor = int((seecing_room - start_room) // sqrt(rooms_count - start_room)) + 1 + else: + current_group_flor = int((seecing_room - start_room) // sqrt(rooms_count - start_room)) + + if int((seecing_room - start_room) % sqrt(rooms_count - start_room)): + room = int((seecing_room - start_room) % sqrt(rooms_count - start_room)) + else: + room = int(sqrt(rooms_count - start_room)) + + print(current_group_flor + floors , room) + + break + + start_room = start_room + floore_group ** 2 + floors += floore_group + + +tower_elevator(25) diff --git a/lesson02/home_work/hw02_normal.py b/lesson02/home_work/hw02_normal.py index 3acfaabb6..b303a2395 100644 --- a/lesson02/home_work/hw02_normal.py +++ b/lesson02/home_work/hw02_normal.py @@ -1,3 +1,5 @@ +__author__ = 'Субботин Андрей Владимирович' + # Задача-1: # Дан список, заполненный произвольными целыми числами, получите новый список, # элементами которого будут квадратные корни элементов исходного списка, @@ -5,17 +7,56 @@ # если такой корень вообще можно извлечь # Пример: Дано: [2, -5, 8, 9, -25, 25, 4] Результат: [3, 5, 2] +import math, random + +list_a = [2, -5, 8, 9, -25, 25, 4] +list_b = [] + +for num in list_a: + if num >= 0 and not (math.sqrt(num) % 1): + list_b.append(int(math.sqrt(num))) + +print(list_b) # Задача-2: Дана дата в формате dd.mm.yyyy, например: 02.11.2013. # Ваша задача вывести дату в текстовом виде, например: второе ноября 2013 года. # Склонением пренебречь (2000 года, 2010 года) +month = {'01': 'января', '02': 'февраля', '03': 'марта', + '04': 'апреля', '05': 'мая', '06': 'июня', + '07': 'июля', '08': 'августа', '09': 'сентября', + '10': 'октября', '11': 'ноября', '12': 'декабря', + } +days = {'01': 'первое', '02': 'второе', '03': 'третье', + '04': 'четвертое', '05': 'пятое', '06': 'шестое', + '07': 'седьмое', '08': 'восьмое', '09': 'девятое', + '10': 'десятое', '11': 'одиннадцатое', '12': 'двенадцатое', + '13': 'тринадцатое', '14': 'четырнадцатое', '15': 'пятнадцатое', + '16': 'шестнадцатое', '17': 'семнадцатое', '18': 'восемнадцатое', + '19': 'девятнадцатое', '20': 'двадцатое', '21': 'двадцать первое', + '21': 'двадцать второе', '21': 'двадцать третье', '21': 'двадцать четвертое', + '21': 'двадцать пятое', '21': 'двадцать шестое', '21': 'двадцать седьмое', + '21': 'двадцать восьмое', '21': 'двадцать девятое', '30': 'тридцатое', + '31': 'тридцать первое', + } + +date = '02.11.2013' +date_lst = date.split('.') + +print(days[date_lst[0]], month[date_lst[1]], date_lst[2], 'года') # Задача-3: Напишите алгоритм, заполняющий список произвольными целыми числами # в диапазоне от -100 до 100. В списке должно быть n - элементов. # Подсказка: # для получения случайного числа используйте функцию randint() модуля random +num_count = 100 +list_c = [] + +for num in range(num_count): + list_c.append(random.randint(-100, 100)) + +print(list_c) # Задача-4: Дан список, заполненный произвольными целыми числами. # Получите новый список, элементами которого будут: @@ -23,3 +64,16 @@ # например, lst = [1, 2, 4, 5, 6, 2, 5, 2], нужно получить lst2 = [1, 2, 4, 5, 6] # б) элементы исходного списка, которые не имеют повторений: # например, lst = [1 , 2, 4, 5, 6, 2, 5, 2], нужно получить lst2 = [1, 4, 6] + +list_d = {} +list_e = [] + +for num in list_c: + + list_d = set(list_c) + + if list_c.count(num) == 1: + list_e.append(num) + +print(list_d) +print(list_e) \ No newline at end of file diff --git a/lesson03/home_work/hw03_easy.py b/lesson03/home_work/hw03_easy.py index 63d13f646..b6c254498 100644 --- a/lesson03/home_work/hw03_easy.py +++ b/lesson03/home_work/hw03_easy.py @@ -5,8 +5,16 @@ # Для решения задачи не используйте встроенные функции и функции из модуля math. def my_round(number, ndigits): - pass + + operate_num = number * 10**ndigits + if operate_num % 1 >= 0.5: + return (operate_num + 1) // 1 / 10**ndigits + else: + return operate_num // 1 / 10**ndigits + +print(my_round(0.0045, 3)) + print(my_round(2.1234567, 5)) print(my_round(2.1999967, 5)) @@ -20,9 +28,13 @@ def my_round(number, ndigits): # !!!P.S.: функция не должна НИЧЕГО print'ить def lucky_ticket(ticket_number): - pass + if (int(str(ticket_number)[-1]) + int(str(ticket_number)[-2])) == \ + (int(str(ticket_number)[0]) + int(str(ticket_number)[1])): + return True + else: + return False print(lucky_ticket(123006)) print(lucky_ticket(12321)) -print(lucky_ticket(436751)) +print(lucky_ticket(436751)) \ No newline at end of file diff --git a/lesson03/home_work/hw03_hard.py b/lesson03/home_work/hw03_hard.py index a8c7f668a..328e6c6c3 100644 --- a/lesson03/home_work/hw03_hard.py +++ b/lesson03/home_work/hw03_hard.py @@ -10,6 +10,7 @@ # Вывод: 1 1/3 + # Задание-2: # Дана ведомость расчета заработной платы (файл "data/workers"). # Рассчитайте зарплату всех работников, зная что они получат полный оклад, diff --git a/lesson03/home_work/hw03_normal.py b/lesson03/home_work/hw03_normal.py index 38ac1fcc1..a6855e6bb 100644 --- a/lesson03/home_work/hw03_normal.py +++ b/lesson03/home_work/hw03_normal.py @@ -3,7 +3,14 @@ # Первыми элементами ряда считать цифры 1 1 def fibonacci(n, m): - pass + fibonacci = [1, 1] + + while m > len(fibonacci): + fibonacci.append(fibonacci[-1] + fibonacci[-2]) + + return fibonacci[n-1:m] + +print (fibonacci(1, 30)) # Задача-2: # Напишите функцию, сортирующую принимаемый список по возрастанию. @@ -12,7 +19,28 @@ def fibonacci(n, m): def sort_to_max(origin_list): - pass + + sorted_list = [origin_list[0]] + + for origin_num in origin_list[1:]: + + for sorted_num in sorted_list[::-1]: + + if origin_num < sorted_num: + + if sorted_list.index(sorted_num)== 0: + + sorted_list.insert(0, origin_num) + break + + else: + + sorted_list.insert(sorted_list.index(sorted_num) + 1, origin_num) + + break + + print(sorted_list) + sort_to_max([2, 10, -12, 2.5, 20, -11, 4, 4, 0]) @@ -20,8 +48,35 @@ def sort_to_max(origin_list): # Напишите собственную реализацию стандартной функции filter. # Разумеется, внутри нельзя использовать саму функцию filter. +def user_filter(func, itterible): + filtred_args = [] + for itm in itterible: + if func(itm): + filtred_args.append(itm) + + return tuple(filtred_args) + +print(list(user_filter(lambda x: x > 5, [2, 10, -10, 8, 2, 0, 14]))) # Задача-4: # Даны четыре точки А1(х1, у1), А2(x2 ,у2), А3(x3 , у3), А4(х4, у4). # Определить, будут ли они вершинами параллелограмма. +def parallelogram(a1, a2, a3, a4): + for axis in zip(a1, a2, a3, a4): + axis = sorted(axis) + if (axis[0] - axis[1]) == (axis[2] - axis[3]): + pass + else: + return False + return True + + + +a1 = (-2, 2) +a2 = (-2 ,-2) +a3 = (1, 1) +a4 = (1, -1) + + +print(parallelogram(a1, a2, a3, a4)) \ No newline at end of file diff --git a/lesson04/home_work/hw04_easy.py b/lesson04/home_work/hw04_easy.py index 85035ea8b..2aa0b289d 100644 --- a/lesson04/home_work/hw04_easy.py +++ b/lesson04/home_work/hw04_easy.py @@ -6,13 +6,43 @@ # квадратами элементов исходного списка # [1, 2, 4, 0] --> [1, 4, 16, 0] +list_a = [1, 2, 4, 0] +list_b = [itm**2 for itm in list_a] +print(list_b) + # Задание-2: # Даны два списка фруктов. # Получить список фруктов, присутствующих в обоих исходных списках. +fruit_list_a = ["яблоко", "банан", "киви", "арбуз", "груша"] + +fruit_list_b = ["киви", "арбуз", "груша", "персик", "слива"] + +fruit_list_c = [] + +itm = None + +fruit_list_c = list(filter(lambda item: item, [itm if itm in fruit_list_b else None for itm in fruit_list_a])) +print (fruit_list_c) + # Задание-3: # Дан список, заполненный произвольными числами. # Получить список из элементов исходного, удовлетворяющих следующим условиям: # + Элемент кратен 3 # + Элемент положительный # + Элемент не кратен 4 + +fruit_list_d = [-135, 52, 43, 894, 105, 56, -799, 88, 459, 58, 66, 78] +fruit_list_d = list(filter(lambda item: item, [itm if itm % 3 == 0 else None for itm in fruit_list_d])) + +print(fruit_list_d) + +fruit_list_d = [-135, 52, 43, 894, 105, 56, -799, 88, 459, 58, 66, 78] +fruit_list_d = list(filter(lambda item: item, [itm if itm > 0 else None for itm in fruit_list_d])) + +print(fruit_list_d) + +fruit_list_d = [-135, 52, 43, 894, 105, 56, -799, 88, 459, 58, 66, 78, 8] +fruit_list_d = list(filter(lambda item: item, [itm if itm % 4 != 0 else None for itm in fruit_list_d])) + +print(fruit_list_d) \ No newline at end of file diff --git a/lesson04/home_work/hw04_hard.py b/lesson04/home_work/hw04_hard.py index 3b12dc315..3a0c781f5 100644 --- a/lesson04/home_work/hw04_hard.py +++ b/lesson04/home_work/hw04_hard.py @@ -13,10 +13,29 @@ # Суть сложности hard: Решите задачу в одну строку +matrix_transposition = list(zip(*matrix)) +print (matrix_transposition) + +''' Транспонирование матрицы +[(1, 3, 0), + (0, 4, 4), + (8, 1, 2)] +''' + +matrix_rotate = list(zip(*matrix[::-1])) +print (matrix_rotate) + +''' Поворот матрицы +[(0, 3, 1), + (4, 4, 0), + (2, 1, 8)] +''' # Задание-2: # Найдите наибольшее произведение пяти последовательных цифр в 1000-значном числе. # Выведите произведение и индекс смещения первого числа последовательных 5-ти цифр. # Пример 1000-значного числа: +import re + number = """ 73167176531330624919225119674426574742355349194934 96983520312774506326239578318016984801869478851843 @@ -39,6 +58,21 @@ 05886116467109405077541002256983155200055935729725 71636269561882670428252483600823257530420752963450""" +number = [int(itm) for itm in re.findall(r'\d',number)] + +max_mul5 = 0 + +for num, char in enumerate(number): + + if num == (len(number) - 5): + break + + mul5 = number[num] * number[num + 1] + number[num + 2] + number[num + 3] + number[num + 4] + + if mul5 > max_mul5: + max_mul5 = mul5 + index = num +print(max_mul5, index) # Задание-3 (Ферзи): # Известно, что на доске 8×8 можно расставить 8 ферзей так, чтобы они не били diff --git a/lesson04/home_work/hw04_normal.py b/lesson04/home_work/hw04_normal.py index 739dd33f8..6692ea37d 100644 --- a/lesson04/home_work/hw04_normal.py +++ b/lesson04/home_work/hw04_normal.py @@ -20,6 +20,30 @@ 'XiUWgsKQrDOeZoNlZNRvHnLgCmysUeKnVJXPFIzvdDyleXylnKBfLCjLHntltignbQoiQ'\ 'zTYwZAiRwycdlHfyHNGmkNqSwXUrxGc' +import re + +# re way +pattern = r'[A-Z]*([a-z]+)[A-Z]*' + +print(re.findall(pattern, line)) + +# without re way +chars = "" +result = [] + +for char in line: + if char.islower(): + chars = chars + char + elif chars: + result.append(chars) + chars = "" +if chars: + result.append(chars) + chars = "" + +print (result) + + # Задание-2: # Вывести символы в верхнем регистре, слева от которых находятся @@ -29,7 +53,7 @@ # нужно получить список строк: ['AY', 'NOGI', 'P'] # Решить задачу двумя способами: с помощью re и без. -line_2 = 'mtMmEZUOmcqWiryMQhhTxqKdSTKCYEJlEZCsGAMkgAYEOmHBSQsSUHKvSfbmxULaysm'\ +line_2 = 'kgAYEOmHBSQsSUHKvSfbmxULaysm'\ 'NOGIPHpEMujalpPLNzRWXfwHQqwksrFeipEUlTLeclMwAoktKlfUBJHPsnawvjPhfgewV'\ 'fzKTUfSYtBydXaVIpxWjNKgXANvIoumesCSSvjEGRJosUfuhRRDUuTQwLlJJJDdkVjfSA'\ 'HqnLxooisBDWuxIhyjJaXDYwdoVPnsllMngNlmkpYOlqXEFIxPqqqgAWdJsOvqppOfyIV'\ @@ -45,9 +69,66 @@ 'JFaXiUWgsKQrDOeZoNlZNRvHnLgCmysUeKnVJXPFIzvdDyleXylnKBfLCjLHntltignbQ'\ 'oiQzTYwZAiRwycdlHfyHNGmkNqSwXUrxGC' +# re way +pattern_2 = r'[a-z]{2}([A-Z]+)[A-Z]{2}' + +print(re.findall(pattern_2, line_2)) + +# without re way !!!чуть-чуть неправильно работае +upchars = "" +chars = "" +result = [] + +for char in line_2: + + if char.islower(): + chars = chars + char + + if len(upchars) > 2: + result.append(upchars[0:-2]) + upchars = "" + chars = "" + else: + upchars = "" + + + elif (len(chars) >= 2 and char.isupper()): + upchars = upchars + char + + elif char.isupper(): + chars = "" +print (result) + + + + # Задание-3: # Напишите скрипт, заполняющий указанный файл (самостоятельно задайте имя файла) # произвольными целыми цифрами, в результате в файле должно быть # 2500-значное произвольное число. # Найдите и выведите самую длинную последовательность одинаковых цифр # в вышезаполненном файле. + +import random + +with open('newfile.txt', 'w', encoding='utf-8') as f: + + for num in [random.randint(0,9) for itm in range(2500)]: + f.write(str(num)) + + + +with open('newfile.txt', 'r', encoding='utf-8') as f: + numbers =f.read() + +patterns = [r'[0]+', r'[1]+', r'[2]+', r'[3]+', r'[4]+', r'[5]+', r'[6]+', r'[7]+', r'[8]+', r'[9]+',] +list_num = [max(re.findall(pattern_n, numbers)) for pattern_n in patterns] + +max_len = 0 +max_num = 0 + +for num in list_num: + if len(num) > max_len: + max_len = len(num) + max_num = num +print(max_num) diff --git a/lesson05/home_work/hw05_easy.py b/lesson05/home_work/hw05_easy.py index c6317de2b..ab4749553 100644 --- a/lesson05/home_work/hw05_easy.py +++ b/lesson05/home_work/hw05_easy.py @@ -1,10 +1,93 @@ -# Задача-1: -# Напишите скрипт, создающий директории dir_1 - dir_9 в папке, -# из которой запущен данный скрипт. -# И второй скрипт, удаляющий эти папки. +import os -# Задача-2: -# Напишите скрипт, отображающий папки текущей директории. +if __name__ == "__main__": -# Задача-3: -# Напишите скрипт, создающий копию файла, из которого запущен данный скрипт. + # Задача-1: + # Напишите скрипт, создающий директории dir_1 - dir_9 в папке, + # из которой запущен данный скрипт. + # И второй скрипт, удаляющий эти папки. + + # создание + main_dir_path = os.path.abspath('.') + for i in range(1,10): + new_dir = os.path.join(main_dir_path, f'dir_{i}') + + if not os.path.exists(new_dir): + os.makedirs(new_dir) + + # удаление + child_dirs = [x[0] for x in os.walk(main_dir_path)][1:] + + for directory in child_dirs: + + os.rmdir(directory) + + # Задача-2: + # Напишите скрипт, отображающий папки текущей директории. + + print([x[0] for x in os.walk(os.path.abspath('.'))][1:]) + + print(list(filter(lambda item: item, [x if os.path.isdir(x) else None for x in os.listdir(os.path.abspath('.'))]))) + + with os.scandir(os.path.abspath('.')) as it: + for entry in it: + if not entry.name.startswith('.') and entry.is_dir(): + print(entry.name) + + # Задача-3: + # Напишите скрипт, создающий копию файла, из которого запущен данный скрипт. + + path = os.path.realpath(__file__) + print(path) + + +def remove_dir(directory): + + main_dir_path = os.path.abspath('.') + + directory_path = os.path.join(main_dir_path, directory) + + if os.path.exists(directory_path): + + os.rmdir(directory_path) + + else: + + print("Невозможно удалить") + + +def create_dir(directory): + + main_dir_path = os.path.abspath('.') + + directory_path = os.path.join(main_dir_path, directory) + + if not os.path.exists(directory_path): + + os.makedirs(directory_path) + + else: + + print("Невозможно создать") + + +def change_dir(directory): + + main_dir_path = os.path.abspath('.') + + directory_path = os.path.join(main_dir_path, directory) + + if os.path.exists(directory_path): + + os.chdir(directory_path) + + else: + + print("Невозможно перейти") + + +def show_dir(): + with os.scandir(os.path.abspath('.')) as it: + for entry in it: + if not entry.name.startswith('.') and entry.is_dir(): + print(entry.name) diff --git a/lesson05/home_work/hw05_hard.py b/lesson05/home_work/hw05_hard.py index 7507e47b2..ff7a374d9 100644 --- a/lesson05/home_work/hw05_hard.py +++ b/lesson05/home_work/hw05_hard.py @@ -9,6 +9,119 @@ # в Linux начинается с /, в Windows с имени диска, # все остальные пути считать относительными. +import os +import sys +import shutil + +print('sys.argv = ', sys.argv) + + +def print_help(): + print("help - получение справки") + print("mkdir - создание директории") + print("ping - тестовый ключ") + print("ls - отображение полного пути текущей директории") + print("cp - создает копию указанного файла") + print("rm - удаляет указанный файл (запросить подтверждение операции)") + print("cd - меняет текущую директорию на указанную") + print("pwd - отображение полного пути текущей директории") + + +def make_dir(): + if not fs_object_name: + print("Необходимо указать имя директории вторым параметром") + return + dir_path = os.path.join(os.getcwd(), fs_object_name) + try: + os.mkdir(dir_path) + print('директория {} создана'.format(fs_object_name)) + except FileExistsError: + print('директория {} уже существует'.format(fs_object_name)) + + +def ping(): + print("pong") + + +def file_copy(): + if not fs_object_name: + print("Необходимо указать имя файла вторым параметром") + return + file_path = os.path.join(os.getcwd(), fs_object_name) + try: + shutil.copy2(file_path, f'{file_path}_copy') + print('файл {} создан'.format(fs_object_name)) + except FileExistsError: + print('файл {} уже существует'.format(fs_object_name)) + + +def file_drop(): + if not fs_object_name: + print("Необходимо указать имя файла вторым параметром") + return + if input(f'Удалить файл {fs_object_name}? y/n \n').lower() == 'y': + file_path = os.path.join(os.getcwd(), fs_object_name) + + if os.path.exists(file_path): + os.remove(file_path) + print('файл {} удален'.format(fs_object_name)) + else: + print('файл {} не существует'.format(fs_object_name)) + else: + return + + +def change_dir(): + + if not fs_object_name: + print("Необходимо указать имя директории вторым параметром") + return + dir_path = os.path.join(os.getcwd(), fs_object_name) + + if os.path.exists(dir_path): + os.chdir(dir_path) + print('текущая директория {}'.format(fs_object_name)) + else: + print('директория {} не существует'.format(fs_object_name)) + + +def list_fs_object(): + print(os.listdir(os.getcwd())) + +def abs_path(): + print(os.path.abspath('.')) + +do = { + "help": print_help, + "mkdir": make_dir, + "ping": ping, + "cp": file_copy, + "rm": file_drop, + "cd": change_dir, + "pwd": abs_path, + "ls": list_fs_object, + +} + +try: + fs_object_name = sys.argv[2] +except IndexError: + fs_object_name = None + +try: + key = sys.argv[1] +except IndexError: + key = None + + +if key: + if do.get(key): + do[key]() + else: + print("Задан неверный ключ") + print("Укажите ключ help для получения справки") + + # Важно! Все операции должны выполняться в той директории, в который вы находитесь. # Исходной директорией считать ту, в которой был запущен скрипт. diff --git a/lesson05/home_work/hw05_normal.py b/lesson05/home_work/hw05_normal.py index ead6bbc19..a26a81064 100644 --- a/lesson05/home_work/hw05_normal.py +++ b/lesson05/home_work/hw05_normal.py @@ -10,6 +10,43 @@ # и выводит результат действия: "Успешно создано/удалено/перешел", # "Невозможно создать/удалить/перейти" +import os +from hw05_easy import * + +def menu(): + + menu_opt = { + "1": {'name': 'Перейти в папку', 'func': change_dir, 'param': True}, + "2": {'name': 'Просмотреть содержимое текущей папки', 'func': show_dir, 'param': False}, + "3": {'name': 'Удалить папку', 'func': remove_dir, 'param': True}, + "4": {'name': 'Создать папку', 'func': create_dir, 'param': True}, + "5": {'name': 'Выход', 'func': quit, 'param': 0}, + } + + while True: + + for key, val in menu_opt.items(): + print(f'{key}. {val["name"]}') + + temp = input("Выберите пункт меню\n") + + for key, val in menu_opt.items(): + if key == temp: + if val['param']: + val['func'](input("Укажите название папки\n")) + break + else: + val['func']() + break + else: + continue + +if __name__ == "__main__": + + while True: + + menu() + # Для решения данной задачи используйте алгоритмы из задания easy, # оформленные в виде соответствующих функций, # и импортированные в данный файл из easy.py diff --git a/lesson06/home_work/hw06_easy.py b/lesson06/home_work/hw06_easy.py index fe5dc2b11..71e9f3520 100644 --- a/lesson06/home_work/hw06_easy.py +++ b/lesson06/home_work/hw06_easy.py @@ -1,5 +1,39 @@ # Задача-1: Написать класс для фигуры-треугольника, заданного координатами трех точек. # Определить методы, позволяющие вычислить: площадь, высоту и периметр фигуры. +import math + +class Triangle(): + + def __init__(self, coord_a, coord_b, coord_c): + + self.coord_a = coord_a + self.coord_b = coord_b + self.coord_c = coord_c + + self.side_a = math.sqrt((coord_b[0] - coord_a[0]) ** 2 + (coord_b[1] - coord_a[1]) ** 2) + self.side_b = math.sqrt((coord_c[0] - coord_b[0]) ** 2 + (coord_c[1] - coord_b[1]) ** 2) + self.side_c = math.sqrt((coord_a[0] - coord_c[0]) ** 2 + (coord_a[1] - coord_c[1]) ** 2) + self.half_p = (self.side_a + self.side_b + self.side_c) / 2 + + + def square(self): + return (self.height() * self.side_a / 2) + def height(self): + return (2 * math.sqrt(self.half_p * ((self.half_p - self.side_a) * (self.half_p - self.side_b) * (self.half_p - self.side_c))) / self.side_a) + def perimeter(self): + return (self.side_a + self.side_b + self.side_c) + +coord_tri_a = (1, 2) +coord_tri_b = (-1, 1) +coord_tri_c = (2, 2) + +triang = Triangle(coord_tri_a, coord_tri_b, coord_tri_c) + +# print(triang.side_a, triang.side_b, triang.side_c) +# print(triang.square()) +# print(triang.height()) +# print(triang.perimeter()) + # Задача-2: Написать Класс "Равнобочная трапеция", заданной координатами 4-х точек. @@ -7,3 +41,50 @@ # проверка, является ли фигура равнобочной трапецией; # вычисления: длины сторон, периметр, площадь. +class Trapeze(): + + def __init__(self, coord_a, coord_b, coord_c, coord_d): + self.coord_a = coord_a + self.coord_b = coord_b + self.coord_c = coord_c + self.coord_d = coord_d + + self.side_a = math.sqrt((coord_b[0] - coord_a[0]) ** 2 + (coord_b[1] - coord_a[1]) ** 2) + self.side_b = math.sqrt((coord_c[0] - coord_b[0]) ** 2 + (coord_c[1] - coord_b[1]) ** 2) + self.side_c = math.sqrt((coord_d[0] - coord_c[0]) ** 2 + (coord_d[1] - coord_c[1]) ** 2) + self.side_d = math.sqrt((coord_a[0] - coord_d[0]) ** 2 + (coord_a[1] - coord_d[1]) ** 2) + + @property + def perimeter(self): + return (self.side_a + self.side_b + self.side_c + self.side_d) + + @property + def square(self): + return (self.side_b + self.side_d / 4 * math.sqrt(4 * self.side_b - (self.side_b - self.side_d) ** 2)) + + @property + def isosceles(self): + return True if self.side_a == self.side_c else False + +''' + A d D + .________________. + / \ + a/ \c + / \ + .________________________. + B b C +''' + + + +coord_trap_a = (-1, 1) +coord_trap_b = (-2, -1) +coord_trap_c = (2, -1) +coord_trap_d = (1, 1) + +trap = Trapeze(coord_trap_a, coord_trap_b, coord_trap_c, coord_trap_d) + +print(trap.isosceles) +print(trap.square) +print(trap.perimeter) diff --git a/lesson06/home_work/hw06_normal.py b/lesson06/home_work/hw06_normal.py index 01c3982f4..13f01b789 100644 --- a/lesson06/home_work/hw06_normal.py +++ b/lesson06/home_work/hw06_normal.py @@ -7,6 +7,52 @@ # Т.е. Учитель Иванов может преподавать математику у 5А и 6Б, # но больше математику не может преподавать никто другой. +class People: + def __init__(self, name, patronymic, surname, birth_date, school, sex): + self.name = name + self.surname = surname + self.birth_date = birth_date + self.school = school + self.sex = sex + self.patronymic = patronymic + + def get_full_name(self): + return self.name + ' ' + self.surname + + def set_name(self, new_name): + self.name = new_name + + +class Student(People): + def __init__(self, name, patronymic, surname, birth_date, school, sex, class_room, parents): + # Явно вызываем конструктор родительского класса + People.__init__(self, name, patronymic, surname, birth_date, school, sex) + # Добавляем уникальные атрибуты + self._class_room = {'class_num': int(class_room.split()[0]), + 'class_char': class_room.split()[1]} + self.parents = {'mother': parents[0], + 'father': parents[1]} + # И уникальные методы + @property + def class_room(self): + return "{} {}".format(self._class_room['class_num'], self._class_room['class_char']) + + def next_class(self): + self._class_room['class_num'] += 1 + + def get_full_name(self): + return self.name + ' ' + self.surname + + def get_fio(self): + return str((self.surname, " ", self.name[0], ".", self.patronymic[0], ".")) + + +class Teacher(People): + def __init__(self, name, patronymic, surname, birth_date, school, sex, teach_classes, subject): + People.__init__(self, name, patronymic, surname, birth_date, school, sex) + self.teach_classes = teach_classes + self.subject = subject + # Выбранная и заполненная данными структура должна решать следующие задачи: # 1. Получить полный список всех классов школы # 2. Получить список всех учеников в указанном классе @@ -15,3 +61,65 @@ # (Ученик --> Класс --> Учителя --> Предметы) # 4. Узнать ФИО родителей указанного ученика # 5. Получить список всех Учителей, преподающих в указанном классе + +students = [] +teachers = [] + + +def get_clases(): + # 1. Получить полный список всех классов школы + classes = set() + for student in students: + classes.add(student.class_room) + return classes + + + +def students_by_class(current_class): + + for student in students: + if student.class_room == current_class: + return student.get_fio() + + +def get_subjects(current_student): + # 3. Получить список всех предметов указанного ученика + # (Ученик --> Класс --> Учителя --> Предметы) + current_teachers = [] + current_subjects = [] + + for student in students: + + if (student.surname, " ", student.name, " ", student.patronymic) == current_student: + current_class = student.class_room + + try: + for teacher in teachers: + if current_class in teacher.teach_classes: + current_teachers.append(teacher) + except UnboundLocalError: + + return ('Ученик не найден') + + for current_teacher in current_teachers: + current_subjects.append(current_teacher.subject) + + return current_subjects + + +def get_parents(current_student): + # 4. Узнать ФИО родителей указанного ученика + for student in students: + + if (student.surname, " ", student.name, " ", student.patronymic) == current_student: + return student.parents + + +def get_teachers_by_class(current_class): + # 5. Получить список всех Учителей, преподающих в указанном классе + current_teachers = [] + for teacher in teachers: + if current_class in teacher.teach_classes: + current_teachers.append(teacher) + + return current_teachers \ No newline at end of file diff --git a/lesson07/home_work/loto.py b/lesson07/home_work/loto.py index 5ea6ad844..04fbc9dc4 100644 --- a/lesson07/home_work/loto.py +++ b/lesson07/home_work/loto.py @@ -57,3 +57,141 @@ модуль random: http://docs.python.org/3/library/random.html """ +__author__ = 'Субботин Андрей Владимирович' + +import random + + +class LotoCard(object): + + def __init__(self): + + self.numbers = set() + self.card_numbers = [] + self.__shufl() + + def __shufl(self): + + while len(self.numbers) < 15: + + self.numbers.add(random.randint(1,91)) + + self.card_numbers = list(self.numbers) + self.card_numbers.extend(('__',) * 12) + random.shuffle(self.card_numbers) + + + +class Player(object): + + def __init__(self, name = None): + + self.is_human = bool() + self.name = name + if self.name == None: + self.name = "Компьютер" + self.is_human = False + + else: + self.is_human = True + + def ask(self): + + while True: + ask = input('Зачеркнуть? y/n \n') + + if ask.lower() == 'y': + return True + elif ask.lower() == 'n': + return False + else: + print('вы не ответили') + continue + + +class Bag(object): + + def __init__(self): + + self.numbers = list(range(1, 91)) + random.shuffle(self.numbers) + + def push_barel(self): + + return self.numbers.pop() + + +class Lobby(object): + def __init__(self): + self.__bag = Bag() + self.card1 = LotoCard() + self.card2 = LotoCard() + self.pleer1 = Player(input('Введите ваше имя:\n')) + self.pleer2 = Player() + + def show_cards(self): + + print('{:-^26}'.format(f"Карточка {self.pleer1.name}")) + print(*self.card1.card_numbers[:9]) + print(*self.card1.card_numbers[9:18]) + print(*self.card1.card_numbers[18:]) + print('--------------------------\n') + print('{:-^26}'.format(f"Карточка {self.pleer2.name}")) + print(*self.card2.card_numbers[:9]) + print(*self.card2.card_numbers[9:18]) + print(*self.card2.card_numbers[18:]) + print('--------------------------') + + def show_barel(self): + return self.__bag.push_barel() + @property + def barel_remained(self): + return len(self.__bag.numbers) + + @staticmethod + def pleer_check(is_human, barel, numbers, card_numbers): + + if is_human == True: + + if barel in numbers: + right_answer = True + else: + right_answer = False + + pleer_answer = lobby.pleer1.ask() + + if pleer_answer != right_answer: + print('Вы проиграли.') + exit(0) + else: + if right_answer == True: + + card_numbers[card_numbers.index(barel)] = '--' + numbers.pop() + + else: + pass + else: + if barel in numbers: + card_numbers[card_numbers.index(barel)] = '--' + numbers.pop() + +if __name__ == '__main__': + lobby = Lobby() + + while lobby.card1.numbers and lobby.card2.numbers: + + barel = lobby.show_barel() + + print(f'Новый бочонок: {barel} (осталось {lobby.barel_remained})') + lobby.show_cards() + + lobby.pleer_check(lobby.pleer1.is_human, barel, lobby.card1.numbers, lobby.card1.card_numbers) + lobby.pleer_check(lobby.pleer2.is_human, barel, lobby.card2.numbers, lobby.card2.card_numbers) + + if not lobby.card1.numbers and lobby.pleer1.is_human: + print('Вы выиграли') + elif not lobby.card2.numbers and lobby.pleer2.is_human: + print('Вы выиграли') + else: + print('Вы выиграли') \ No newline at end of file