diff --git a/lesson02/home_work/hw02_easy.py b/lesson02/home_work/hw02_easy.py index ed4447e50..f29e50a23 100644 --- a/lesson02/home_work/hw02_easy.py +++ b/lesson02/home_work/hw02_easy.py @@ -1,3 +1,5 @@ +__author__ = 'Петров Андрей' + # Задача-1: # Дан список фруктов. # Напишите программу, выводящую фрукты в виде нумерованного списка, @@ -13,13 +15,47 @@ # Подсказка: воспользоваться методом .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: + if fruit in fruits_one: + fruits_one.remove(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..32ad88287 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,63 @@ # 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", +) + + +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): + 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): + break + else: + print("Не верный формат!") + date_input = input('Введите дату в формате dd.mm.yyyy: ') + -# Примеры некорректных дат -date = '01.22.1001' -date = '1.12.1001' -date = '-2.10.3001' # Задание-3: "Перевёрнутая башня" (Задача олимпиадного уровня) @@ -53,4 +116,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 diff --git a/lesson03/home_work/hw03_easy.py b/lesson03/home_work/hw03_easy.py index 63d13f646..4e17ab01d 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 sumone == sumtwo + print(lucky_ticket(123006)) print(lucky_ticket(12321)) print(lucky_ticket(436751)) diff --git a/lesson03/home_work/hw03_hard.py b/lesson03/home_work/hw03_hard.py index a8c7f668a..3274bec11 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") со списком фруктов. @@ -31,3 +161,17 @@ # Подсказка: # Чтобы получить список больших букв русского алфавита: # 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 diff --git a/lesson03/home_work/hw03_normal.py b/lesson03/home_work/hw03_normal.py index 38ac1fcc1..79c331eac 100644 --- a/lesson03/home_work/hw03_normal.py +++ b/lesson03/home_work/hw03_normal.py @@ -1,9 +1,28 @@ +__author__ = "Андрей Петров" + # Задание-1: # Напишите функцию, возвращающую ряд Фибоначчи с n-элемента до m-элемента. # Первыми элементами ряда считать цифры 1 1 def fibonacci(n, m): - pass + feb = 0 + i = 1 + 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 + return list_feb[n:] #вернуть лист фебоначи с элемента n +print(fibonacci(1,10)) + +#Сделать рекурсией + +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: # Напишите функцию, сортирующую принимаемый список по возрастанию. @@ -12,16 +31,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 val in 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 match == 2 #две парралельные прямые Бинго +check_squard(my_points) + 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..1a423c956 100644 --- a/lesson04/home_work/hw04_hard.py +++ b/lesson04/home_work/hw04_hard.py @@ -1,3 +1,5 @@ +__author__ = "Андрей Петров" + # Задание-1: # Матрицы в питоне реализуются в виде вложенных списков: # Пример. Дано: @@ -13,6 +15,9 @@ # Суть сложности hard: Решите задачу в одну строку +res = [[x[i] for x in matrix] for i in range(len(matrix))] +print(res) + # Задание-2: # Найдите наибольшее произведение пяти последовательных цифр в 1000-значном числе. # Выведите произведение и индекс смещения первого числа последовательных 5-ти цифр. @@ -39,6 +44,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 ферзей так, чтобы они не били @@ -46,4 +69,45 @@ # Определите, есть ли среди них пара бьющих друг друга. # Программа получает на вход восемь пар чисел, # каждое число от 1 до 8 — координаты 8 ферзей. -# Если ферзи не бьют друг друга, выведите слово NO, иначе выведите YES. +# Если ферзи не бьют друг друга, выведите слово 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 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_hard.py b/lesson05/home_work/hw05_hard.py index 7507e47b2..4a829ba86 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.chdir(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 для получения справки") 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 diff --git a/lesson06/home_work/hw06_easy.py b/lesson06/home_work/hw06_easy.py index fe5dc2b11..42f108a8e 100644 --- a/lesson06/home_work/hw06_easy.py +++ b/lesson06/home_work/hw06_easy.py @@ -1,9 +1,89 @@ +__author__ = "Андрей Петров" + # Задача-1: Написать класс для фигуры-треугольника, заданного координатами трех точек. # Определить методы, позволяющие вычислить: площадь, высоту и периметр фигуры. +import math + +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): + 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): + 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): + 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-х точек. # Предусмотреть в классе методы: # проверка, является ли фигура равнобочной трапецией; # вычисления: длины сторон, периметр, площадь. +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) + + @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) + + @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.area) + print('Периметр трапеции', trapeze1.perimeter) + print('Высота трапеции', trapeze1.height) \ No newline at end of file diff --git a/lesson06/home_work/hw06_hard.py b/lesson06/home_work/hw06_hard.py index fae8d84d2..308d4a4db 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,80 @@ # С использованием классов. # Реализуйте классы сотрудников так, чтобы на вход функции-конструктора # каждый работник получал строку из файла + +import os +import re + +class Workers(): + def __init__(self): + self.list = [] + + def add_worker(self, data): + self.list.append(Worker(data)) + + 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: + #if i.name == name: + #return i + #return None + + def earning(self, args): + name = str(args[0] + ' ' + args[1]) + if not(self.get_worker(name) == None): + self.get_worker(name).earn(int(args[2])) + + @property + def get_sum(self): + esum = 0 + for i in self.list: + esum += i.earned + return int(esum) + + @property + def show_list(self): + return [i.name for i in self.list] + + @property + def show_earn_list(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.add_worker(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.show_earn_list) + print('Зарплата всех работников ', workers.get_sum) diff --git a/lesson06/home_work/hw06_normal.py b/lesson06/home_work/hw06_normal.py index 01c3982f4..54263193e 100644 --- a/lesson06/home_work/hw06_normal.py +++ b/lesson06/home_work/hw06_normal.py @@ -1,3 +1,5 @@ +__author__ = "Андрей Петров" + # Задание-1: # Реализуйте описаную ниже задачу, используя парадигмы ООП: # В школе есть Классы(5А, 7Б и т.д.), в которых учатся Ученики. @@ -15,3 +17,139 @@ # (Ученик --> Класс --> Учителя --> Предметы) # 4. Узнать ФИО родителей указанного ученика # 5. Получить список всех Учителей, преподающих в указанном классе + +class School: + def __init__(self): + self.teachers = [] + self.classes = [] + self.students = [] + + def get_class(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.get_class(room_name) + if not classroom == None: + return classroom.list_students + 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.get_class(class_room) == None: + class_obj = ClassRoom(class_room) + self.classes.append(class_obj) + return class_obj + else: + return self.get_class(class_room) + + @property + def list_classes(self): + return [i.name for i in self.classes] + + def get_teachers(self, room_name): + classroom = self.get_class(room_name) + if not classroom == None: + return classroom.list_teachers + else: + return None + + +class ClassRoom: + def __init__(self, name): + self.name = name + self.students = [] + self.teachers = [] + + @property + def list_students(self): + return [i.full_name for i in self.students] + + @property + def list_teachers(self): + return [i.full_name for i in self.teachers] + + +class People: + def __init__(self, name, surname): + self.name = name + self.surname = surname + + @property + def 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 = self.add_parrent(parents) + self.class_room = class_room + + @staticmethod + def add_parrent(parents): + return [People(i[0], i[1]) for i in parents] + + @property + def list_subjects(self): + + return [i.courses for i in self.class_room.teachers] + + @property + def list_parrents(self): + return [i.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 = [] + self.courses = courses + self.teach_classes = teach_classes + + +if __name__ == "__main__": + 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 В", [("Олег", "Спиридонов"), ("Карина", "Спиридонова")]) + + + schooll.add_teacher("Александра", "Иванова", ["5 А", "8 Б", "4 В"], "Математика") + schooll.add_teacher("Татьяна", "Семенова", ["5 А", "4 В"], "Биология") + schooll.add_teacher("Иван", "Тетерев", ["4 В"], "Труд") + + print('Список классов школы', schooll.list_classes) + print('Список студентов 8Б', schooll.get_students_by_room('8 Б')) + 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 da01d4c00..53a8ed3de 100644 --- a/lesson07/home_work/loto.py +++ b/lesson07/home_work/loto.py @@ -1,4 +1,5 @@ #!/usr/bin/python3 +__author__ = "Андрей Петров" """ == Лото == @@ -57,3 +58,185 @@ модуль random: http://docs.python.org/3/library/random.html """ + +import random + + +class Game: + def __init__(self, start, end): + self.barrels = Numbers(start, end) + self.gamers = [] + + def start(self): + 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 + 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): + 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 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): + 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): + 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('Верно! Такого номера нет в карточке!') + + + +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.free_numbers = Numbers(start, end) + self.list = random.sample(self.free_numbers.list, num_numbers) + 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 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): + return "".join("{:>4}".format(n) for n in line) + + def print_str_card(self): + str_lines = [] + for line in self.lines: + 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 + + +if __name__ == "__main__": + GameBuilder()\ + .set_start_num(1)\ + .set_end_num(91)\ + .set_num_num(15)\ + .build_game()\ + .add_player("human")\ + .add_player("computer")\ + .build()\ + .start() 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..67fff76b1 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,64 @@ "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_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'): + if isinstance(cities, list): + 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)) +""" == Сохранение данных в локальную БД == Программа должна позволять: 1. Создавать файл базы данных SQLite со следующей структурой данных @@ -122,4 +210,49 @@ def gen_ns(tag): ... """ +def save_data(data): + + connect = sqlite3.connect("cities6.db") + c = connect.cursor() + query = "CREATE TABLE IF NOT EXISTS 'weather' (\ + city_id INTEGER PRIMARY KEY, \ + city_name VARCHAR(255), \ + date DATE, \ + temperatire INTEGER, \ + weather_id INTEGER)" + c.execute(query) + + query_2 = "INSERT OR REPLACE INTO 'weather' VALUES (?, ?, ?, ?, ?)" + 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() + +def get_from_db(data): + connect = sqlite3.connect("cities6.db") + c = connect.cursor() + 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))