From 77d4b4fc18a18fdda4c2fc2628144f81b4894a84 Mon Sep 17 00:00:00 2001 From: PAND-or Date: Sun, 9 Sep 2018 21:51:59 +0300 Subject: [PATCH 01/30] Lesson02_hw --- lesson02/home_work/hw02_easy.py | 37 +++++++ lesson02/home_work/hw02_hard.py | 157 ++++++++++++++++++++++++++++-- lesson02/home_work/hw02_normal.py | 51 ++++++++++ 3 files changed, 238 insertions(+), 7 deletions(-) diff --git a/lesson02/home_work/hw02_easy.py b/lesson02/home_work/hw02_easy.py index ed4447e50..1aeeb8c55 100644 --- a/lesson02/home_work/hw02_easy.py +++ b/lesson02/home_work/hw02_easy.py @@ -1,3 +1,5 @@ +__author__ = 'Петров Андрей' + # Задача-1: # Дан список фруктов. # Напишите программу, выводящую фрукты в виде нумерованного списка, @@ -13,13 +15,48 @@ # Подсказка: воспользоваться методом .format() +fruits = ["яблоко", "банан", "киви", "арбуз"] +i = 1 +for fruit in fruits: + print ('{}. {:>6}'.format(i, fruit)) + i += 1 + # Задача-2: # Даны два произвольные списка. # Удалите из первого списка элементы, присутствующие во втором списке. +fruits_one = ["яблоко", "банан", "киви", "арбуз"] +fruits_two = ["яблоко", "абрикос", "ананас", "арбуз"] + +for fruit in fruits_two: + try: + fruits_one.remove(fruit) + print('{} удален из fruits_one'.format(fruit)) + except: + print('{} нет в fruits_one'.format(fruit)) +print('в fruits_one осталось', fruits_one) + + # Задача-3: # Дан произвольный список из целых чисел. # Получите НОВЫЙ список из элементов исходного, выполнив следующие условия: # если элемент кратен двум, то разделить его на 4, если не кратен, то умножить на два. + +from random import randint +i=0 +list = [] +while i < 10: #генерация случайного списка из целых чисел + list.append(randint(0, 99)) + i += 1 +print('исходный список', list) + +list_new = [] + +for i in list: + if(i%2 == 0): + list_new.append(i/4) + else: + list_new.append(i*2) +print('новый список', list_new) \ No newline at end of file diff --git a/lesson02/home_work/hw02_hard.py b/lesson02/home_work/hw02_hard.py index c96843184..45d0285a8 100644 --- a/lesson02/home_work/hw02_hard.py +++ b/lesson02/home_work/hw02_hard.py @@ -1,3 +1,5 @@ +__author__ = 'Петров Андрей' + # Задание-1: уравнение прямой вида y = kx + b задано в виде строки. # Определить координату y точки с заданной координатой x. @@ -5,6 +7,17 @@ x = 2.5 # вычислите и выведите y +pos_equal = equation.index("=") +pos_x = equation.index("x") +pos_plus = equation.index("+") + +k = float(equation[pos_equal+1:pos_x]) +b = float(equation[pos_plus+1:]) + +print('k = {}'.format(k)) +print('b = {}'.format(b)) +print('y = {}'.format(x * k + b)) + # Задание-2: Дата задана в виде строки формата 'dd.mm.yyyy'. # Проверить, корректно ли введена дата. @@ -16,13 +29,124 @@ # 4. Длина исходной строки для частей должна быть в соответствии с форматом # (т.е. 2 символа для дня, 2 - для месяца, 4 - для года) -# Пример корректной даты -date = '01.11.1985' +print( + "Пример корректной даты \n", + "01.11.1985 \n\n", + "Примеры некорректных дат\n", + "01.22.1001\n", + "1.12.1001\n", + "-2.10.3001\n", + "31.06.3001\n", +) + + +days_of_mounth = { #справочник кол-ва дней в месяце + 1: { + 'days': 31, + 'name': 'январе' + }, + 2: { + 'days': 29, + 'name': 'феврале' + }, + 3: { + 'days': 31, + 'name': 'марте' + }, + 4: { + 'days': 30, + 'name': 'апреле' + }, + 5: { + 'days': 31, + 'name': 'мае' + }, + 6: { + 'days': 30, + 'name': 'июне' + }, + 7: { + 'days': 31, + 'name': 'июле' + }, + 8: { + 'days': 31, + 'name': 'августе' + }, + 9: { + 'days': 30, + 'name': 'сентябре' + }, + 10: { + 'days': 31, + 'name': 'октябре' + }, + 11: { + 'days': 30, + 'name': 'ноябре' + }, + 12: { + 'days': 31, + 'name': 'декабре' + }, +} + + +date_input = input('Введите дату в формате dd.mm.yyyy: ') + + +def check_data(dinput): + data = dinput.split('.') + + if len(data) != 3: + res_message = 'Формат даты указан не верно, либо разделитель не точка' + res_check = False + elif(not( #проверка на длинну строки + (len(data[0]) == 2) & + (len(data[1]) == 2) & + (len(data[2]) == 4) + ) + ): + res_message = 'Не верная длина вводимых символов' + res_check = False + elif not( #проверка, можно ли приобразовать к int + (data[0].isdigit()) & + (data[1].isdigit()) & + (data[2].isdigit()) + ): + res_message = 'Формат даты указан не верно, символ не число' + res_check = False + elif not( # попадают ли в допустимые диапазоны + (int(data[0]) <= 31) & + (int(data[0]) >= 1) & + (int(data[1]) <= 12) & + (int(data[1]) >= 1) & + (int(data[2]) <= 9999) & + (int(data[2]) >= 1) + ): + res_message = 'Не соответствует допустимому диапазону' + res_check = False + elif not( #проверка на 31, 30, 28 дней месяца (без учета високосного года) + int(data[0]) <= days_of_mounth[int(data[1])]['days'] + ): + res_message = 'В {} {} дней, введено {}'.format(days_of_mounth[int(data[1])]['name'], days_of_mounth[int(data[1])]['days'], data[0]) + res_check = False + else: + res_message = 'Все норм, дата в правильном формате' + res_check = True + return [res_check, res_message] + + +while True: + res = check_data(date_input) + if(res[0]): + print(res[1]) + break + else: + print(res[1]) + date_input = input('Введите дату в формате dd.mm.yyyy: ') + -# Примеры некорректных дат -date = '01.22.1001' -date = '1.12.1001' -date = '-2.10.3001' # Задание-3: "Перевёрнутая башня" (Задача олимпиадного уровня) @@ -53,4 +177,23 @@ # Выход: 6 2 # # Вход: 11 -# Выход: 5 3 \ No newline at end of file +# Выход: 5 3 + +n = int(input('Номер комнаты: ')) + +#в условии задачи есть закономерность в кол-ве комнат 1, по 2 комнаты на двух этажах 2х2, по 3 комнаты на трех этажах 3х3. +claster = 1 #Кластер комнат, зная номер кластера можно сказать по сколько комнат на этом этаже +sum_rooms = 1 #Сумма всех комнат в кластерах + +while n > sum_rooms: #Перебираем комнаты по кластерам, пока не найдем нужный кластер + claster += 1 + sum_rooms += claster ** 2 #порядковый номер кластера в квадрете, к сумме прошдых комнат + +max_floor = int((claster + 1) * claster / 2) #Максимальный номер этажа в кластере + +dif_rooms = sum_rooms - n #Кол-во пропущенных комнат сверху кластера +floor = max_floor - (dif_rooms // claster) #от последнего этажа кластера вычитаем кол-во пропущенныъ этажей + +max_room = claster #максимальное кол-во комнат на этаже равно номеру кластера +room = max_room - dif_rooms % max_room #порядковый номер комнаты, от максимального кол-ва комнат на этаже +print('Этаж {}, номер комнаты слева {}'.format(floor, room)) \ No newline at end of file diff --git a/lesson02/home_work/hw02_normal.py b/lesson02/home_work/hw02_normal.py index 3acfaabb6..a5e319438 100644 --- a/lesson02/home_work/hw02_normal.py +++ b/lesson02/home_work/hw02_normal.py @@ -1,3 +1,5 @@ +__author__ = 'Петров Андрей' + # Задача-1: # Дан список, заполненный произвольными целыми числами, получите новый список, # элементами которого будут квадратные корни элементов исходного списка, @@ -6,16 +8,53 @@ # Пример: Дано: [2, -5, 8, 9, -25, 25, 4] Результат: [3, 5, 2] +test_list = [2, -5, 8, 9, -25, 25, 4] +print('Тестовые данные', test_list) + +def isqrt(n): #метод Ньютона + x = n + y = (x + 1) // 2 + while y < x: + x = y + y = (x + n // x) // 2 + return x + +new_list = [] + +for i in test_list: + if(i == isqrt(i)**2): + new_list.append(isqrt(i)) +print('Результат', new_list) + # Задача-2: Дана дата в формате dd.mm.yyyy, например: 02.11.2013. # Ваша задача вывести дату в текстовом виде, например: второе ноября 2013 года. # Склонением пренебречь (2000 года, 2010 года) +date_input = '02.11.2013' + +months = ['января','февраля','марта','апреля','мая','июня','июля','августа','сентября','октября','ноября','декабря'] +days = ['первое','второе','третье','четвертое','пятое','шестое','седьмое','восьмое','девятое','десятое','одинадцатое','двенадцатое','тринадцатое','четырнадцатое','пятнадцатое','шестнадцатое','семнадцатое','восемнадцатое','девятнадцатое','двадцатое','двадцать первое','двадцать второе','двадцать третье','двадцать четвертое','двадцать пятое','двадцать шестое','двадцать седьмое','двадцать восьмое','двадцать девятое','тридцатое','тридцать первое'] + +data = date_input.split('.') +days[int(data[0]) -1], months[int(data[1]) -1], data[2] + + +print('{} {} {} года. '.format(days[int(data[0]) -1], months[int(data[1]) -1], data[2])) # Задача-3: Напишите алгоритм, заполняющий список произвольными целыми числами # в диапазоне от -100 до 100. В списке должно быть n - элементов. # Подсказка: # для получения случайного числа используйте функцию randint() модуля random +n = input('Количество элементов списка: ') + +from random import randint +i=0 +list = [] +while i < int(n): #генерация случайного списка из целых чисел + list.append(randint(-100, 100)) + i += 1 +print(list) # Задача-4: Дан список, заполненный произвольными целыми числами. # Получите новый список, элементами которого будут: @@ -23,3 +62,15 @@ # например, 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] + +lst = [1, 2, 4, 5, 6, 2, 5, 2] +print(lst) + +lst2 = list(set(lst)) +print(lst2) + +lst3 = [] +for i in lst: + if lst.count(i) == 1: + lst3.append(i) +print(lst3) \ No newline at end of file From a87592fbd20c50c9de8998a6265d097cca439dbe Mon Sep 17 00:00:00 2001 From: PAND-or Date: Wed, 12 Sep 2018 22:37:14 +0300 Subject: [PATCH 02/30] remake hw2 short code --- lesson02/home_work/hw02_easy.py | 7 +- lesson02/home_work/hw02_hard.py | 125 ++++++++------------------------ 2 files changed, 35 insertions(+), 97 deletions(-) diff --git a/lesson02/home_work/hw02_easy.py b/lesson02/home_work/hw02_easy.py index 1aeeb8c55..f29e50a23 100644 --- a/lesson02/home_work/hw02_easy.py +++ b/lesson02/home_work/hw02_easy.py @@ -29,12 +29,11 @@ fruits_one = ["яблоко", "банан", "киви", "арбуз"] fruits_two = ["яблоко", "абрикос", "ананас", "арбуз"] + for fruit in fruits_two: - try: + if fruit in fruits_one: fruits_one.remove(fruit) - print('{} удален из fruits_one'.format(fruit)) - except: - print('{} нет в fruits_one'.format(fruit)) + print('в fruits_one осталось', fruits_one) diff --git a/lesson02/home_work/hw02_hard.py b/lesson02/home_work/hw02_hard.py index 45d0285a8..32ad88287 100644 --- a/lesson02/home_work/hw02_hard.py +++ b/lesson02/home_work/hw02_hard.py @@ -40,110 +40,49 @@ ) -days_of_mounth = { #справочник кол-ва дней в месяце - 1: { - 'days': 31, - 'name': 'январе' - }, - 2: { - 'days': 29, - 'name': 'феврале' - }, - 3: { - 'days': 31, - 'name': 'марте' - }, - 4: { - 'days': 30, - 'name': 'апреле' - }, - 5: { - 'days': 31, - 'name': 'мае' - }, - 6: { - 'days': 30, - 'name': 'июне' - }, - 7: { - 'days': 31, - 'name': 'июле' - }, - 8: { - 'days': 31, - 'name': 'августе' - }, - 9: { - 'days': 30, - 'name': 'сентябре' - }, - 10: { - 'days': 31, - 'name': 'октябре' - }, - 11: { - 'days': 30, - 'name': 'ноябре' - }, - 12: { - 'days': 31, - 'name': 'декабре' - }, +data_lenght = { #справочник длин диапазонов + 1: 31, + 2: 29, + 3: 31, + 4: 30, + 5: 31, + 6: 30, + 7: 31, + 8: 31, + 9: 30, + 10: 31, + 11: 30, + 12: 31, + 'year': 9999, + 'month': 12 } date_input = input('Введите дату в формате dd.mm.yyyy: ') - def check_data(dinput): - data = dinput.split('.') - - if len(data) != 3: - res_message = 'Формат даты указан не верно, либо разделитель не точка' - res_check = False - elif(not( #проверка на длинну строки - (len(data[0]) == 2) & - (len(data[1]) == 2) & - (len(data[2]) == 4) - ) - ): - res_message = 'Не верная длина вводимых символов' - res_check = False - elif not( #проверка, можно ли приобразовать к int - (data[0].isdigit()) & - (data[1].isdigit()) & - (data[2].isdigit()) - ): - res_message = 'Формат даты указан не верно, символ не число' - res_check = False - elif not( # попадают ли в допустимые диапазоны - (int(data[0]) <= 31) & - (int(data[0]) >= 1) & - (int(data[1]) <= 12) & - (int(data[1]) >= 1) & - (int(data[2]) <= 9999) & - (int(data[2]) >= 1) - ): - res_message = 'Не соответствует допустимому диапазону' - res_check = False - elif not( #проверка на 31, 30, 28 дней месяца (без учета високосного года) - int(data[0]) <= days_of_mounth[int(data[1])]['days'] - ): - res_message = 'В {} {} дней, введено {}'.format(days_of_mounth[int(data[1])]['name'], days_of_mounth[int(data[1])]['days'], data[0]) - res_check = False - else: - res_message = 'Все норм, дата в правильном формате' - res_check = True - return [res_check, res_message] - + import re + try: + data_split = list(map(int, dinput.split('.'))) + match = re.fullmatch('\d{2}.\d{2}.\d{4}', dinput) + + if not( + (data_split[0] <= data_lenght[data_split[1]]) & + (data_split[1] <= data_lenght['month']) & + (data_split[2] <= data_lenght['year']) & (match is not None) + ): + return False + else: + return True + except: + return False while True: res = check_data(date_input) - if(res[0]): - print(res[1]) + if(res): break else: - print(res[1]) + print("Не верный формат!") date_input = input('Введите дату в формате dd.mm.yyyy: ') From 12b728fab3b18b1c746c4ebdf14e80f9574661e9 Mon Sep 17 00:00:00 2001 From: PAND-or Date: Thu, 13 Sep 2018 16:21:24 +0300 Subject: [PATCH 03/30] hw03 easy + normal --- lesson03/home_work/hw03_easy.py | 44 +++++++++++++++++-- lesson03/home_work/hw03_normal.py | 70 +++++++++++++++++++++++++++++-- 2 files changed, 107 insertions(+), 7 deletions(-) diff --git a/lesson03/home_work/hw03_easy.py b/lesson03/home_work/hw03_easy.py index 63d13f646..62568fa35 100644 --- a/lesson03/home_work/hw03_easy.py +++ b/lesson03/home_work/hw03_easy.py @@ -1,3 +1,5 @@ +__author__ = "Андрей Петров" + # Задание-1: # Напишите функцию, округляющую полученное произвольное десятичное число # до кол-ва знаков (кол-во знаков передается вторым аргументом). @@ -5,8 +7,33 @@ # Для решения задачи не используйте встроенные функции и функции из модуля math. def my_round(number, ndigits): - pass + + str_number = str(number) + + dot_index = str_number.find(".") + integer_number = str_number[:dot_index] + dec_number = str_number[dot_index+1:] + + + list_number = [int(i) for i in dec_number] #преобразование в список + j = 0 + for k, num, in enumerate(reversed(list_number)): #проход по списку в обратном порядке + if j > 0: + num += 1 + j = 0 + if (num >= 10) & (len(list_number) - k - 2 >= 0): + list_number[-k-2] += 1 + num = num - 10 + elif(num >= 10) & (ndigits == 0): + integer_number = int(integer_number) + 1 + if k < len(list_number) - ndigits: #До какой точности считаем + 0 и точка + list_number[-k-1] = 0 + j = 1 if int(num) > 5 else 0 + else: + list_number[-k-1] = num + + return int(integer_number) + int(''.join(str(x) for x in list_number))/(10**len(list_number)) print(my_round(2.1234567, 5)) print(my_round(2.1999967, 5)) @@ -20,9 +47,18 @@ def my_round(number, ndigits): # !!!P.S.: функция не должна НИЧЕГО print'ить def lucky_ticket(ticket_number): - pass - - + #str_number = str(ticket_number) + list_number = [int(i) for i in str(ticket_number)] + lenght = len(list_number) + if(lenght % 2 == 0): + sumone = sum(list_number[:int(lenght / 2)]) + sumtwo = sum(list_number[int(lenght / 2):]) + return True if sumone == sumtwo else False + else: + sumone = sum(list_number[:int((lenght-1) / 2)]) + sumtwo = sum(list_number[int((lenght+1) / 2):]) + return True if sumone == sumtwo else False + print(lucky_ticket(123006)) print(lucky_ticket(12321)) print(lucky_ticket(436751)) diff --git a/lesson03/home_work/hw03_normal.py b/lesson03/home_work/hw03_normal.py index 38ac1fcc1..3dbd57228 100644 --- a/lesson03/home_work/hw03_normal.py +++ b/lesson03/home_work/hw03_normal.py @@ -1,9 +1,24 @@ +__author__ = "Андрей Петров" + # Задание-1: # Напишите функцию, возвращающую ряд Фибоначчи с n-элемента до m-элемента. # Первыми элементами ряда считать цифры 1 1 def fibonacci(n, m): - pass + feb = 0 + list_feb = [1,1] + i = 1 + n_index = 0 + while feb < m: + print('i', i) + feb = list_feb[i] + list_feb[i-1] + list_feb.append(feb) + i += 1 + if n > list_feb[i]: + n_index = i+1 + return list_feb[n_index:] + +print(fibonacci(10,100)) # Задача-2: # Напишите функцию, сортирующую принимаемый список по возрастанию. @@ -12,16 +27,65 @@ def fibonacci(n, m): def sort_to_max(origin_list): - pass + n = 1 + while n < len(origin_list): + for i in range(len(origin_list)-n): + if origin_list[i] > origin_list[i+1]: + origin_list[i],origin_list[i+1] = origin_list[i+1],origin_list[i] + n += 1 + return origin_list -sort_to_max([2, 10, -12, 2.5, 20, -11, 4, 4, 0]) +print(sort_to_max([2, 10, -12, 2.5, 20, -11, 4, 4, 0])) # Задача-3: # Напишите собственную реализацию стандартной функции filter. # Разумеется, внутри нельзя использовать саму функцию filter. +a = [1, -4, 6, 8, -10] +def func(x): + if x > 0: + return 1 + else: + return 0 + +def my_filter(funcion, listing): + newlist = [] + for i, val in enumerate(listing): + if funcion(val): + newlist.append(val) + return newlist + +print(list(filter(func, a))) +print(my_filter(func, a)) + # Задача-4: # Даны четыре точки А1(х1, у1), А2(x2 ,у2), А3(x3 , у3), А4(х4, у4). # Определить, будут ли они вершинами параллелограмма. +my_points = ((0,1), (0,0), (1,0), (1,1)) + +print(my_points) + +def check_squard(points): + # Паралеллограм это четырех угольник у которого 2 стороны парралельны друг другу + # построим + if(len(points) != 4): + return False + lines = [] + match = 0 + for i, point in enumerate(points): + j = i+1 + while j < 4: #построение графов + another_point = points[j] + try: + k = int((point[1] - another_point[1]) / (point[0] - another_point[0])) #угловые кооэфициенты прямых + except ZeroDivisionError: + k = 'inf' + lines.append(k) + if lines.count(k) == 2: #если есть 2 парралельные прямые + match += 1 + j +=1 + return True if match == 2 else False #2 парралельные прямые Бинго +check_squard(my_points) + From 2579640cd918cf16900d3203a7670e4997ca4769 Mon Sep 17 00:00:00 2001 From: PAND-or Date: Sun, 16 Sep 2018 09:32:34 +0300 Subject: [PATCH 04/30] fix hw03 + recursion --- lesson03/home_work/hw03_easy.py | 2 +- lesson03/home_work/hw03_normal.py | 24 ++++++++++++++---------- 2 files changed, 15 insertions(+), 11 deletions(-) diff --git a/lesson03/home_work/hw03_easy.py b/lesson03/home_work/hw03_easy.py index 62568fa35..4e17ab01d 100644 --- a/lesson03/home_work/hw03_easy.py +++ b/lesson03/home_work/hw03_easy.py @@ -57,7 +57,7 @@ def lucky_ticket(ticket_number): else: sumone = sum(list_number[:int((lenght-1) / 2)]) sumtwo = sum(list_number[int((lenght+1) / 2):]) - return True if sumone == sumtwo else False + return sumone == sumtwo print(lucky_ticket(123006)) print(lucky_ticket(12321)) diff --git a/lesson03/home_work/hw03_normal.py b/lesson03/home_work/hw03_normal.py index 3dbd57228..79c331eac 100644 --- a/lesson03/home_work/hw03_normal.py +++ b/lesson03/home_work/hw03_normal.py @@ -6,19 +6,23 @@ def fibonacci(n, m): feb = 0 - list_feb = [1,1] i = 1 - n_index = 0 - while feb < m: - print('i', i) + list_feb = [1,1] #чтобы не перезаписывать сумму, а сделать обращение по индексам + n = n-1 if n > 1 else 0 #индекс начинается с 0, а порядковый порядковый номер с 1 + m -= 1 #первые два элемента уже посчитаны и записаны в массив + while m > i: #посчитать M раз feb = list_feb[i] + list_feb[i-1] list_feb.append(feb) i += 1 - if n > list_feb[i]: - n_index = i+1 - return list_feb[n_index:] + return list_feb[n:] #вернуть лист фебоначи с элемента n +print(fibonacci(1,10)) -print(fibonacci(10,100)) +#Сделать рекурсией + +def fibRecurson(n,m): + n = n if n > 0 else 1 #0 нельзя + return list(map(lambda f: fib(f - 1) + fib(f - 2) if f > 2 else 1, range(n, m+1))) +print(fibRecurson(1,10)) # Задача-2: # Напишите функцию, сортирующую принимаемый список по возрастанию. @@ -50,7 +54,7 @@ def func(x): def my_filter(funcion, listing): newlist = [] - for i, val in enumerate(listing): + for val in listing: if funcion(val): newlist.append(val) return newlist @@ -86,6 +90,6 @@ def check_squard(points): if lines.count(k) == 2: #если есть 2 парралельные прямые match += 1 j +=1 - return True if match == 2 else False #2 парралельные прямые Бинго + return match == 2 #две парралельные прямые Бинго check_squard(my_points) From da7b56ea834dcbd6e47b4c28ed4f9f23db17887c Mon Sep 17 00:00:00 2001 From: PAND-or Date: Sun, 16 Sep 2018 18:37:31 +0300 Subject: [PATCH 05/30] + hw03_hard --- lesson03/home_work/hw03_hard.py | 130 ++++++++++++++++++++++++++++++++ 1 file changed, 130 insertions(+) diff --git a/lesson03/home_work/hw03_hard.py b/lesson03/home_work/hw03_hard.py index a8c7f668a..6de1d8e2a 100644 --- a/lesson03/home_work/hw03_hard.py +++ b/lesson03/home_work/hw03_hard.py @@ -1,3 +1,5 @@ +__author__ = "Андрей Петров" + # Задание-1: # Написать программу, выполняющую операции (сложение и вычитание) с простыми дробями. # Дроби вводятся и выводятся в формате: @@ -10,6 +12,104 @@ # Вывод: 1 1/3 +def arithmetic(a, b): + c = [0,0] + c[0] = (a[0] * b[1]) + (b[0] * a[1]) #числитель + c[1] = a[1]*b[1] #знаменатель + return c + +def fractionConversion(a): #функция преобразования списка "n, x, y" в список "x" "y", с перестановкой минуса в числитель + if(a[1] == 0 or a[2] == 0): #целое число в дробь + return [a[0], 1] + elif a[0] == 0: #возврат результата если нет целой части + return [(a[1]*a[2]//abs(a[2])), abs(a[2])] + else: + res = [0,0] + res[0] = abs(a[1]) + abs(a[0])*a[2] + res[0] = res[0]*a[0]//abs(a[0])*a[1]//abs(a[1])*a[2]//abs(a[2]) #перевод минуса в числитель, если он есть + res[1] = a[2] + return(res) + + +def simplification(a): + res = [0,a[0],a[1]] + + if abs(a[0]) > abs(a[1]): #определение целой части + num = int(a[0]/a[1]) + res[0] = num + res[1] = abs(a[0] - (a[1] * num)) + if(res[1] == 0): #если вдруг в числителе появился 0, убрать и знаменатель + res[2] = 0 + i = res[2] + while i > 1: #сокращение дроби + if((res[1] % i == 0) & (res[2] % i == 0)): #если и числитель и знаменатель делятся на одно число без остатка. + res[1] = res[1] // i + res[2] = res[2] // i + i -= 1 + return res + +def strToList(string): + import re + data_split = list(string.split(' ')) + + sign = True + lst = [] + + digits, numerator, denominator, = 0, 0, 0 #целое число, числитель, знаменатель + + for i in data_split: + if(re.fullmatch('[-+]?\d+', i) is not None): + if sign == False: + digits = 0 - int(i) + sign = True + else: + digits = int(i) + elif(re.fullmatch('[-+]?\d+\/[-+]?\d+', i) is not None): + if sign == False: + numerator = 0 - int(i.split('/')[0]) + denominator = int(i.split('/')[1]) + sign = True + else: + numerator = int(i.split('/')[0]) + denominator = int(i.split('/')[1]) + elif(i == '-' or i == '+'): + if (i == '-'): + sign = False + lst.append([digits, numerator, denominator]) + digits, numerator, denominator, = 0, 0, 0 #обнуление для слудующей операции + lst.append([digits, numerator, denominator]) #добавление последнего числв с список + return lst + +def resToString(lst): + return '{} {}/{}'.format(lst[0],lst[1],lst[2]) + +def calculation(string): + #print('input string', string) + lst = strToList(string) + #print('string to list',lst) + + res_sum = [0, 1] + for i in lst: + i = fractionConversion(i) + res_sum = arithmetic(res_sum, i) + #print('Арифметический результат', res_sum) + res_simple = simplification(res_sum) + #print('Упрощение дроби', res_simple) + res_string = resToString(res_simple) + return res_string + +print('Пример ввода строк \n', + '5/6 + 4/7\n', + '-2/3 - -2\n', + '2/3 + -2/4 + 4 3/2 + 6/3\n' + +) +input_string = input('Введите строку для вычисления: ') +print(calculation(input_string)) +#print('RESULT', calculation('5/6 + 4/7'), '\n') +#print('RESULT', calculation('-2/3 - -2'), '\n') +#print('RESULT', calculation('2/3 + -2/4 + 4 3/2 + 6/3'), '\n') + # Задание-2: # Дана ведомость расчета заработной платы (файл "data/workers"). # Рассчитайте зарплату всех работников, зная что они получат полный оклад, @@ -18,6 +118,36 @@ # они получают удвоенную ЗП, пропорциональную норме. # Кол-во часов, которые были отработаны, указаны в файле "data/hours_of" +import os +import re + + +dict_workers = {} + +with open(os.path.join('data', 'workers'), 'r', encoding='UTF-8') as f_workers: + for i, line in enumerate(f_workers): + if i > 0:# пропуск первой строки + result = re.split(r'\W+', line) + dict_workers[str(result[0]+' '+result[1])] = { + 'salary': int(result[2]), + 'norm': int(result[4]), + 'pay_hours': float(int(result[2]) / int(result[4])) + } +sumpayd = 0 +with open(os.path.join('data', 'hours_of'), 'r', encoding='UTF-8') as f_hours_of: + for i, line in enumerate(f_hours_of): + if i > 0:# пропуск первой строки + result = re.split(r'\W+', line) + name = str(result[0]+' '+result[1]) + if dict_workers[name]['norm'] < int(result[2]): + earned = dict_workers[name]['salary'] + (int(result[2]) - dict_workers[name]['norm']) * dict_workers[name]['pay_hours'] * 2 + #print(name, 'Переработал', 'норма', dict_workers[name]['norm'], 'отработал', int(result[2]), 'зарплата', dict_workers[name]['salary'], 'Получит', earned) + else: + earned = int(result[2]) * dict_workers[name]['pay_hours'] + #print(name, 'Недоработал', 'норма', dict_workers[name]['norm'], 'отработал', int(result[2]), 'Получит', earned) + print('{:>15} - {:>5}руб.'.format(name, int(earned))) + sumpayd += earned +print('Зарплата всех работников ', int(sumpayd)) # Задание-3: # Дан файл ("data/fruits") со списком фруктов. From aafae18cf9e5c7d274e34ab17fac2fa69f93d325 Mon Sep 17 00:00:00 2001 From: PAND-or Date: Sun, 16 Sep 2018 18:38:21 +0300 Subject: [PATCH 06/30] hw03 #3 --- lesson03/home_work/hw03_hard.py | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/lesson03/home_work/hw03_hard.py b/lesson03/home_work/hw03_hard.py index 6de1d8e2a..3274bec11 100644 --- a/lesson03/home_work/hw03_hard.py +++ b/lesson03/home_work/hw03_hard.py @@ -161,3 +161,17 @@ def calculation(string): # Подсказка: # Чтобы получить список больших букв русского алфавита: # print(list(map(chr, range(ord('А'), ord('Я')+1)))) + + +with open(os.path.join('data', 'fruits.txt'), 'r', encoding='UTF-8') as fruits: + for fruit in fruits: + if len(fruit) > 1: + if(fruit[0:1] in dict_fruit): + dict_fruit[fruit[0:1]].append(fruit) + else: + dict_fruit[fruit[0:1]] = [fruit] +for label in dict_fruit: + file_name = 'fruits_'+label+'.txt' + with open(os.path.join('data', file_name), 'w', encoding='UTF-8') as f: + for fruit in dict_fruit[label]: + f.write(fruit) \ No newline at end of file From 3e4d872d5794267eaccf2f4a255c4e031f97d5cf Mon Sep 17 00:00:00 2001 From: PAND-or Date: Mon, 17 Sep 2018 00:08:26 +0300 Subject: [PATCH 07/30] hw04 (easy, hard, normal) --- lesson04/home_work/hw04_easy.py | 18 ++++++++ lesson04/home_work/hw04_hard.py | 62 ++++++++++++++++++++++++++++ lesson04/home_work/hw04_normal.py | 68 +++++++++++++++++++++++++++++++ 3 files changed, 148 insertions(+) diff --git a/lesson04/home_work/hw04_easy.py b/lesson04/home_work/hw04_easy.py index 85035ea8b..ba40debbe 100644 --- a/lesson04/home_work/hw04_easy.py +++ b/lesson04/home_work/hw04_easy.py @@ -1,3 +1,5 @@ +__author__ = "Андрей Петров" + # Все задачи текущего блока решите с помощью генераторов списков! # Задание-1: @@ -6,13 +8,29 @@ # квадратами элементов исходного списка # [1, 2, 4, 0] --> [1, 4, 16, 0] +lst_first = [random.randint(-10, 10) for _ in range(10)] +print(lst_first) +lst_second = [i**2 for i in lst_first] +print(lst_second) + # Задание-2: # Даны два списка фруктов. # Получить список фруктов, присутствующих в обоих исходных списках. +fruits_first = ['apple', 'banana', 'qiwi'] +fruits_second = ['apple', 'tomato', 'banana', 'potato'] + +fruits_result = [f for f in fruits_first if f in fruits_second] +print(fruits_result) + # Задание-3: # Дан список, заполненный произвольными числами. # Получить список из элементов исходного, удовлетворяющих следующим условиям: # + Элемент кратен 3 # + Элемент положительный # + Элемент не кратен 4 + +lst_rand = [random.randint(-100, 100) for _ in range(20)] +print(lst_first) +lst_third = [num for num in lst_rand if ((num % 4 != 0) & (num % 3 == 0) & (num > 0))] +print(lst_third) \ No newline at end of file diff --git a/lesson04/home_work/hw04_hard.py b/lesson04/home_work/hw04_hard.py index 3b12dc315..e031547bd 100644 --- a/lesson04/home_work/hw04_hard.py +++ b/lesson04/home_work/hw04_hard.py @@ -13,6 +13,9 @@ # Суть сложности hard: Решите задачу в одну строку +res = [[x[i] for x in matrix] for i in range(len(matrix))] +print(res) + # Задание-2: # Найдите наибольшее произведение пяти последовательных цифр в 1000-значном числе. # Выведите произведение и индекс смещения первого числа последовательных 5-ти цифр. @@ -39,6 +42,24 @@ 05886116467109405077541002256983155200055935729725 71636269561882670428252483600823257530420752963450""" +import re +#numbers_list = re.findall(r'\d{5}', number) #так найдет 200 чисел +numbers_list = re.findall(r"(?=(\d{5}))", number) #не знаю как работает эта магия, но так найдет 920 чисел +print(len(numbers_list)) + +#print(number_list) +max_product = 0 +index = 0 +for i in numbers_list: + product = 1 + for num in i: + product = product * int(num) + if product > max_product: + max_product = product + index = number.find(i) +print('Максимальное произведение', max_product) +print('Индекс числа', index) + # Задание-3 (Ферзи): # Известно, что на доске 8×8 можно расставить 8 ферзей так, чтобы они не били @@ -47,3 +68,44 @@ # Программа получает на вход восемь пар чисел, # каждое число от 1 до 8 — координаты 8 ферзей. # Если ферзи не бьют друг друга, выведите слово NO, иначе выведите YES. + +import random + +#qeens = [(random.randint(1,8), random.randint(1,8)) for _ in range(8)] #Есть теоритическая вероятность установки двух ферзей на одну клетку +qeens = [(3, 2), (7, 4), (3, 8), (5, 7), (8, 5), (8, 3), (1, 3), (6, 1)] + +print(qeens) + +def check_mach(qeens): + for n, cell in enumerate(qeens): + lst = [] + for i in range(8): + if (cell[0] - i) >= 0: + x1 = cell[0] - i + else: + x1 = cell[0] - i + 8 + if (cell[1] - i) >= 0: + y1 = cell[1] - i + else: + y1 = cell[1] - i + 8 + + if (cell[0] + i) < 8: + x2 = cell[0] + i + else: + x2 = cell[0] + i - 8 + + if (cell[1] + i) < 8: + y2 = cell[1] + i + else: + y2 = cell[1] + i - 8 + + if( + ((cell[0], i) in qeens) or #бъем по горизонтали + ((i, cell[0]) in qeens) or #бъем по вертикали + ((x1, y1) in qeens) or #бъем по диаганали + ((x2, y2) in qeens) #бъем по диаганали + ): + return "YES" #есть попадание + return "NO" + +print(check_mach(qeens)) \ No newline at end of file diff --git a/lesson04/home_work/hw04_normal.py b/lesson04/home_work/hw04_normal.py index 739dd33f8..a032aca22 100644 --- a/lesson04/home_work/hw04_normal.py +++ b/lesson04/home_work/hw04_normal.py @@ -1,9 +1,13 @@ +__author__ = "Андрей Петров" + # Задание-1: # Вывести символы в нижнем регистре, которые находятся вокруг # 1 или более символов в верхнем регистре. # Т.е. из строки "mtMmEZUOmcq" нужно получить ['mt', 'm', 'mcq'] # Решить задачу двумя способами: с помощью re и без. +import re + line = 'mtMmEZUOmcqWiryMQhhTxqKdSTKCYEJlEZCsGAMkgAYEOmHBSQsSUHKvSfbmxULaysmNO'\ 'GIPHpEMujalpPLNzRWXfwHQqwksrFeipEUlTLeclMwAoktKlfUBJHPsnawvjPhfgewVzK'\ 'TUfSYtBydXaVIpxWjNKgXANvIoumesCSSvjEGRJosUfuhRRDUuTQwLlJJJDdkVjfSAHqn'\ @@ -20,6 +24,27 @@ 'XiUWgsKQrDOeZoNlZNRvHnLgCmysUeKnVJXPFIzvdDyleXylnKBfLCjLHntltignbQoiQ'\ 'zTYwZAiRwycdlHfyHNGmkNqSwXUrxGc' +res = re.split( r'[A-Z]+', line) +print(len(res)) +print(res) + + +string = '' +res_2 = [] + +for i in line: + if i.islower(): + string += i + else: + if string != '': + res_2.append(string) + string = '' + if string != '': + res_2.append(string) +if string != '': + res_2.append(string) +print(len(res_2)) +print(res_2) # Задание-2: # Вывести символы в верхнем регистре, слева от которых находятся @@ -29,6 +54,7 @@ # нужно получить список строк: ['AY', 'NOGI', 'P'] # Решить задачу двумя способами: с помощью re и без. + line_2 = 'mtMmEZUOmcqWiryMQhhTxqKdSTKCYEJlEZCsGAMkgAYEOmHBSQsSUHKvSfbmxULaysm'\ 'NOGIPHpEMujalpPLNzRWXfwHQqwksrFeipEUlTLeclMwAoktKlfUBJHPsnawvjPhfgewV'\ 'fzKTUfSYtBydXaVIpxWjNKgXANvIoumesCSSvjEGRJosUfuhRRDUuTQwLlJJJDdkVjfSA'\ @@ -44,6 +70,36 @@ 'uXBqHFjvihuNGEEFsfnMXTfptvIOlhKhyYwxLnqOsBdGvnuyEZIheApQGOXWeXoLWiDQN'\ 'JFaXiUWgsKQrDOeZoNlZNRvHnLgCmysUeKnVJXPFIzvdDyleXylnKBfLCjLHntltignbQ'\ 'oiQzTYwZAiRwycdlHfyHNGmkNqSwXUrxGC' +#line_2 = "GAMkgAYEOmHBSQsSUHKvSfbmxULaysmNOGIPHpEMujalpPLNzRWXfwHQqwksrFeipEUlTLec" + +res_3 = re.findall('[a-z]{2,2}([A-Z]+)[A-Z]{2,2}', line_2) +print(len(res_3)) +print(res_3) + +string = '' +res_4 = [] +lower = 0 +upper = 0 + + +# на вход функция получает строку для поиска +# на выход выдается список найденных соответственно условию подстрок +res_4 = [] + +for i, s in enumerate(line_2): + try: + if (s.islower()) & (line_2[i+1].islower()): + n = i + 2 + string = '' + while(line_2[n].isupper()): + string += line_2[n] + n += 1 + if len(string)>=3: + res_4.append(string[:len(string)-2]) + except IndexError: + pass +print(len(res_4)) +print(res_4) # Задание-3: # Напишите скрипт, заполняющий указанный файл (самостоятельно задайте имя файла) @@ -51,3 +107,15 @@ # 2500-значное произвольное число. # Найдите и выведите самую длинную последовательность одинаковых цифр # в вышезаполненном файле. + +import os +import random +import re + +with open(os.path.join('number.txt'), 'w', encoding='UTF-8') as f: + lst = [str(random.randint(0, 9)) for _ in range(2500)] + f.write(''.join(lst)) + +with open(os.path.join('number.txt'), 'r', encoding='UTF-8') as f: + num_list = re.findall(r'0+|1+|2+|3+|4+|5+|6+|7+|8+|9+', f.readline()) +print('Самая длинная последовательность', max(num_list, key=len)) \ No newline at end of file From 0259a3aca683f9617837b2ef5e89bf318d93d1ae Mon Sep 17 00:00:00 2001 From: PAND-or Date: Mon, 17 Sep 2018 00:14:04 +0300 Subject: [PATCH 08/30] hw04 #2 --- lesson04/home_work/hw04_hard.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/lesson04/home_work/hw04_hard.py b/lesson04/home_work/hw04_hard.py index e031547bd..1a423c956 100644 --- a/lesson04/home_work/hw04_hard.py +++ b/lesson04/home_work/hw04_hard.py @@ -1,3 +1,5 @@ +__author__ = "Андрей Петров" + # Задание-1: # Матрицы в питоне реализуются в виде вложенных списков: # Пример. Дано: @@ -67,7 +69,7 @@ # Определите, есть ли среди них пара бьющих друг друга. # Программа получает на вход восемь пар чисел, # каждое число от 1 до 8 — координаты 8 ферзей. -# Если ферзи не бьют друг друга, выведите слово NO, иначе выведите YES. +# Если ферзи не бьют друг друга, выведите слово NO, иначе выведите YES. import random From 173bfe45fb1300dfa8f590bb1b28451c5191638c Mon Sep 17 00:00:00 2001 From: PAND-or Date: Thu, 20 Sep 2018 15:38:50 +0300 Subject: [PATCH 09/30] hw05 easy + normal --- lesson05/home_work/hw05_easy.py | 26 +++++++++++++ lesson05/home_work/hw05_normal.py | 65 +++++++++++++++++++++++++++++++ 2 files changed, 91 insertions(+) diff --git a/lesson05/home_work/hw05_easy.py b/lesson05/home_work/hw05_easy.py index c6317de2b..a9019e80b 100644 --- a/lesson05/home_work/hw05_easy.py +++ b/lesson05/home_work/hw05_easy.py @@ -1,10 +1,36 @@ +__author__ = "Андрей Петров" + # Задача-1: # Напишите скрипт, создающий директории dir_1 - dir_9 в папке, # из которой запущен данный скрипт. # И второй скрипт, удаляющий эти папки. +import os +import shutil +import inspect + +def create_dir(): + if not((os.path.exists('dir_1')) & (os.path.exists('dir_2'))): + os.makedirs('dir_1') + os.makedirs('dir_2') +def remove_dir(): + if ((os.path.exists('dir_1')) & (os.path.exists('dir_2'))): + os.rmdir('dir_1') + os.rmdir('dir_2') + +create_dir() +remove_dir() # Задача-2: # Напишите скрипт, отображающий папки текущей директории. +def view_dir(): + path = os.path.curdir + for root, dirs, files in os.walk(path): + print(root) +view_dir() + # Задача-3: # Напишите скрипт, создающий копию файла, из которого запущен данный скрипт. + +current = os.path.abspath(inspect.getsourcefile(lambda:0)) +shutil.copy(current, r'copy_file.py') \ No newline at end of file diff --git a/lesson05/home_work/hw05_normal.py b/lesson05/home_work/hw05_normal.py index ead6bbc19..bfc669e4f 100644 --- a/lesson05/home_work/hw05_normal.py +++ b/lesson05/home_work/hw05_normal.py @@ -1,3 +1,5 @@ +__author__ = "Андрей Петров" + # Задача-1: # Напишите небольшую консольную утилиту, # позволяющую работать с папками текущей директории. @@ -13,3 +15,66 @@ # Для решения данной задачи используйте алгоритмы из задания easy, # оформленные в виде соответствующих функций, # и импортированные в данный файл из easy.py + +import os + + +def create_dir(new_dir): + if not(os.path.exists(new_dir)): + os.makedirs(new_dir) + return True + else: + return False +def remove_dir(del_dir): + if os.path.exists(del_dir): + os.rmdir(del_dir) + return True + else: + return False + +def view_dir(path): + return os.listdir(path) + +print( + 'Выберете действие \n', + '1 Перейти в папку\n', + '2 Посмотреть содержимое текущей папки\n', + '3 Удалить папку\n', + '4 Создать папку\n', + 'q Для выхода', + +) +path = '' +while True: + print('Текущая папка', path) + key = input('Введите команду: ') + + if len(path) == 0: + path = os.path.curdir + #path = os.path.abspath + if key == '1': + new_path = input('Введите путь: ') + if os.path.exists(new_path): + path = new_path + else: + print('Директория {} не найдена'.format(path)) + elif key == '2': + dirs = view_dir(path) + if len(dirs) > 0: + print('Сожержимое текущей папки', dirs) + else: + print('Папка пустая') + elif key == '3': + del_path = input('Введите имя папки для удаления: ') + if remove_dir(del_path): + print('Директория {} удалена'.format(del_path)) + else: + print('Директория {} не найдена'.format(del_path)) + elif key == '4': + new_path = input('Введите имя папки для создания: ') + if create_dir(new_path): + print('Директория {} создана'.format(new_path)) + else: + print('Директория {} уже есть'.format(new_path)) + elif key == 'q': + sys.exit() \ No newline at end of file From db6a459b56fe97148dc75fc8cccc21b3e025fe53 Mon Sep 17 00:00:00 2001 From: PAND-or Date: Thu, 20 Sep 2018 17:18:42 +0300 Subject: [PATCH 10/30] hw05 +hard --- lesson05/home_work/hw05_hard.py | 101 ++++++++++++++++++++++++++++++++ 1 file changed, 101 insertions(+) diff --git a/lesson05/home_work/hw05_hard.py b/lesson05/home_work/hw05_hard.py index 7507e47b2..3c487cbe2 100644 --- a/lesson05/home_work/hw05_hard.py +++ b/lesson05/home_work/hw05_hard.py @@ -1,3 +1,4 @@ +__author__ = "Андрей Петров" # Задание-1: # Доработайте реализацию программы из примера examples/5_with_args.py, # добавив реализацию следующих команд (переданных в качестве аргументов): @@ -13,3 +14,103 @@ # Исходной директорией считать ту, в которой был запущен скрипт. # P.S. По возможности, сделайте кросс-платформенную реализацию. + +# Данный скрипт можно запускать с параметрами: +# python with_args.py param1 param2 param3 +import os +import sys +import shutil +print('sys.argv = ', sys.argv) + +path = os.path.join(os.getcwd()) + +def print_help(): + print("help - получение справки") + print("mkdir - создание директории") + print("ping - тестовый ключ") + + + + +def make_dir(): + if not arg: + print("Необходимо указать имя директории вторым параметром") + return + dir_path = os.path.join(os.getcwd(), arg) + try: + os.mkdir(dir_path) + print('директория {} создана'.format(arg)) + except FileExistsError: + print('директория {} уже существует'.format(arg)) + +def del_dir(): + if not arg: + print("Необходимо указать имя директории вторым параметром") + return + dir_path = os.path.join(os.getcwd(), arg) + if (input('Удалить {} ? 0 - нет, 1 - да '.format(arg)) == int(1)): + try: + os.rmdir(dir_path) + print('директория {} удалена'.format(arg)) + except FileExistsError: + print('директории {} не существует'.format(arg)) + +def del_file(): + if not arg: + print("Необходимо указать имя файла вторым параметром") + return + dir_path = os.path.join(os.getcwd(), arg) + if (input('Удалить {} ? 0 - нет, 1 - да '.format(arg)) == int(1)): + try: + os.remove(dir_path) + print('файл {} удален'.format(arg)) + except FileExistsError: + print('файла {} не существует'.format(arg)) + +def path_dir(): + print(os.listdir(path)) + +def chenge_dir(): + if not arg: + print("Необходимо указать имя директории вторым параметром") + return + path = os.path.join(arg) + print(path) + print(path_dir) + +def copy_file(): + if not arg: + print("Необходимо указать имя файла вторым параметром") + return + shutil.copy(arg, arg + r'.copy.py') + +def ping(): + print("pong") + +do = { + "help": print_help, + "mkdir": make_dir, + "ping": ping, + 'cp': copy_file, + 'rm': del_file, + 'cd': chenge_dir, + 'ls': path_dir +} + +try: + arg = sys.argv[2] +except IndexError: + arg = None + +try: + key = sys.argv[1] +except IndexError: + key = None + + +if key: + if do.get(key): + do[key]() + else: + print("Задан неверный ключ") + print("Укажите ключ help для получения справки") From 9ce4c479d67de36029ac2299380f5e581c37d322 Mon Sep 17 00:00:00 2001 From: PAND-or Date: Mon, 24 Sep 2018 17:25:32 +0300 Subject: [PATCH 11/30] hw06 easy --- lesson06/home_work/hw06_easy.py | 50 +++++++++++++++++++++++++++++++++ 1 file changed, 50 insertions(+) diff --git a/lesson06/home_work/hw06_easy.py b/lesson06/home_work/hw06_easy.py index fe5dc2b11..afe6eda33 100644 --- a/lesson06/home_work/hw06_easy.py +++ b/lesson06/home_work/hw06_easy.py @@ -2,8 +2,58 @@ # Определить методы, позволяющие вычислить: площадь, высоту и периметр фигуры. +import math +class Triangle: + + def __init__(self, a, b, c): + self.a = a + self.b = b + self.c = c + def area(self): + return 0.5 * abs((self.a[0]- self.c[0]) * (self.b[1] - self.c[1]) - (self.b[0] - self.c[0])*(self.a[1] - self.c[1])) + def perimeter(self): + return math.sqrt((self.b[0] - self.a[0])**2 + (self.b[1] - self.a[1])**2) + math.sqrt((self.c[0] - self.b[0])**2 + (self.c[1] - self.b[1])**2) + math.sqrt((self.c[0] - self.a[0])**2 + (self.c[1] - self.a[1])**2) + def height(self): + return 2 * self.area() / math.sqrt((self.b[0] - self.a[0])**2 + (self.b[1] - self.a[1])**2) + +triangle1 = Triangle((0,0), (0, 10), (10, 0)) +print(triangle1.b) +print(triangle1.area()) +print(triangle1.perimeter()) +print(triangle1.height()) + # Задача-2: Написать Класс "Равнобочная трапеция", заданной координатами 4-х точек. # Предусмотреть в классе методы: # проверка, является ли фигура равнобочной трапецией; # вычисления: длины сторон, периметр, площадь. +class Trapeze: + def __init__(self, a, b, c, d): + self.a = a + self.b = b + self.c = c + self.d = d + def lenth(self, n, m): + return math.sqrt((m[0] - n[0])**2 + (m[1] - n[1])**2) + def area(self): + ad = self.lenth(self.a, self.d) + bc = self.lenth(self.b, self.c) + return 0.5 * self.height() * (ad + bc) + def perimeter(self): + ab = self.lenth(self.a, self.b) + bc = self.lenth(self.b, self.c) + cd = self.lenth(self.c, self.d) + ad = self.lenth(self.a, self.d) + return ab + bc + cd + ad + def height(self): + ab = self.lenth(self.a, self.b) + bc = self.lenth(self.b, self.c) + cd = self.lenth(self.c, self.d) + ad = self.lenth(self.a, self.d) + return math.sqrt(abs(ab**2 - (((ad - bc)**2 + ab**2 + cd**2)/(2*(ad - bc)))**2)) + +trapeze1 = Trapeze((0,0), (0, 10), (10, 10), (20, 0)) +print(trapeze1.b) +print(trapeze1.area()) +print(trapeze1.perimeter()) +print(trapeze1.height()) \ No newline at end of file From b4692ebb6ac4460a6480bbb77e3735b4a2d5aee3 Mon Sep 17 00:00:00 2001 From: PAND-or Date: Mon, 24 Sep 2018 21:02:24 +0300 Subject: [PATCH 12/30] hw06 normal --- lesson06/home_work/hw06_normal.py | 103 ++++++++++++++++++++++++++++++ 1 file changed, 103 insertions(+) diff --git a/lesson06/home_work/hw06_normal.py b/lesson06/home_work/hw06_normal.py index 01c3982f4..427bcb04c 100644 --- a/lesson06/home_work/hw06_normal.py +++ b/lesson06/home_work/hw06_normal.py @@ -15,3 +15,106 @@ # (Ученик --> Класс --> Учителя --> Предметы) # 4. Узнать ФИО родителей указанного ученика # 5. Получить список всех Учителей, преподающих в указанном классе + +class Scool: + def __init__(self): + self.teachers = [] + self.classes = [] + + def getClasses(self): + all_classes = [i.name for i in self.classes] + return all_classes + + def getClass(self, room_name): + for i in self.classes: + if i.name == room_name: + return i + else: + return None + + def getStudents(self, room_name): + return scool.getClass(room_name).getStudents() + + def getTeachers(self, room_name): + return scool.getClass(room_name).getTeachers() + + +class ClassRoom: + def __init__(self, name): + self.name = name + self.students = [] + self.teachers = [] + scool.classes.append(self) + + def getStudents(self): + all_students = [i.get_full_name() for i in self.students] + return all_students + + def getTeachers(self): + all_teachers = [i.get_full_name() for i in self.teachers] + return all_teachers + + +class People: + def __init__(self, name, surname): + self.name = name + self.surname = surname + + def get_full_name(self): + return self.name + ' ' + self.surname + + +class Student(People): + def __init__(self, name, surname, class_room, parents): + People.__init__(self, name, surname) + self.parents = [People(i[0], i[1]) for i in parents] + if scool.getClass(class_room) == None: + self.class_room = ClassRoom(class_room) + else: + self.class_room = scool.getClass(class_room) + self.class_room.students.append(self) + + def listSubjects(self): + all_subjects = [i.courses for i in self.class_room.teachers] + return all_subjects + + def getParrents(self): + all_parents = [i.get_full_name() for i in self.parents] + return all_parents + + +class Teacher(People): + def __init__(self, name, surname, teach_classes, courses): + People.__init__(self, name, surname) + self.teach_classes = [] + for teach_class in teach_classes: #добавление этого учителя во все классы в которых он преподает + if scool.getClass(teach_class) == None: + ClassRoom(teach_class).teachers.append(self) + else: + scool.getClass(teach_class).teachers.append(self) + self.courses = courses + self.teach_classes = teach_classes + scool.teachers.append(self) + +if __name__ == "__main__": + scool = Scool() + + students = [Student("Александр", "Иванов", "5 А", [("Андрей", "Иванов"), ("Алла", "Иванова")]), + Student("Петр", "Сидоров", "8 Б", [("Петр", "Сидоров"), ("Ирина", "Сидорова")]), + Student("Иван", "Петров", "4 В", [("Владимир", "Петров"), ("Татьяна", "Петрова")]), + Student("Петр", "Федоров", "8 Б", [("Алексей", "Федоров"), ("Ольга", "Федорова")]), + Student("Андрей", "Емельянов", "4 В", [("Семен", "Емельянов"), ("Елена", "Емельянова")]), + Student("Владимир", "Курьянов", "8 Б", [("Павел", "Курьянов"), ("Алина", "Курьянова")]), + Student("Константин", "Спиридонов", "4 В", [("Олег", "Спиридонов"), ("Карина", "Спиридонова")]), + ] + + teachers = [Teacher("Александра", "Иванова", ["5 А", "8 Б", "4 В"], "Математика"), + Teacher("Татьяна", "Семенова", ["5 А", "4 В"], "Биология"), + Teacher("Иван", "Тетерев", ["4 В"], "Труд"), + ] + + print('Список классов школы', scool.getClasses()) + print('Список студентов 8Б', scool.getStudents("8 Б")) + print('Список предметов первого студента', students[0].listSubjects()) + print('Фио родителей первого студента', students[0].getParrents()) + print('Список учителей 5А класса', scool.getTeachers("5 А")) From 6fa59eaa8d34eb387fac5de1812598b5c2b82931 Mon Sep 17 00:00:00 2001 From: PAND-or Date: Mon, 24 Sep 2018 23:23:58 +0300 Subject: [PATCH 13/30] same style fix --- lesson06/home_work/hw06_easy.py | 64 ++++++++++++++++++++++-------- lesson06/home_work/hw06_normal.py | 65 +++++++++++++++---------------- 2 files changed, 78 insertions(+), 51 deletions(-) diff --git a/lesson06/home_work/hw06_easy.py b/lesson06/home_work/hw06_easy.py index afe6eda33..42f108a8e 100644 --- a/lesson06/home_work/hw06_easy.py +++ b/lesson06/home_work/hw06_easy.py @@ -1,26 +1,42 @@ +__author__ = "Андрей Петров" + # Задача-1: Написать класс для фигуры-треугольника, заданного координатами трех точек. # Определить методы, позволяющие вычислить: площадь, высоту и периметр фигуры. import math -class Triangle: - + +class Triangle: def __init__(self, a, b, c): self.a = a self.b = b self.c = c + + def lenth(self, n, m): + return math.sqrt((m[0] - n[0])**2 + (m[1] - n[1])**2) + + @property def area(self): - return 0.5 * abs((self.a[0]- self.c[0]) * (self.b[1] - self.c[1]) - (self.b[0] - self.c[0])*(self.a[1] - self.c[1])) + ab = self.lenth(self.a, self.b) + bc = self.lenth(self.b, self.c) + ac = self.lenth(self.a, self.c) + p = self.perimeter / 2 + return math.sqrt(p*(p - ac) * (p - ab) * (p - bc)) + + @property def perimeter(self): - return math.sqrt((self.b[0] - self.a[0])**2 + (self.b[1] - self.a[1])**2) + math.sqrt((self.c[0] - self.b[0])**2 + (self.c[1] - self.b[1])**2) + math.sqrt((self.c[0] - self.a[0])**2 + (self.c[1] - self.a[1])**2) + ab = self.lenth(self.a, self.b) + bc = self.lenth(self.b, self.c) + ac = self.lenth(self.a, self.c) + return ab + bc + ac + + @property def height(self): - return 2 * self.area() / math.sqrt((self.b[0] - self.a[0])**2 + (self.b[1] - self.a[1])**2) - -triangle1 = Triangle((0,0), (0, 10), (10, 0)) -print(triangle1.b) -print(triangle1.area()) -print(triangle1.perimeter()) -print(triangle1.height()) + ab = self.lenth(self.a, self.b) + bc = self.lenth(self.b, self.c) + ac = self.lenth(self.a, self.c) + p = self.perimeter / 2 + return (2 / ac) * math.sqrt(p*(p - ac) * (p - ab) * (p - bc)) # Задача-2: Написать Класс "Равнобочная трапеция", заданной координатами 4-х точек. # Предусмотреть в классе методы: @@ -33,27 +49,41 @@ def __init__(self, a, b, c, d): self.b = b self.c = c self.d = d + def lenth(self, n, m): return math.sqrt((m[0] - n[0])**2 + (m[1] - n[1])**2) + + @property def area(self): ad = self.lenth(self.a, self.d) bc = self.lenth(self.b, self.c) - return 0.5 * self.height() * (ad + bc) + return 0.5 * self.height * (ad + bc) + + @property def perimeter(self): ab = self.lenth(self.a, self.b) bc = self.lenth(self.b, self.c) cd = self.lenth(self.c, self.d) ad = self.lenth(self.a, self.d) return ab + bc + cd + ad + + @property def height(self): ab = self.lenth(self.a, self.b) bc = self.lenth(self.b, self.c) cd = self.lenth(self.c, self.d) ad = self.lenth(self.a, self.d) return math.sqrt(abs(ab**2 - (((ad - bc)**2 + ab**2 + cd**2)/(2*(ad - bc)))**2)) + + +if __name__ == "__main__": + triangle1 = Triangle((0,0), (0, 10), (10, 0)) + print('Площадь треугольника', triangle1.area) + print('Периметр треугольника', triangle1.perimeter) + print('Высота треугольника', triangle1.height) + -trapeze1 = Trapeze((0,0), (0, 10), (10, 10), (20, 0)) -print(trapeze1.b) -print(trapeze1.area()) -print(trapeze1.perimeter()) -print(trapeze1.height()) \ No newline at end of file + trapeze1 = Trapeze((0,0), (0, 10), (10, 10), (20, 0)) + print('Площадь трапеции', trapeze1.area) + print('Периметр трапеции', trapeze1.perimeter) + print('Высота трапеции', trapeze1.height) \ No newline at end of file diff --git a/lesson06/home_work/hw06_normal.py b/lesson06/home_work/hw06_normal.py index 427bcb04c..af6a2c66c 100644 --- a/lesson06/home_work/hw06_normal.py +++ b/lesson06/home_work/hw06_normal.py @@ -1,3 +1,5 @@ +__author__ = "Андрей Петров" + # Задание-1: # Реализуйте описаную ниже задачу, используя парадигмы ООП: # В школе есть Классы(5А, 7Б и т.д.), в которых учатся Ученики. @@ -16,43 +18,39 @@ # 4. Узнать ФИО родителей указанного ученика # 5. Получить список всех Учителей, преподающих в указанном классе -class Scool: +class School: def __init__(self): self.teachers = [] self.classes = [] - def getClasses(self): - all_classes = [i.name for i in self.classes] - return all_classes - - def getClass(self, room_name): + def getClassByName(self, room_name): for i in self.classes: if i.name == room_name: return i - else: - return None - + return None + + def getClasses(self): + return [i.name for i in self.classes] + def getStudents(self, room_name): - return scool.getClass(room_name).getStudents() - + return school.getClassByName(room_name).getStudents() + def getTeachers(self, room_name): - return scool.getClass(room_name).getTeachers() + return school.getClassByName(room_name).getTeachers() + - class ClassRoom: def __init__(self, name): self.name = name self.students = [] self.teachers = [] - scool.classes.append(self) + school.classes.append(self) def getStudents(self): - all_students = [i.get_full_name() for i in self.students] - return all_students + return [i.get_full_name() for i in self.students] def getTeachers(self): - all_teachers = [i.get_full_name() for i in self.teachers] - return all_teachers + return [i.get_full_name() for i in self.teachers] class People: @@ -68,36 +66,35 @@ class Student(People): def __init__(self, name, surname, class_room, parents): People.__init__(self, name, surname) self.parents = [People(i[0], i[1]) for i in parents] - if scool.getClass(class_room) == None: + if school.getClassByName(class_room) == None: self.class_room = ClassRoom(class_room) else: - self.class_room = scool.getClass(class_room) + self.class_room = school.getClassByName(class_room) self.class_room.students.append(self) def listSubjects(self): - all_subjects = [i.courses for i in self.class_room.teachers] - return all_subjects + return [i.courses for i in self.class_room.teachers] def getParrents(self): - all_parents = [i.get_full_name() for i in self.parents] - return all_parents + return [i.get_full_name() for i in self.parents] class Teacher(People): def __init__(self, name, surname, teach_classes, courses): People.__init__(self, name, surname) self.teach_classes = [] - for teach_class in teach_classes: #добавление этого учителя во все классы в которых он преподает - if scool.getClass(teach_class) == None: - ClassRoom(teach_class).teachers.append(self) - else: - scool.getClass(teach_class).teachers.append(self) self.courses = courses self.teach_classes = teach_classes - scool.teachers.append(self) + for teach_class in teach_classes: + if school.getClassByName(teach_class) == None: + ClassRoom(teach_class).teachers.append(self) + else: + school.getClassByName(teach_class).teachers.append(self) + school.teachers.append(self) + if __name__ == "__main__": - scool = Scool() + school = School() students = [Student("Александр", "Иванов", "5 А", [("Андрей", "Иванов"), ("Алла", "Иванова")]), Student("Петр", "Сидоров", "8 Б", [("Петр", "Сидоров"), ("Ирина", "Сидорова")]), @@ -113,8 +110,8 @@ def __init__(self, name, surname, teach_classes, courses): Teacher("Иван", "Тетерев", ["4 В"], "Труд"), ] - print('Список классов школы', scool.getClasses()) - print('Список студентов 8Б', scool.getStudents("8 Б")) + print('Список классов школы', school.getClasses()) + print('Список студентов 8Б', school.getStudents("8 Б")) print('Список предметов первого студента', students[0].listSubjects()) print('Фио родителей первого студента', students[0].getParrents()) - print('Список учителей 5А класса', scool.getTeachers("5 А")) + print('Список учителей 5А класса', school.getTeachers("5 А")) \ No newline at end of file From 86271790fbb90f62ae2f712a2139cb7ec6936fd8 Mon Sep 17 00:00:00 2001 From: PAND-or Date: Mon, 24 Sep 2018 23:48:20 +0300 Subject: [PATCH 14/30] same fix, static & property --- lesson06/home_work/hw06_normal.py | 76 +++++++++++++++++++------------ 1 file changed, 46 insertions(+), 30 deletions(-) diff --git a/lesson06/home_work/hw06_normal.py b/lesson06/home_work/hw06_normal.py index af6a2c66c..4f896d535 100644 --- a/lesson06/home_work/hw06_normal.py +++ b/lesson06/home_work/hw06_normal.py @@ -1,5 +1,3 @@ -__author__ = "Андрей Петров" - # Задание-1: # Реализуйте описаную ниже задачу, используя парадигмы ООП: # В школе есть Классы(5А, 7Б и т.д.), в которых учатся Ученики. @@ -23,20 +21,23 @@ def __init__(self): self.teachers = [] self.classes = [] - def getClassByName(self, room_name): + def getClass(self, room_name): for i in self.classes: if i.name == room_name: return i return None - def getClasses(self): + @property + def listClasses(self): return [i.name for i in self.classes] - - def getStudents(self, room_name): - return school.getClassByName(room_name).getStudents() - - def getTeachers(self, room_name): - return school.getClassByName(room_name).getTeachers() + + @staticmethod + def getStudents(room_name): + return school.getClass(room_name).listStudents + + @staticmethod + def getTeachers(room_name): + return school.getClass(room_name).listTeachers class ClassRoom: @@ -46,37 +47,49 @@ def __init__(self, name): self.teachers = [] school.classes.append(self) - def getStudents(self): - return [i.get_full_name() for i in self.students] + @property + def listStudents(self): + return [i.fullName for i in self.students] - def getTeachers(self): - return [i.get_full_name() for i in self.teachers] + @property + def listTeachers(self): + return [i.fullName for i in self.teachers] class People: def __init__(self, name, surname): self.name = name self.surname = surname - - def get_full_name(self): + + @property + def fullName(self): return self.name + ' ' + self.surname class Student(People): def __init__(self, name, surname, class_room, parents): People.__init__(self, name, surname) - self.parents = [People(i[0], i[1]) for i in parents] - if school.getClassByName(class_room) == None: - self.class_room = ClassRoom(class_room) - else: - self.class_room = school.getClassByName(class_room) + self.parents = self.addParrent(parents) + self.class_room = self.addClass(class_room) self.class_room.students.append(self) + + def addClass(self, class_room): + if school.getClass(class_room) == None: + return ClassRoom(class_room) + else: + return school.getClass(class_room) + @staticmethod + def addParrent(parents): + return [People(i[0], i[1]) for i in parents] + + @property def listSubjects(self): return [i.courses for i in self.class_room.teachers] - def getParrents(self): - return [i.get_full_name() for i in self.parents] + @property + def listParrents(self): + return [i.fullName for i in self.parents] class Teacher(People): @@ -85,14 +98,17 @@ def __init__(self, name, surname, teach_classes, courses): self.teach_classes = [] self.courses = courses self.teach_classes = teach_classes + self.addClass(teach_classes) + school.teachers.append(self) + + def addClass(self, teach_classes): for teach_class in teach_classes: - if school.getClassByName(teach_class) == None: + if school.getClass(teach_class) == None: ClassRoom(teach_class).teachers.append(self) else: - school.getClassByName(teach_class).teachers.append(self) - school.teachers.append(self) - + school.getClass(teach_class).teachers.append(self) + if __name__ == "__main__": school = School() @@ -110,8 +126,8 @@ def __init__(self, name, surname, teach_classes, courses): Teacher("Иван", "Тетерев", ["4 В"], "Труд"), ] - print('Список классов школы', school.getClasses()) + print('Список классов школы', school.listClasses) print('Список студентов 8Б', school.getStudents("8 Б")) - print('Список предметов первого студента', students[0].listSubjects()) - print('Фио родителей первого студента', students[0].getParrents()) + print('Список предметов первого студента', students[0].listSubjects) + print('Фио родителей первого студента', students[0].listParrents) print('Список учителей 5А класса', school.getTeachers("5 А")) \ No newline at end of file From 855d77ffc7fa6e1773bb3e2fb3a78de40b314814 Mon Sep 17 00:00:00 2001 From: PAND-or Date: Tue, 25 Sep 2018 01:10:58 +0300 Subject: [PATCH 15/30] hw06 hard --- lesson06/home_work/hw06_hard.py | 73 +++++++++++++++++++++++++++++++++ 1 file changed, 73 insertions(+) diff --git a/lesson06/home_work/hw06_hard.py b/lesson06/home_work/hw06_hard.py index fae8d84d2..60325b6a0 100644 --- a/lesson06/home_work/hw06_hard.py +++ b/lesson06/home_work/hw06_hard.py @@ -1,3 +1,5 @@ +__author__ = "Андрей Петров" + # Задание-1: Решите задачу (дублированную ниже): # Дана ведомость расчета заработной платы (файл "data/workers"). @@ -10,3 +12,74 @@ # С использованием классов. # Реализуйте классы сотрудников так, чтобы на вход функции-конструктора # каждый работник получал строку из файла + +import os +import re + +class Workers(): + def __init__(self): + self.list = [] + + def addWorker(self, data): + self.list.append(Worker(data)) + + def getWorker(self, name): + for i in self.list: + if i.name == name: + return i + return None + + def earning(self, args): + name = str(args[0] + ' ' + args[1]) + if not(self.getWorker(name) == None): + self.getWorker(name).earn(int(args[2])) + @property + def getSum(self): + esum = 0 + for i in self.list: + esum += i.earned + return int(esum) + + @property + def showlist(self): + return [i.name for i in self.list] + + @property + def showearnlist(self): + return [(i.name, i.earned ) for i in self.list] + + +class Worker(): + def __init__(self, args): + self.name = str(args[0] + ' ' + args[1]) + self.salary = int(args[2]) + self.norm = int(args[4]) + self.position = args[3] + self.pay_hours = float(int(args[2])/int(args[4])) + + def earn(self, worked): + if self.norm < worked: + self.earned = self.salary + (worked - self.norm) * self.pay_hours * 2 + #print(self.name, 'Переработал', 'норма', self.norm, 'отработал', worked, 'зарплата', self.salary, 'Получит', self.earned) + else: + self.earned = worked * self.pay_hours + #print(self.name, 'Недоработал', 'норма', self.norm, 'отработал', worked, 'Получит', self.earned) + return self.earned + +if __name__ == "__main__": + workers = Workers() + + with open(os.path.join('data', 'workers'), 'r', encoding='UTF-8') as f_workers: + for i, line in enumerate(f_workers): + if i > 0:# пропуск первой строки + result = re.split(r'\W+', line) + workers.addWorker(result) + + + with open(os.path.join('data', 'hours_of'), 'r', encoding='UTF-8') as f_hours_of: + for i, line in enumerate(f_hours_of): + if i > 0:# пропуск первой строки + result = re.split(r'\W+', line) + workers.earning(result) + print(workers.showearnlist) + print('Зарплата всех работников ', workers.getSum) From 002565ccf3f092e6b4ad81e4cc6389ade010f830 Mon Sep 17 00:00:00 2001 From: PAND-or Date: Tue, 25 Sep 2018 01:11:57 +0300 Subject: [PATCH 16/30] same style fix --- lesson06/home_work/hw06_hard.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/lesson06/home_work/hw06_hard.py b/lesson06/home_work/hw06_hard.py index 60325b6a0..a549c9ae3 100644 --- a/lesson06/home_work/hw06_hard.py +++ b/lesson06/home_work/hw06_hard.py @@ -33,6 +33,7 @@ def earning(self, args): name = str(args[0] + ' ' + args[1]) if not(self.getWorker(name) == None): self.getWorker(name).earn(int(args[2])) + @property def getSum(self): esum = 0 @@ -67,6 +68,7 @@ def earn(self, worked): return self.earned if __name__ == "__main__": + workers = Workers() with open(os.path.join('data', 'workers'), 'r', encoding='UTF-8') as f_workers: @@ -81,5 +83,7 @@ def earn(self, worked): if i > 0:# пропуск первой строки result = re.split(r'\W+', line) workers.earning(result) + + print(workers.showearnlist) print('Зарплата всех работников ', workers.getSum) From 7944548c0301f5f2be396ca4ea0c0c2d6e5702fe Mon Sep 17 00:00:00 2001 From: PAND-or Date: Thu, 27 Sep 2018 16:27:39 +0300 Subject: [PATCH 17/30] hw07 loto --- lesson07/home_work/loto.py | 96 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 96 insertions(+) diff --git a/lesson07/home_work/loto.py b/lesson07/home_work/loto.py index da01d4c00..805f39d1d 100644 --- a/lesson07/home_work/loto.py +++ b/lesson07/home_work/loto.py @@ -57,3 +57,99 @@ модуль random: http://docs.python.org/3/library/random.html """ + +import random + +class Numbers(): + def __init__(self): + self.list = [i for i in range(1, 91)] + + @property + def getNumbers(self): + number = random.choice(self.list) + self.deleteNumbers(number) + return number + + def deleteNumbers(self, number): + if number in self.list: + self.list.remove(number) + return True + else: + return False + + + + +class Cards(Numbers): + def __init__(self): + self.numbers = Numbers() + self.list = random.sample(self.numbers.list, 15) + self.lines = self.create_lines() + + def create_lines(self): + lines = [ + self.list[:5], + self.list[5:10], + self.list[10:15] + ] + for line in lines: + line.sort() + return lines + + def str_lines(self, line): + strLine = '' + for i, number in enumerate(line): + if (i == 0) & (number < 10): + strLine += str(number) + elif(i == 0) & (number > 10): + strLine += ' ' + str(number) + elif len(strLine) > 25: + strLine += ' ' + str(number) + elif (line[i] - line[i-1]) > 10: + strLine += ' ' + str(number) + else: + strLine += ' ' + str(number) + return strLine + + def printStrCard(self): + strLines = [] + for line in self.lines: + strLines.append(self.str_lines(line)) + strcard = str('--------------------------\n{}\n{}\n{}\n--------------------------\n').format(strLines[0], strLines[1], strLines[2]) + return strcard + + +if __name__ == "__main__": + + computer_card = Cards() + user_card = Cards() + barrels = Numbers() + + print('Карточка компьютера \n', computer_card.printStrCard()) + print('\n Карточка Игрока \n', user_card.printStrCard()) + + while True: + if len(user_card.list) == 0: + print('Game OVER Победил игрок') + elif len(computer_card.list) == 0: + print('Game OVER Победил компьютер') + + number = barrels.getNumbers + print('Число на боченке {}'.format(number)) + + inp = input('Зачеркнуть или продолжить?: Y / N: ') + if inp == "Y": + if user_card.deleteNumbers(number): + print('Такой номер есть в карточке!') + computer_card.deleteNumbers(number) + else: + print('Game OVER Такой номер есть в карточке!') + break + else: + if user_card.deleteNumbers(number): + print('Game OVER Такой номер есть в карточке!') + break + else: + print('Верно! Такого номера нет в карточке!') + computer_card.deleteNumbers(number) + From a701357bb168b666cb558cfa2405533109172ca0 Mon Sep 17 00:00:00 2001 From: PAND-or Date: Fri, 28 Sep 2018 17:32:16 +0300 Subject: [PATCH 18/30] same fix --- lesson05/home_work/hw05_hard.py | 4 ++-- lesson06/home_work/hw06_hard.py | 10 ++++++---- 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/lesson05/home_work/hw05_hard.py b/lesson05/home_work/hw05_hard.py index 3c487cbe2..4a829ba86 100644 --- a/lesson05/home_work/hw05_hard.py +++ b/lesson05/home_work/hw05_hard.py @@ -74,9 +74,9 @@ def chenge_dir(): if not arg: print("Необходимо указать имя директории вторым параметром") return - path = os.path.join(arg) + path = os.chdir(arg) print(path) - print(path_dir) + print(path_dir()) def copy_file(): if not arg: diff --git a/lesson06/home_work/hw06_hard.py b/lesson06/home_work/hw06_hard.py index a549c9ae3..fb8c1146d 100644 --- a/lesson06/home_work/hw06_hard.py +++ b/lesson06/home_work/hw06_hard.py @@ -24,10 +24,12 @@ def addWorker(self, data): self.list.append(Worker(data)) def getWorker(self, name): - for i in self.list: - if i.name == name: - return i - return None + #print(dir(filter(lambda n: n.name == name, self.list))) + return filter(lambda n: n.name == name, self.list) + #for i in self.list: + #if i.name == name: + #return i + #return None def earning(self, args): name = str(args[0] + ' ' + args[1]) From c4e32e7f02e0f220c16ecba37df640b49bc4751d Mon Sep 17 00:00:00 2001 From: PAND-or Date: Fri, 28 Sep 2018 17:33:08 +0300 Subject: [PATCH 19/30] End point class School --- lesson06/home_work/hw06_normal.py | 120 ++++++++++++++++++------------ 1 file changed, 71 insertions(+), 49 deletions(-) diff --git a/lesson06/home_work/hw06_normal.py b/lesson06/home_work/hw06_normal.py index 4f896d535..4c915c2a8 100644 --- a/lesson06/home_work/hw06_normal.py +++ b/lesson06/home_work/hw06_normal.py @@ -1,3 +1,5 @@ +__author__ = "Андрей Петров" + # Задание-1: # Реализуйте описаную ниже задачу, используя парадигмы ООП: # В школе есть Классы(5А, 7Б и т.д.), в которых учатся Ученики. @@ -20,24 +22,61 @@ class School: def __init__(self): self.teachers = [] self.classes = [] + self.students = [] def getClass(self, room_name): for i in self.classes: if i.name == room_name: return i return None + + def get_students_by_fullname(self, fullname): + for i in self.students: + if i.full_name == fullname: + return i + return None + def get_students_by_room(self, room_name): + classroom = self.getClass(room_name) + if not classroom == None: + return classroom.listStudents + else: + return None + + def add_student(self, name, surname, class_room, parents): + student = Student(name, surname, class_room, parents) + classroom = self.add_class(class_room) + student.class_room = classroom + self.students.append(student) + classroom.students.append(student) + return student + + def add_teacher(self, name, surname, teach_classes, courses): + teacher = Teacher(name, surname, teach_classes, courses) + self.teachers.append(teacher) + for teach_class in teach_classes: + classroom = self.add_class(teach_class) + classroom.teachers.append(teacher) + return teacher + + def add_class(self, class_room): + if self.getClass(class_room) == None: + class_obj = ClassRoom(class_room) + self.classes.append(class_obj) + return class_obj + else: + return self.getClass(class_room) + @property def listClasses(self): return [i.name for i in self.classes] - - @staticmethod - def getStudents(room_name): - return school.getClass(room_name).listStudents - - @staticmethod - def getTeachers(room_name): - return school.getClass(room_name).listTeachers + + def getTeachers(self, room_name): + classroom = self.getClass(room_name) + if not classroom == None: + return classroom.listTeachers + else: + return None class ClassRoom: @@ -45,15 +84,14 @@ def __init__(self, name): self.name = name self.students = [] self.teachers = [] - school.classes.append(self) @property def listStudents(self): - return [i.fullName for i in self.students] + return [i.full_name for i in self.students] @property def listTeachers(self): - return [i.fullName for i in self.teachers] + return [i.full_name for i in self.teachers] class People: @@ -62,7 +100,7 @@ def __init__(self, name, surname): self.surname = surname @property - def fullName(self): + def full_name(self): return self.name + ' ' + self.surname @@ -70,14 +108,7 @@ class Student(People): def __init__(self, name, surname, class_room, parents): People.__init__(self, name, surname) self.parents = self.addParrent(parents) - self.class_room = self.addClass(class_room) - self.class_room.students.append(self) - - def addClass(self, class_room): - if school.getClass(class_room) == None: - return ClassRoom(class_room) - else: - return school.getClass(class_room) + self.class_room = class_room @staticmethod def addParrent(parents): @@ -85,11 +116,12 @@ def addParrent(parents): @property def listSubjects(self): + return [i.courses for i in self.class_room.teachers] @property def listParrents(self): - return [i.fullName for i in self.parents] + return [i.full_name for i in self.parents] class Teacher(People): @@ -98,36 +130,26 @@ def __init__(self, name, surname, teach_classes, courses): self.teach_classes = [] self.courses = courses self.teach_classes = teach_classes - self.addClass(teach_classes) - school.teachers.append(self) - - def addClass(self, teach_classes): - for teach_class in teach_classes: - if school.getClass(teach_class) == None: - ClassRoom(teach_class).teachers.append(self) - else: - school.getClass(teach_class).teachers.append(self) if __name__ == "__main__": - school = School() - - students = [Student("Александр", "Иванов", "5 А", [("Андрей", "Иванов"), ("Алла", "Иванова")]), - Student("Петр", "Сидоров", "8 Б", [("Петр", "Сидоров"), ("Ирина", "Сидорова")]), - Student("Иван", "Петров", "4 В", [("Владимир", "Петров"), ("Татьяна", "Петрова")]), - Student("Петр", "Федоров", "8 Б", [("Алексей", "Федоров"), ("Ольга", "Федорова")]), - Student("Андрей", "Емельянов", "4 В", [("Семен", "Емельянов"), ("Елена", "Емельянова")]), - Student("Владимир", "Курьянов", "8 Б", [("Павел", "Курьянов"), ("Алина", "Курьянова")]), - Student("Константин", "Спиридонов", "4 В", [("Олег", "Спиридонов"), ("Карина", "Спиридонова")]), - ] + schooll = School() + + schooll.add_student("Александр", "Иванов", "5 А", [("Андрей", "Иванов"), ("Алла", "Иванова")]) + schooll.add_student("Петр", "Сидоров", "8 Б", [("Петр", "Сидоров"), ("Ирина", "Сидорова")]) + schooll.add_student("Иван", "Петров", "4 В", [("Владимир", "Петров"), ("Татьяна", "Петрова")]) + schooll.add_student("Петр", "Федоров", "8 Б", [("Алексей", "Федоров"), ("Ольга", "Федорова")]) + schooll.add_student("Андрей", "Емельянов", "4 В", [("Семен", "Емельянов"), ("Елена", "Емельянова")]) + schooll.add_student("Владимир", "Курьянов", "8 Б", [("Павел", "Курьянов"), ("Алина", "Курьянова")]) + schooll.add_student("Константин", "Спиридонов", "4 В", [("Олег", "Спиридонов"), ("Карина", "Спиридонова")]) + - teachers = [Teacher("Александра", "Иванова", ["5 А", "8 Б", "4 В"], "Математика"), - Teacher("Татьяна", "Семенова", ["5 А", "4 В"], "Биология"), - Teacher("Иван", "Тетерев", ["4 В"], "Труд"), - ] + schooll.add_teacher("Александра", "Иванова", ["5 А", "8 Б", "4 В"], "Математика") + schooll.add_teacher("Татьяна", "Семенова", ["5 А", "4 В"], "Биология") + schooll.add_teacher("Иван", "Тетерев", ["4 В"], "Труд") - print('Список классов школы', school.listClasses) - print('Список студентов 8Б', school.getStudents("8 Б")) - print('Список предметов первого студента', students[0].listSubjects) - print('Фио родителей первого студента', students[0].listParrents) - print('Список учителей 5А класса', school.getTeachers("5 А")) \ No newline at end of file + print('Список классов школы', schooll.listClasses) + print('Список студентов 8Б', schooll.get_students_by_room('8 Б')) + print('Список предметов первого студента', schooll.get_students_by_fullname('Александр Иванов').listSubjects) + print('Фио родителей первого студента', schooll.get_students_by_fullname('Александр Иванов').listParrents) + print('Список учителей 5А класса', schooll.getTeachers("5 А")) \ No newline at end of file From 55c2a1b33e8a710942045369cced884887777392 Mon Sep 17 00:00:00 2001 From: PAND-or Date: Fri, 28 Sep 2018 17:53:26 +0300 Subject: [PATCH 20/30] CamelCase to snake_case --- lesson06/home_work/hw06_hard.py | 20 +++++++------- lesson06/home_work/hw06_normal.py | 38 +++++++++++++------------- lesson07/home_work/loto.py | 44 +++++++++++++++---------------- 3 files changed, 51 insertions(+), 51 deletions(-) diff --git a/lesson06/home_work/hw06_hard.py b/lesson06/home_work/hw06_hard.py index fb8c1146d..308d4a4db 100644 --- a/lesson06/home_work/hw06_hard.py +++ b/lesson06/home_work/hw06_hard.py @@ -20,10 +20,10 @@ class Workers(): def __init__(self): self.list = [] - def addWorker(self, data): + def add_worker(self, data): self.list.append(Worker(data)) - def getWorker(self, name): + def get_worker(self, name): #print(dir(filter(lambda n: n.name == name, self.list))) return filter(lambda n: n.name == name, self.list) #for i in self.list: @@ -33,22 +33,22 @@ def getWorker(self, name): def earning(self, args): name = str(args[0] + ' ' + args[1]) - if not(self.getWorker(name) == None): - self.getWorker(name).earn(int(args[2])) + if not(self.get_worker(name) == None): + self.get_worker(name).earn(int(args[2])) @property - def getSum(self): + def get_sum(self): esum = 0 for i in self.list: esum += i.earned return int(esum) @property - def showlist(self): + def show_list(self): return [i.name for i in self.list] @property - def showearnlist(self): + def show_earn_list(self): return [(i.name, i.earned ) for i in self.list] @@ -77,7 +77,7 @@ def earn(self, worked): for i, line in enumerate(f_workers): if i > 0:# пропуск первой строки result = re.split(r'\W+', line) - workers.addWorker(result) + workers.add_worker(result) with open(os.path.join('data', 'hours_of'), 'r', encoding='UTF-8') as f_hours_of: @@ -87,5 +87,5 @@ def earn(self, worked): workers.earning(result) - print(workers.showearnlist) - print('Зарплата всех работников ', workers.getSum) + print(workers.show_earn_list) + print('Зарплата всех работников ', workers.get_sum) diff --git a/lesson06/home_work/hw06_normal.py b/lesson06/home_work/hw06_normal.py index 4c915c2a8..54263193e 100644 --- a/lesson06/home_work/hw06_normal.py +++ b/lesson06/home_work/hw06_normal.py @@ -24,7 +24,7 @@ def __init__(self): self.classes = [] self.students = [] - def getClass(self, room_name): + def get_class(self, room_name): for i in self.classes: if i.name == room_name: return i @@ -37,9 +37,9 @@ def get_students_by_fullname(self, fullname): return None def get_students_by_room(self, room_name): - classroom = self.getClass(room_name) + classroom = self.get_class(room_name) if not classroom == None: - return classroom.listStudents + return classroom.list_students else: return None @@ -60,21 +60,21 @@ def add_teacher(self, name, surname, teach_classes, courses): return teacher def add_class(self, class_room): - if self.getClass(class_room) == None: + if self.get_class(class_room) == None: class_obj = ClassRoom(class_room) self.classes.append(class_obj) return class_obj else: - return self.getClass(class_room) + return self.get_class(class_room) @property - def listClasses(self): + def list_classes(self): return [i.name for i in self.classes] - def getTeachers(self, room_name): - classroom = self.getClass(room_name) + def get_teachers(self, room_name): + classroom = self.get_class(room_name) if not classroom == None: - return classroom.listTeachers + return classroom.list_teachers else: return None @@ -86,11 +86,11 @@ def __init__(self, name): self.teachers = [] @property - def listStudents(self): + def list_students(self): return [i.full_name for i in self.students] @property - def listTeachers(self): + def list_teachers(self): return [i.full_name for i in self.teachers] @@ -107,20 +107,20 @@ def full_name(self): class Student(People): def __init__(self, name, surname, class_room, parents): People.__init__(self, name, surname) - self.parents = self.addParrent(parents) + self.parents = self.add_parrent(parents) self.class_room = class_room @staticmethod - def addParrent(parents): + def add_parrent(parents): return [People(i[0], i[1]) for i in parents] @property - def listSubjects(self): + def list_subjects(self): return [i.courses for i in self.class_room.teachers] @property - def listParrents(self): + def list_parrents(self): return [i.full_name for i in self.parents] @@ -148,8 +148,8 @@ def __init__(self, name, surname, teach_classes, courses): schooll.add_teacher("Татьяна", "Семенова", ["5 А", "4 В"], "Биология") schooll.add_teacher("Иван", "Тетерев", ["4 В"], "Труд") - print('Список классов школы', schooll.listClasses) + print('Список классов школы', schooll.list_classes) print('Список студентов 8Б', schooll.get_students_by_room('8 Б')) - print('Список предметов первого студента', schooll.get_students_by_fullname('Александр Иванов').listSubjects) - print('Фио родителей первого студента', schooll.get_students_by_fullname('Александр Иванов').listParrents) - print('Список учителей 5А класса', schooll.getTeachers("5 А")) \ No newline at end of file + print('Список предметов первого студента', schooll.get_students_by_fullname('Александр Иванов').list_subjects) + print('Фио родителей первого студента', schooll.get_students_by_fullname('Александр Иванов').list_parrents) + print('Список учителей 5А класса', schooll.get_teachers("5 А")) \ No newline at end of file diff --git a/lesson07/home_work/loto.py b/lesson07/home_work/loto.py index 805f39d1d..0cf02992e 100644 --- a/lesson07/home_work/loto.py +++ b/lesson07/home_work/loto.py @@ -65,12 +65,12 @@ def __init__(self): self.list = [i for i in range(1, 91)] @property - def getNumbers(self): + def get_numbers(self): number = random.choice(self.list) - self.deleteNumbers(number) + self.delete_numbers(number) return number - def deleteNumbers(self, number): + def delete_numbers(self, number): if number in self.list: self.list.remove(number) return True @@ -97,25 +97,25 @@ def create_lines(self): return lines def str_lines(self, line): - strLine = '' + str_line = '' for i, number in enumerate(line): if (i == 0) & (number < 10): - strLine += str(number) + str_line += str(number) elif(i == 0) & (number > 10): - strLine += ' ' + str(number) - elif len(strLine) > 25: - strLine += ' ' + str(number) + str_line += ' ' + str(number) + elif len(str_line) > 25: + str_line += ' ' + str(number) elif (line[i] - line[i-1]) > 10: - strLine += ' ' + str(number) + str_line += ' ' + str(number) else: - strLine += ' ' + str(number) - return strLine + str_line += ' ' + str(number) + return str_line - def printStrCard(self): - strLines = [] + def print_str_card(self): + str_lines = [] for line in self.lines: - strLines.append(self.str_lines(line)) - strcard = str('--------------------------\n{}\n{}\n{}\n--------------------------\n').format(strLines[0], strLines[1], strLines[2]) + str_lines.append(self.str_lines(line)) + strcard = str('--------------------------\n{}\n{}\n{}\n--------------------------\n').format(str_lines[0], str_lines[1], str_lines[2]) return strcard @@ -125,8 +125,8 @@ def printStrCard(self): user_card = Cards() barrels = Numbers() - print('Карточка компьютера \n', computer_card.printStrCard()) - print('\n Карточка Игрока \n', user_card.printStrCard()) + print('Карточка компьютера \n', computer_card.print_str_card()) + print('\n Карточка Игрока \n', user_card.print_str_card()) while True: if len(user_card.list) == 0: @@ -134,22 +134,22 @@ def printStrCard(self): elif len(computer_card.list) == 0: print('Game OVER Победил компьютер') - number = barrels.getNumbers + number = barrels.get_numbers print('Число на боченке {}'.format(number)) inp = input('Зачеркнуть или продолжить?: Y / N: ') if inp == "Y": - if user_card.deleteNumbers(number): + if user_card.delete_numbers(number): print('Такой номер есть в карточке!') - computer_card.deleteNumbers(number) + computer_card.delete_numbers(number) else: print('Game OVER Такой номер есть в карточке!') break else: - if user_card.deleteNumbers(number): + if user_card.delete_numbers(number): print('Game OVER Такой номер есть в карточке!') break else: print('Верно! Такого номера нет в карточке!') - computer_card.deleteNumbers(number) + computer_card.delete_numbers(number) From 0d31bbf46c7516e5c595713a52a5ff1511d40ca2 Mon Sep 17 00:00:00 2001 From: PAND-or Date: Sun, 30 Sep 2018 11:01:08 +0300 Subject: [PATCH 21/30] EndPoint Class Game --- lesson07/home_work/loto.py | 85 +++++++++++++++++++++----------------- 1 file changed, 47 insertions(+), 38 deletions(-) diff --git a/lesson07/home_work/loto.py b/lesson07/home_work/loto.py index 0cf02992e..43c6172e2 100644 --- a/lesson07/home_work/loto.py +++ b/lesson07/home_work/loto.py @@ -60,9 +60,46 @@ import random + +class Game: + def __init__(self, start, end): + self.computer_card = Cards(start, end) + self.user_card = Cards(start, end) + self.barrels = Numbers(start, end) + + def start(self): + print('Карточка компьютера \n', self.computer_card.print_str_card()) + print('\n Карточка Игрока \n', self.user_card.print_str_card()) + + while True: + if len(self.user_card.list) == 0: + print('Game OVER Победил игрок') + elif len(self.computer_card.list) == 0: + print('Game OVER Победил компьютер') + + number = self.barrels.get_numbers + print('Число на боченке {}'.format(number)) + + inp = input('Зачеркнуть или продолжить?: Y / N: ') + if inp == "Y": + if self.user_card.delete_numbers(number): + print('Такой номер есть в карточке!') + self.computer_card.delete_numbers(number) + else: + print('Game OVER Такой номер есть в карточке!') + break + else: + if self.user_card.delete_numbers(number): + print('Game OVER Такой номер есть в карточке!') + break + else: + print('Верно! Такого номера нет в карточке!') + self.computer_card.delete_numbers(number) + + class Numbers(): - def __init__(self): - self.list = [i for i in range(1, 91)] + def __init__(self, start, end): + self.list = [i for i in range(start, end)] @property def get_numbers(self): @@ -81,8 +118,8 @@ def delete_numbers(self, number): class Cards(Numbers): - def __init__(self): - self.numbers = Numbers() + def __init__(self, start, end): + self.numbers = Numbers(start, end) self.list = random.sample(self.numbers.list, 15) self.lines = self.create_lines() @@ -118,38 +155,10 @@ def print_str_card(self): strcard = str('--------------------------\n{}\n{}\n{}\n--------------------------\n').format(str_lines[0], str_lines[1], str_lines[2]) return strcard - + if __name__ == "__main__": - - computer_card = Cards() - user_card = Cards() - barrels = Numbers() - - print('Карточка компьютера \n', computer_card.print_str_card()) - print('\n Карточка Игрока \n', user_card.print_str_card()) - - while True: - if len(user_card.list) == 0: - print('Game OVER Победил игрок') - elif len(computer_card.list) == 0: - print('Game OVER Победил компьютер') - - number = barrels.get_numbers - print('Число на боченке {}'.format(number)) - - inp = input('Зачеркнуть или продолжить?: Y / N: ') - if inp == "Y": - if user_card.delete_numbers(number): - print('Такой номер есть в карточке!') - computer_card.delete_numbers(number) - else: - print('Game OVER Такой номер есть в карточке!') - break - else: - if user_card.delete_numbers(number): - print('Game OVER Такой номер есть в карточке!') - break - else: - print('Верно! Такого номера нет в карточке!') - computer_card.delete_numbers(number) - + + game = Game(1, 91) + game.start() + + From 2bf50986295807c9d1ee72e4a82ca50fd60327fd Mon Sep 17 00:00:00 2001 From: PAND-or Date: Sun, 30 Sep 2018 14:52:39 +0300 Subject: [PATCH 22/30] add class Gamer, User, Ai --- lesson07/home_work/loto.py | 64 +++++++++++++++++++++++++------------- 1 file changed, 43 insertions(+), 21 deletions(-) diff --git a/lesson07/home_work/loto.py b/lesson07/home_work/loto.py index 43c6172e2..a5fabfbc2 100644 --- a/lesson07/home_work/loto.py +++ b/lesson07/home_work/loto.py @@ -66,35 +66,25 @@ def __init__(self, start, end): self.computer_card = Cards(start, end) self.user_card = Cards(start, end) self.barrels = Numbers(start, end) + self.gamer = UserGamer('Андрей', start, end, 15) + self.ai = UserGamer('ЦПУ', start, end, 15) def start(self): + print('Карточка компьютера \n', self.computer_card.print_str_card()) print('\n Карточка Игрока \n', self.user_card.print_str_card()) while True: - if len(self.user_card.list) == 0: + if len(self.gamer.card.list) == 0: print('Game OVER Победил игрок') - elif len(self.computer_card.list) == 0: + elif len(self.ai.card.list) == 0: print('Game OVER Победил компьютер') number = self.barrels.get_numbers print('Число на боченке {}'.format(number)) - - inp = input('Зачеркнуть или продолжить?: Y / N: ') - if inp == "Y": - if self.user_card.delete_numbers(number): - print('Такой номер есть в карточке!') - self.computer_card.delete_numbers(number) - else: - print('Game OVER Такой номер есть в карточке!') - break - else: - if self.user_card.delete_numbers(number): - print('Game OVER Такой номер есть в карточке!') - break - else: - print('Верно! Такого номера нет в карточке!') - self.computer_card.delete_numbers(number) + if not self.gamer.do(number): + break + self.ai.do(number) class Numbers(): @@ -114,13 +104,45 @@ def delete_numbers(self, number): else: return False - +class Gamer(): + def __init__(self, name, start, end, num_numbers): + self.card = Cards(start, end, num_numbers) + self.name = name + +class AiGamer(Gamer): + def __init__(self, name, start, end, num_numbers): + super().__init__(name, start, end, num_numbers) + def do(self, number): + self.card.delete_numbers(number) + +class UserGamer(Gamer): + def __init__(self, name, start, end, num_numbers): + super().__init__(name, start, end, num_numbers) + + def do(self, number): + inp = input('Зачеркнуть или продолжить?: Y / N: ') + if inp == "Y": + if self.card.delete_numbers(number): + print('Такой номер есть в карточке!') + return True + else: + print('Game OVER Такой номер есть в карточке!') + return False + else: + if self.card.delete_numbers(number): + print('Game OVER Такой номер есть в карточке!') + return False + else: + return True + print('Верно! Такого номера нет в карточке!') + #self.computer_card.delete_numbers(number) + class Cards(Numbers): - def __init__(self, start, end): + def __init__(self, start, end, num_numbers): self.numbers = Numbers(start, end) - self.list = random.sample(self.numbers.list, 15) + self.list = random.sample(self.numbers.list, num_numbers) self.lines = self.create_lines() def create_lines(self): From 83e1157f40eb6853de60f99c902c63b997f3c8ce Mon Sep 17 00:00:00 2001 From: PAND-or Date: Sun, 30 Sep 2018 15:33:27 +0300 Subject: [PATCH 23/30] pattern Builder --- lesson07/home_work/loto.py | 83 +++++++++++++++++++++++++++++--------- 1 file changed, 64 insertions(+), 19 deletions(-) diff --git a/lesson07/home_work/loto.py b/lesson07/home_work/loto.py index a5fabfbc2..8a52cf334 100644 --- a/lesson07/home_work/loto.py +++ b/lesson07/home_work/loto.py @@ -63,28 +63,64 @@ class Game: def __init__(self, start, end): - self.computer_card = Cards(start, end) - self.user_card = Cards(start, end) self.barrels = Numbers(start, end) - self.gamer = UserGamer('Андрей', start, end, 15) - self.ai = UserGamer('ЦПУ', start, end, 15) + self.gamers = [] def start(self): - print('Карточка компьютера \n', self.computer_card.print_str_card()) - print('\n Карточка Игрока \n', self.user_card.print_str_card()) - while True: - if len(self.gamer.card.list) == 0: - print('Game OVER Победил игрок') - elif len(self.ai.card.list) == 0: - print('Game OVER Победил компьютер') + while True: number = self.barrels.get_numbers print('Число на боченке {}'.format(number)) - if not self.gamer.do(number): - break - self.ai.do(number) + + for gamer in self.gamers: + if len(gamer.card.list) == 0: + print('Game OVER Победил игрок {}'.format(gamer.name)) + break + break + + if not gamer.do(number): + break + +class GameBuilder: + def __init__(self): + self._game = None + self.start = None + self.end = None + self.num = None + + def build(self): + return self._game + + def set_start_num(self, num): + self.start = num + return self + + def set_end_num(self, num): + self.end = num + return self + + def set_num_num(self, num): + self.num = num + return self + + def build_game(self): + self._game = Game(self.start, self.end) + return self + + def add_player(self, desc): + gamer = GamerFactory.get_gamer(desc, self.start, self.end, self.num) + self._game.gamers.append(gamer) + return self + +class GamerFactory: + @staticmethod + def get_gamer(name, *args): + if name == "human": + return UserGamer(name, *args) + elif name == "computer": + return AiGamer(name, *args) class Numbers(): @@ -114,13 +150,18 @@ def __init__(self, name, start, end, num_numbers): super().__init__(name, start, end, num_numbers) def do(self, number): + print('Карточка игрока: {}'.format(self.name)) self.card.delete_numbers(number) + print(self.card.print_str_card()) + return True class UserGamer(Gamer): def __init__(self, name, start, end, num_numbers): super().__init__(name, start, end, num_numbers) def do(self, number): + print('Карточка игрока: {}'.format(self.name)) + print(self.card.print_str_card()) inp = input('Зачеркнуть или продолжить?: Y / N: ') if inp == "Y": if self.card.delete_numbers(number): @@ -179,8 +220,12 @@ def print_str_card(self): if __name__ == "__main__": - - game = Game(1, 91) - game.start() - - + GameBuilder()\ + .set_start_num(1)\ + .set_end_num(91)\ + .set_num_num(15)\ + .build_game()\ + .add_player("human")\ + .add_player("computer")\ + .build()\ + .start() From af95065b83570c43c52e726de580a81c4e6cbdb6 Mon Sep 17 00:00:00 2001 From: PAND-or Date: Sun, 30 Sep 2018 17:13:19 +0300 Subject: [PATCH 24/30] print card --- lesson07/home_work/loto.py | 94 +++++++++++++++++++++----------------- 1 file changed, 52 insertions(+), 42 deletions(-) diff --git a/lesson07/home_work/loto.py b/lesson07/home_work/loto.py index 8a52cf334..b8be7a577 100644 --- a/lesson07/home_work/loto.py +++ b/lesson07/home_work/loto.py @@ -67,21 +67,25 @@ def __init__(self, start, end): self.gamers = [] def start(self): - - - - while True: + status = True + while status: number = self.barrels.get_numbers print('Число на боченке {}'.format(number)) for gamer in self.gamers: if len(gamer.card.list) == 0: print('Game OVER Победил игрок {}'.format(gamer.name)) + status = False break - break - if not gamer.do(number): + print('Из игры вылетает игрок {}'.format(gamer.name)) + self.kick_gamer(gamer) + status = False break + + def kick_gamer(self, gamer): + if gamer in self.gamers: + self.gamers.remove(gamer) class GameBuilder: def __init__(self): @@ -122,29 +126,13 @@ def get_gamer(name, *args): elif name == "computer": return AiGamer(name, *args) - -class Numbers(): - def __init__(self, start, end): - self.list = [i for i in range(start, end)] - - @property - def get_numbers(self): - number = random.choice(self.list) - self.delete_numbers(number) - return number - - def delete_numbers(self, number): - if number in self.list: - self.list.remove(number) - return True - else: - return False - + class Gamer(): def __init__(self, name, start, end, num_numbers): self.card = Cards(start, end, num_numbers) self.name = name + class AiGamer(Gamer): def __init__(self, name, start, end, num_numbers): super().__init__(name, start, end, num_numbers) @@ -154,7 +142,8 @@ def do(self, number): self.card.delete_numbers(number) print(self.card.print_str_card()) return True - + + class UserGamer(Gamer): def __init__(self, name, start, end, num_numbers): super().__init__(name, start, end, num_numbers) @@ -177,13 +166,32 @@ def do(self, number): else: return True print('Верно! Такого номера нет в карточке!') - #self.computer_card.delete_numbers(number) + + + +class Numbers(): + def __init__(self, start, end): + self.list = [i for i in range(start, end)] + + @property + def get_numbers(self): + number = random.choice(self.list) + self.delete_numbers(number) + return number + + def delete_numbers(self, number): + if number in self.list: + self.list.remove(number) + return True + else: + return False class Cards(Numbers): + def __init__(self, start, end, num_numbers): - self.numbers = Numbers(start, end) - self.list = random.sample(self.numbers.list, num_numbers) + self.free_numbers = Numbers(start, end) + self.list = random.sample(self.free_numbers.list, num_numbers) self.lines = self.create_lines() def create_lines(self): @@ -195,21 +203,23 @@ def create_lines(self): for line in lines: line.sort() return lines - + + def mark_numbers(self, number): + for line in self.lines: + if number in line: + index = line.index(number) + line[index] = '-' + + def delete_numbers(self, number): + if number in self.list: + self.list.remove(number) + self.mark_numbers(number) + return True + else: + return False + def str_lines(self, line): - str_line = '' - for i, number in enumerate(line): - if (i == 0) & (number < 10): - str_line += str(number) - elif(i == 0) & (number > 10): - str_line += ' ' + str(number) - elif len(str_line) > 25: - str_line += ' ' + str(number) - elif (line[i] - line[i-1]) > 10: - str_line += ' ' + str(number) - else: - str_line += ' ' + str(number) - return str_line + return "".join("{:>4}".format(n) for n in line) def print_str_card(self): str_lines = [] From 60ab734a64c986248d1fb1e0863580921f7ff04e Mon Sep 17 00:00:00 2001 From: PAND-or Date: Sun, 30 Sep 2018 19:59:46 +0300 Subject: [PATCH 25/30] hw08 --- lesson08/home_work/app.id | 2 +- lesson08/home_work/openweather.py | 103 ++++++++++++++++++++++++++++-- 2 files changed, 100 insertions(+), 5 deletions(-) diff --git a/lesson08/home_work/app.id b/lesson08/home_work/app.id index 1abf6bafa..16c705306 100644 --- a/lesson08/home_work/app.id +++ b/lesson08/home_work/app.id @@ -1 +1 @@ -== тут будет ваш APPID для доступа к openweathermap.org == +723f205177d6560cc8c06f0e8ae2c955 \ No newline at end of file diff --git a/lesson08/home_work/openweather.py b/lesson08/home_work/openweather.py index a9debfa1c..b37a2b384 100644 --- a/lesson08/home_work/openweather.py +++ b/lesson08/home_work/openweather.py @@ -1,3 +1,10 @@ +__author__ = "Андрей Петров" +import os +import json +import urllib.request as request +import gzip +import shutil +import sqlite3 """ == OpenWeatherMap == @@ -29,7 +36,6 @@ Ключ имеет смысл сохранить в локальный файл, например, "app.id" - == Получение списка городов == Список городов может быть получен по ссылке: http://bulk.openweathermap.org/sample/city.list.json.gz @@ -43,8 +49,34 @@ Список достаточно большой. Представляет собой JSON-строки: {"_id":707860,"name":"Hurzuf","country":"UA","coord":{"lon":34.283333,"lat":44.549999}} {"_id":519188,"name":"Novinki","country":"RU","coord":{"lon":37.666668,"lat":55.683334}} - - +""" +APIURL = 'http://api.openweathermap.org/data/2.5/' +URL_CITY_NAMES = 'http://bulk.openweathermap.org/sample/city.list.json.gz' +CITY_FILE_NAME = 'city.list.json' + +def get_appid(): + with open('app.id', encoding='UTF-8') as f: + return f.readline() + +def get_city_list(file, url): + if not os.path.isfile(file): + download_city_list(file, url) + + with open(file, encoding='UTF-8') as f: + cities_list = json.load(f) + return cities_list + +def download_city_list(url, file): + request.urlretrieve(url, file + '.gz') + with gzip.open(file + '.gz', 'rb') as f_in: + with open(file, 'wb') as f_out: + shutil.copyfileobj(f_in, f_out) + + + + + +""" == Получение погоды == На основе списка городов можно делать запрос к сервису по id города. И тут как раз понадобится APPID. By city ID @@ -66,8 +98,43 @@ "rain":{"3h":0.015},"clouds":{"all":76},"dt":1465156452, "sys":{"type":3,"id":57233,"message":0.0024,"country":"RU","sunrise":1465087473, "sunset":1465149961},"id":520068,"name":"Noginsk","cod":200} +""" + +def get_city_by_name(): + name = input('Название города на английском: ') + searches = [] + for city in cities_list: + if city['name'].find(name) >= 0: + searches.append(city) + + if len(searches) > 1: + print('Таких городов несколько: ') + for i, city in enumerate(searches): + print('#{}. Страна: {} Город: ({})'.format(i, city['country'], city['name'])) + inp = input('Укажите порядковый номер или "all" для всех: ') + if inp == 'all': + return searches + else: + return searches[int(inp)] + elif len(searches) == 1: + return searches[0] + else: + return 'Город не найден.' + +def get_city_data(cities, appid, metric='y'): + url = APIURL + if isinstance(cities, list): + clist = ','.join(format(n['id']) for n in cities) + url += 'group?id={}&appid={}'.format(clist, appid) + else: + url += 'weather?id={}&appid={}'.format(cities['id'], appid) + if(metric == 'y'): + url += '&units=metric' + return json.load(request.urlopen(url)) + +""" == Сохранение данных в локальную БД == Программа должна позволять: 1. Создавать файл базы данных SQLite со следующей структурой данных @@ -122,4 +189,32 @@ def gen_ns(tag): ... """ - +def save_data(data): + weather = [(data["id"], data["name"], data["dt"], data["main"]["temp"], data["weather"][0]["id"])] + connect = sqlite3.connect("cities.db") + c = connect.cursor() + query = "CREATE TABLE IF NOT EXISTS '{}' (\ + city_id INTEGER PRIMARY KEY, \ + city_name VARCHAR(255), \ + date DATE, \ + temperatire INTEGER, \ + weather_id INTEGER)".format(data["name"]) + + c.execute(query) + query_2 = "INSERT OR REPLACE INTO '{}' VALUES (?, ?, ?, ?, ?)".format(data["name"]) + c.executemany(query_2, weather) + connect.commit() + c.close() + connect.close() + +def print_from_db(data): + cursor.execute('select * from '{}';'.format(city['name'])) + print(cursor.fetchone()) + +if __name__ == "__main__": + apid = get_appid() + cities_list = get_city_list(CITY_FILE_NAME, URL_CITY_NAMES) + city = get_city_by_name() + data = get_city_data(city, apid) + save_data(data) + print_from_db(city, apid) From 6b85fae88153bd495c45101690dff39923c52569 Mon Sep 17 00:00:00 2001 From: PAND-or Date: Sun, 30 Sep 2018 20:11:38 +0300 Subject: [PATCH 26/30] same fix --- lesson07/home_work/loto.py | 1 + lesson08/home_work/openweather.py | 8 +++++--- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/lesson07/home_work/loto.py b/lesson07/home_work/loto.py index b8be7a577..53a8ed3de 100644 --- a/lesson07/home_work/loto.py +++ b/lesson07/home_work/loto.py @@ -1,4 +1,5 @@ #!/usr/bin/python3 +__author__ = "Андрей Петров" """ == Лото == diff --git a/lesson08/home_work/openweather.py b/lesson08/home_work/openweather.py index b37a2b384..c6cca37ea 100644 --- a/lesson08/home_work/openweather.py +++ b/lesson08/home_work/openweather.py @@ -199,7 +199,7 @@ def save_data(data): date DATE, \ temperatire INTEGER, \ weather_id INTEGER)".format(data["name"]) - + print(query) c.execute(query) query_2 = "INSERT OR REPLACE INTO '{}' VALUES (?, ?, ?, ?, ?)".format(data["name"]) c.executemany(query_2, weather) @@ -208,7 +208,9 @@ def save_data(data): connect.close() def print_from_db(data): - cursor.execute('select * from '{}';'.format(city['name'])) + connect = sqlite3.connect("cities3.db") + c = connect.cursor() + c.execute("select * from '{}';".format(data['name'])) print(cursor.fetchone()) if __name__ == "__main__": @@ -217,4 +219,4 @@ def print_from_db(data): city = get_city_by_name() data = get_city_data(city, apid) save_data(data) - print_from_db(city, apid) + print_from_db(data) From 7962cf22b790723a4b99249b536d7f0a520aea9c Mon Sep 17 00:00:00 2001 From: PAND-or Date: Sun, 30 Sep 2018 20:12:15 +0300 Subject: [PATCH 27/30] fix --- lesson08/home_work/openweather.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lesson08/home_work/openweather.py b/lesson08/home_work/openweather.py index c6cca37ea..076240109 100644 --- a/lesson08/home_work/openweather.py +++ b/lesson08/home_work/openweather.py @@ -208,7 +208,7 @@ def save_data(data): connect.close() def print_from_db(data): - connect = sqlite3.connect("cities3.db") + connect = sqlite3.connect("cities.db") c = connect.cursor() c.execute("select * from '{}';".format(data['name'])) print(cursor.fetchone()) From 93835a1eec601713a5717216d0b5a61c72470551 Mon Sep 17 00:00:00 2001 From: PAND-or Date: Sun, 30 Sep 2018 20:15:12 +0300 Subject: [PATCH 28/30] fix connect --- lesson08/home_work/openweather.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/lesson08/home_work/openweather.py b/lesson08/home_work/openweather.py index 076240109..677509389 100644 --- a/lesson08/home_work/openweather.py +++ b/lesson08/home_work/openweather.py @@ -199,7 +199,6 @@ def save_data(data): date DATE, \ temperatire INTEGER, \ weather_id INTEGER)".format(data["name"]) - print(query) c.execute(query) query_2 = "INSERT OR REPLACE INTO '{}' VALUES (?, ?, ?, ?, ?)".format(data["name"]) c.executemany(query_2, weather) @@ -211,7 +210,7 @@ def print_from_db(data): connect = sqlite3.connect("cities.db") c = connect.cursor() c.execute("select * from '{}';".format(data['name'])) - print(cursor.fetchone()) + print(c.fetchone()) if __name__ == "__main__": apid = get_appid() From f361d0d8cbb5499e1011fb2770a85690b0bbeece Mon Sep 17 00:00:00 2001 From: PAND-or Date: Sun, 30 Sep 2018 20:20:50 +0300 Subject: [PATCH 29/30] Get from base --- lesson08/home_work/openweather.py | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/lesson08/home_work/openweather.py b/lesson08/home_work/openweather.py index 677509389..3d24c7b17 100644 --- a/lesson08/home_work/openweather.py +++ b/lesson08/home_work/openweather.py @@ -191,26 +191,26 @@ def gen_ns(tag): """ def save_data(data): weather = [(data["id"], data["name"], data["dt"], data["main"]["temp"], data["weather"][0]["id"])] - connect = sqlite3.connect("cities.db") + connect = sqlite3.connect("cities6.db") c = connect.cursor() - query = "CREATE TABLE IF NOT EXISTS '{}' (\ + query = "CREATE TABLE IF NOT EXISTS 'weather' (\ city_id INTEGER PRIMARY KEY, \ city_name VARCHAR(255), \ date DATE, \ temperatire INTEGER, \ - weather_id INTEGER)".format(data["name"]) + weather_id INTEGER)" c.execute(query) - query_2 = "INSERT OR REPLACE INTO '{}' VALUES (?, ?, ?, ?, ?)".format(data["name"]) + query_2 = "INSERT OR REPLACE INTO 'weather' VALUES (?, ?, ?, ?, ?)" c.executemany(query_2, weather) connect.commit() c.close() connect.close() -def print_from_db(data): - connect = sqlite3.connect("cities.db") +def get_from_db(data): + connect = sqlite3.connect("cities6.db") c = connect.cursor() - c.execute("select * from '{}';".format(data['name'])) - print(c.fetchone()) + c.execute("select * from 'weather' where city_id ='{}';".format(data['id'])) + return c.fetchone() if __name__ == "__main__": apid = get_appid() @@ -218,4 +218,4 @@ def print_from_db(data): city = get_city_by_name() data = get_city_data(city, apid) save_data(data) - print_from_db(data) + print(get_from_db(data)) From 915ad05523bf3a3e7c63eb6fb3f0fa803b51767c Mon Sep 17 00:00:00 2001 From: PAND-or Date: Mon, 1 Oct 2018 00:13:19 +0300 Subject: [PATCH 30/30] Step city parser + Country Searcer --- lesson08/home_work/openweather.py | 57 +++++++++++++++++++++++++------ 1 file changed, 47 insertions(+), 10 deletions(-) diff --git a/lesson08/home_work/openweather.py b/lesson08/home_work/openweather.py index 3d24c7b17..67fff76b1 100644 --- a/lesson08/home_work/openweather.py +++ b/lesson08/home_work/openweather.py @@ -123,16 +123,37 @@ def get_city_by_name(): else: return 'Город не найден.' +def get_cites_by_country(): + name = input('Код страны на английском: ') + searches = [] + for city in cities_list: + if city['country'].find(name) >= 0: + searches.append(city) + return searches + def get_city_data(cities, appid, metric='y'): - url = APIURL if isinstance(cities, list): - clist = ','.join(format(n['id']) for n in cities) - url += 'group?id={}&appid={}'.format(clist, appid) + j = 0 + res = {'cnt': 0, 'list': []} + while j < len(cities)//10+1: #Формирование запроса по 10 городов + k = 10*j + z = 10*j+10 + url = APIURL + clist = ','.join(format(n['id']) for n in cities[k:z]) + if (clist != None) & (len(clist) > 1): + url += 'group?id={}&appid={}'.format(clist, appid) + jes_res = json.load(request.urlopen(url)) + res['list'].extend(jes_res['list']) #объединение ответа + res['cnt'] += jes_res['cnt'] + j +=1 + return res else: + url = APIURL url += 'weather?id={}&appid={}'.format(cities['id'], appid) - if(metric == 'y'): - url += '&units=metric' - return json.load(request.urlopen(url)) + if(metric == 'y'): + url += '&units=metric' + + return json.load(request.urlopen(url)) """ == Сохранение данных в локальную БД == @@ -190,7 +211,8 @@ def gen_ns(tag): """ def save_data(data): - weather = [(data["id"], data["name"], data["dt"], data["main"]["temp"], data["weather"][0]["id"])] + + connect = sqlite3.connect("cities6.db") c = connect.cursor() query = "CREATE TABLE IF NOT EXISTS 'weather' (\ @@ -200,8 +222,16 @@ def save_data(data): temperatire INTEGER, \ weather_id INTEGER)" c.execute(query) + query_2 = "INSERT OR REPLACE INTO 'weather' VALUES (?, ?, ?, ?, ?)" - c.executemany(query_2, weather) + if 'list' in data: + for d in data['list']: + if d['id']: + weather = [(d["id"], d["name"], d["dt"], d["main"]["temp"], d["weather"][0]["id"])] + c.executemany(query_2, weather) + else: + weather = [(data["id"], data["name"], data["dt"], data["main"]["temp"], data["weather"][0]["id"])] + c.executemany(query_2, weather) connect.commit() c.close() connect.close() @@ -209,13 +239,20 @@ def save_data(data): def get_from_db(data): connect = sqlite3.connect("cities6.db") c = connect.cursor() - c.execute("select * from 'weather' where city_id ='{}';".format(data['id'])) - return c.fetchone() + if 'list' in data: + where = ','.join(format(n['id']) for n in data['list']) + #print(where) + c.execute("SELECT * FROM 'weather' WHERE city_id IN ({});".format(where)) + return c.fetchall() + else: + c.execute("SELECT * FROM 'weather' WHERE city_id ='{}';".format(data['id'])) + return c.fetchone() if __name__ == "__main__": apid = get_appid() cities_list = get_city_list(CITY_FILE_NAME, URL_CITY_NAMES) city = get_city_by_name() + #city = get_cites_by_country() #так и не смог спарсить все города, после 2000 городов, получаю бан от сервера data = get_city_data(city, apid) save_data(data) print(get_from_db(data))