diff --git a/lesson01/home_work/hw01_easy.py b/lesson01/home_work/hw01_easy.py index f927b0b06..140dde149 100644 --- a/lesson01/home_work/hw01_easy.py +++ b/lesson01/home_work/hw01_easy.py @@ -1,5 +1,5 @@ -__author__ = 'Ваши Ф.И.О.' +__author__ = 'Пыпин Андрей Сергеевич.' # Задача-1: Дано произвольное целое число (число заранее неизвестно). # Вывести поочередно цифры исходного числа (порядок вывода цифр неважен). @@ -9,16 +9,33 @@ # код пишем тут... +m = int(input('Введите число')) +i = 0 +while i <= m: + print(i) + i +=1 + # Задача-2: Исходные значения двух переменных запросить у пользователя. # Поменять значения переменных местами. Вывести новые значения на экран. # Подсказка: -# * постарайтесь сделать решение через дополнительную переменную +# * постарайтесь сделать решение через дополнительную переменную # или через арифметические действия # Не нужно решать задачу так: # print("a = ", b, "b = ", a) - это неправильное решение! +a = int(input('Введите число')) +b = int(input('Введите число')) +buf = a +a = b +b = buf +print(a, b) # Задача-3: Запросите у пользователя его возраст. # Если ему есть 18 лет, выведите: "Доступ разрешен", # иначе "Извините, пользование данным ресурсом только с 18 лет" +y = int(input('Сколько вам лет?')) +if y >= 18: + print('Доступ разрешен') +else: + print('Извините, пользование данным ресурсом только с 18 лет') diff --git a/lesson01/home_work/hw01_hard.py b/lesson01/home_work/hw01_hard.py index 7df268664..35a5a4d4f 100644 --- a/lesson01/home_work/hw01_hard.py +++ b/lesson01/home_work/hw01_hard.py @@ -1,5 +1,5 @@ -__author__ = 'Ваши Ф.И.О.' +__author__ = 'Пыпин Андрей Сергеевич' # Задание-1: # Ваня набрал несколько операций в интерпретаторе и получал результаты: @@ -9,7 +9,7 @@ # Результат: True # Код: a > 999999 # Результат: True - +8 # Вопрос: Чему была равна переменная a, # если точно известно, что её значение не изменялось? diff --git a/lesson01/home_work/hw01_normal.py b/lesson01/home_work/hw01_normal.py index 991724e9a..63448bf41 100644 --- a/lesson01/home_work/hw01_normal.py +++ b/lesson01/home_work/hw01_normal.py @@ -1,5 +1,5 @@ -__author__ = 'Ваши Ф.И.О.' +__author__ = 'Пыпин Андрей Сергеевич.' # Задача-1: Дано произвольное целое число, вывести самую большую цифру этого числа. # Например, дается x = 58375. @@ -9,7 +9,13 @@ # Подсказки: # * постарайтесь решить задачу с применением арифметики и цикла while; # * при желании и понимании решите задачу с применением цикла for. - +m = 184 +ls = [] +while m > 10: + ls.append(m % 10) + m //= 10 +r = max(ls) +print(r) # Задача-2: Исходные значения двух переменных запросить у пользователя. # Поменять значения переменных местами. Вывести новые значения на экран. @@ -17,11 +23,22 @@ # Подсказки: # * постарайтесь сделать решение через действия над числами; # * при желании и понимании воспользуйтесь синтаксисом кортежей Python. - - +i = int(input('Введите число')) +y = int(input('Введите число')) +i = i + y +y = i - y +i = i - y +print(i, y) # Задача-3: Напишите программу, вычисляющую корни квадратного уравнения вида # ax² + bx + c = 0. # Коэффициенты уравнения вводятся пользователем. # Для вычисления квадратного корня воспользуйтесь функцией sqrt() модуля math: # import math # math.sqrt(4) - вычисляет корень числа 4 +import math +a = int(input('Введите число')) +b = int(input('Введите число')) +x = int(input('Введите число')) +c = int(input('Введите число')) +g = a*x**2 + (b*x) + c +print(math.sqrt(g)) diff --git a/lesson02/home_work/hw02_easy.py b/lesson02/home_work/hw02_easy.py index ed4447e50..9fde8a34a 100644 --- a/lesson02/home_work/hw02_easy.py +++ b/lesson02/home_work/hw02_easy.py @@ -2,6 +2,11 @@ # Дан список фруктов. # Напишите программу, выводящую фрукты в виде нумерованного списка, # выровненного по правой стороне. +empty_list = [] +my_list = ["яблоко", "банан", "киви", "арбуз"] +for index, value in enumerate(my_list, 1): + print("{}. {:>10}".format(index, value)) + # Пример: # Дано: ["яблоко", "банан", "киви", "арбуз"] @@ -18,8 +23,19 @@ # Даны два произвольные списка. # Удалите из первого списка элементы, присутствующие во втором списке. +list_1 = [1, 3, 5, 8, 9] +list_2 = [1, 7, 4, 15, 9] +list_1.pop(0) +list_1.pop(3) +list_2.pop(0) +list_2.pop(3) +print(list_1, list_2) # Задача-3: # Дан произвольный список из целых чисел. # Получите НОВЫЙ список из элементов исходного, выполнив следующие условия: # если элемент кратен двум, то разделить его на 4, если не кратен, то умножить на два. +a = [12, 15, 40, 25] +b = [12/2, 15*2, 40/2, 25*2] + +print(a, b) \ No newline at end of file diff --git a/lesson02/home_work/hw02_normal.py b/lesson02/home_work/hw02_normal.py index 3acfaabb6..e3d19e53f 100644 --- a/lesson02/home_work/hw02_normal.py +++ b/lesson02/home_work/hw02_normal.py @@ -4,18 +4,128 @@ # но только если результаты извлечения корня не имеют десятичной части и # если такой корень вообще можно извлечь # Пример: Дано: [2, -5, 8, 9, -25, 25, 4] Результат: [3, 5, 2] - - +import math +import random +l = [2, -5, 8, 9, -25, 25, 4] +new = [] +for x in l: + if x > 0: + y = math.sqrt(x) + if y % int(y) == 0: + new.append(y) +print(new) # Задача-2: Дана дата в формате dd.mm.yyyy, например: 02.11.2013. # Ваша задача вывести дату в текстовом виде, например: второе ноября 2013 года. # Склонением пренебречь (2000 года, 2010 года) +s = '02.11.2013' +a = s.split('.') +day = a[0] +month = a[1] +year = a[2] +text = 'года' + +if day == '01': + day = 'первое' +elif day == '02': + day = 'второе' +elif day == '03': + day = 'третье' +elif day == '04': + day = 'четвертое' +elif day == '05': + day = 'пятое' +elif day == '06': + day = 'шестое' +elif day == '07': + day = 'седьмое' +elif day == '08': + day = 'восьмое' +elif day == '09': + day = 'девятое' +elif day == '10': + day = 'десятое' +elif day == '11': + day = 'одиннадцатое' +elif day == '12': + day = 'двенадцатое' +elif day == '13': + day = 'тринадцатое' +elif day == '14': + day = 'четырнадцатое' +elif day == '15': + day = 'пятнадцатое' +elif day == '16': + day = 'шестнадцатое' +elif day == '17': + day = 'семнадцатое' +elif day == '18': + day = 'восемнадцатое' +elif day == '19': + day = 'девятьнадцатое' +elif day == '20': + day = 'дцадцатое' +elif day == '21': + day = 'двадцать первое' +elif day == '22': + day = 'двадцать второе' +elif day == '23': + day = 'двадцать третье' +elif day == '24': + day = 'двадцать чертвертое' +elif day == '25': + day = 'двадцать пятое' +elif day == '26': + day = 'двадцать шестое' +elif day == '27': + day = 'двадцать седьмое' +elif day == '28': + day = 'двадцать восьмое' +elif day == '29': + day = 'двадцать девятое' +elif day == '30': + day = 'тридцатое' +elif day == '31': + day = 'тридцать первое' + +if month == '01': + month = 'января' +elif month == '02': + month = 'февраля' +elif month == '03': + month = 'марта' +elif month == '04': + month = 'апреля' +elif month == '05': + month = 'мая' +elif month == '06': + month = 'июня' +elif month == '07': + month = 'июля' +elif month == '08': + month = 'августа' +elif month == '09': + month = 'сентября' +elif month == '10': + month = 'октября' +elif month == '11': + month = 'ноября' +elif month == '12': + month = 'декабря' +print('{} {} {} {}'.format(day, month, year, text)) + # Задача-3: Напишите алгоритм, заполняющий список произвольными целыми числами # в диапазоне от -100 до 100. В списке должно быть n - элементов. # Подсказка: # для получения случайного числа используйте функцию randint() модуля random - +l = [] +n = 50 +count = 0 +while count < 50: + l.append(random.randint(-100, 100)) + count += 1 +print(l) # Задача-4: Дан список, заполненный произвольными целыми числами. # Получите новый список, элементами которого будут: @@ -23,3 +133,10 @@ # например, 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] +lst1 = set(lst) +lst1 = list(lst1) +print(lst1) + +lst2 = [x for x in lst if not lst.count(x) > 1] +print(lst2) \ No newline at end of file diff --git a/lesson03/home_work/hw03_easy.py b/lesson03/home_work/hw03_easy.py index 63d13f646..b60b60709 100644 --- a/lesson03/home_work/hw03_easy.py +++ b/lesson03/home_work/hw03_easy.py @@ -4,9 +4,9 @@ # Округление должно происходить по математическим правилам (0.6 --> 1, 0.4 --> 0). # Для решения задачи не используйте встроенные функции и функции из модуля math. -def my_round(number, ndigits): - pass - +def my_round(number, digits): + multiplier = pow(10.0, digits) + return int (number*multiplier + 0.5) / multiplier print(my_round(2.1234567, 5)) print(my_round(2.1999967, 5)) @@ -21,8 +21,5 @@ def my_round(number, ndigits): def lucky_ticket(ticket_number): pass + lucky_ticket = lambda x :(lambda x : 'yes' if sum(x[:3]) == sum(x[3:]) else 'no')(map(int, list(str(x)))) - -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..f4d07d321 100644 --- a/lesson03/home_work/hw03_normal.py +++ b/lesson03/home_work/hw03_normal.py @@ -5,6 +5,24 @@ def fibonacci(n, m): pass + +for Y in range(0, 5 + 1): + print(Y) + +def fibonacci(n, m): + a = [] + golden = 1.618034 + for i in range(n, m + 1): + x = (golden ** i - (1 - golden) ** i) / (5 ** (1 / 2)) + a.append(round(x)) + return a + +x = 5 +y = 7 + +B = fibonacci(x, y) + +print(B) # Задача-2: # Напишите функцию, сортирующую принимаемый список по возрастанию. # Для сортировки используйте любой алгоритм (например пузырьковый). @@ -12,15 +30,29 @@ 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. - - +def filter_function(func,iterable): + output_iterable = [] + for i in range(len(iterable)): + if func(iterable[i]) == True: + output_iterable.append(iterable[i]) + return output_iterable + +func = lambda x: type(x) == str +iterable = [-1, 2, 'a', 4, 'GGG'] +print(filter_function(func,iterable)) # Задача-4: # Даны четыре точки А1(х1, у1), А2(x2 ,у2), А3(x3 , у3), А4(х4, у4). # Определить, будут ли они вершинами параллелограмма. diff --git a/lesson04/home_work/hw04_easy.py b/lesson04/home_work/hw04_easy.py index 85035ea8b..a20731447 100644 --- a/lesson04/home_work/hw04_easy.py +++ b/lesson04/home_work/hw04_easy.py @@ -5,14 +5,24 @@ # Получить новый список, элементы которого будут # квадратами элементов исходного списка # [1, 2, 4, 0] --> [1, 4, 16, 0] +list_1 = [1, 2, 4, 0, 1, 4, 16, 0] +print('list_1:', list_1) +list_2 = list(map(lambda x: x ** 2, list_1)) +print('list_2:', list_2) # Задание-2: # Даны два списка фруктов. # Получить список фруктов, присутствующих в обоих исходных списках. - +fruit_list_1 = ['Грэйпфрут', 'Лайм', 'Ананас', 'Памела', 'Дыня'] +fruit_list_2 = ['Банан', 'Ананас', 'Апельсин', 'Лайм', 'Памела', 'Вишня'] +result_list = [i for i in fruit_list_1 if i in fruit_list_2] +print(result_list) # Задание-3: # Дан список, заполненный произвольными числами. # Получить список из элементов исходного, удовлетворяющих следующим условиям: # + Элемент кратен 3 # + Элемент положительный # + Элемент не кратен 4 +list_1 = [3, 4, 5, 11, 6, 7, 33, 39, 8, 45, 9, 12, 58, 61] +list_2 = [i for i in list_1 if i >= 0 and i%4 and not i%3] +print(list_2) \ No newline at end of file diff --git a/lesson04/home_work/hw04_normal.py b/lesson04/home_work/hw04_normal.py index 739dd33f8..461961c0f 100644 --- a/lesson04/home_work/hw04_normal.py +++ b/lesson04/home_work/hw04_normal.py @@ -22,6 +22,7 @@ # Задание-2: + # Вывести символы в верхнем регистре, слева от которых находятся # два символа в нижнем регистре, а справа - два символа в верхнем регистре. # Т.е. из строки @@ -44,7 +45,42 @@ 'uXBqHFjvihuNGEEFsfnMXTfptvIOlhKhyYwxLnqOsBdGvnuyEZIheApQGOXWeXoLWiDQN'\ 'JFaXiUWgsKQrDOeZoNlZNRvHnLgCmysUeKnVJXPFIzvdDyleXylnKBfLCjLHntltignbQ'\ 'oiQzTYwZAiRwycdlHfyHNGmkNqSwXUrxGC' +symbol1 = list(map(lambda x: chr(x), list(range(65, 91)))) +symbol2 = list(map(lambda x: chr(x), list(range(97, 123)))) +line_new = list(line_2) + +lst = [] +i = len(line_new) - 1 + +while i >= 0: + if line_new[i] in symbol2: + lst.append(line_new[i]) + elif line_new[i] in symbol1 and i <= len(line_new) - 3 and line_new[i + 1] in symbol1 and line_new[ + i + 2] in symbol1: + lst.append(line_new[i]) + else: + lst.append(' ') + i -= 1 +lst.reverse() + +i = 0 +lst2 = [] +registr = True +while i <= len(lst) - 1: + if lst[i] in symbol2: + registr = True + if lst[i] in symbol1 and lst[i - 1] in symbol2 and lst[i - 2] in symbol2: + lst2.append(lst[i]) + registr = False + elif lst[i] in symbol1 and registr == False: + lst2.append(lst[i]) + else: + lst2.append(' ') + i += 1 +stroka = ''.join(lst2).split(' ') +line_str_3 = [i for i in stroka if i != ''] +print('Список без использованием модуля re: \n', line_str_3) # Задание-3: # Напишите скрипт, заполняющий указанный файл (самостоятельно задайте имя файла) # произвольными целыми цифрами, в результате в файле должно быть diff --git a/lesson05/home_work/hw05_easy.py b/lesson05/home_work/hw05_easy.py index c6317de2b..86cfcc003 100644 --- a/lesson05/home_work/hw05_easy.py +++ b/lesson05/home_work/hw05_easy.py @@ -2,9 +2,27 @@ # Напишите скрипт, создающий директории dir_1 - dir_9 в папке, # из которой запущен данный скрипт. # И второй скрипт, удаляющий эти папки. +import os +print('Ваща текущая директория {}'.format(os.getcwd())) +def makedir(i): + os.mkdir('{}'.format(i)) +def removedir(i): + os.rmdir('{}'.format(i)) +def chdir(i): + os.chdir(i) +for r in range(9): + makedir('dir_{}'.format(r+1)) +print(os.listdir()) +for r in range(9): + removedir('dir_{}'.format(r+1)) # Задача-2: # Напишите скрипт, отображающий папки текущей директории. + def nowdir(): + print('Содержимое текущей папки: {}'.format(os.listdir())) + # Задача-3: # Напишите скрипт, создающий копию файла, из которого запущен данный скрипт. +import shutil +shutil.copy('hw05_easy.py','hw05_easy_copy.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..684cc8f17 100644 --- a/lesson05/home_work/hw05_normal.py +++ b/lesson05/home_work/hw05_normal.py @@ -13,3 +13,4 @@ # Для решения данной задачи используйте алгоритмы из задания easy, # оформленные в виде соответствующих функций, # и импортированные в данный файл из easy.py + diff --git a/lesson06/home_work/hw06_easy.py b/lesson06/home_work/hw06_easy.py index fe5dc2b11..89e1b7faa 100644 --- a/lesson06/home_work/hw06_easy.py +++ b/lesson06/home_work/hw06_easy.py @@ -1,9 +1,60 @@ # Задача-1: Написать класс для фигуры-треугольника, заданного координатами трех точек. # Определить методы, позволяющие вычислить: площадь, высоту и периметр фигуры. - - +import math +class Triangle: + def __init__(self, A, B, C): + def sideLen(dot1, dot2): + return math.sqrt((dot1[0] - dot2[0]) ** 2 + + (dot1[1] - dot2[1]) ** 2) + self.A = A + self.B = B + self.C = C + self.AB = sideLen(self.A, self.B) + self.BC = sideLen(self.B, self.C) + self.CA = sideLen(self.C, self.A) + def areaTriangle(self): + semi_perimeter = self.perimeterTriangle() / 2 + return math.sqrt(semi_perimeter + * (semi_perimeter - self.AB) + * (semi_perimeter - self.BC) + * (semi_perimeter - self.CA)) + def perimeterTriangle(self): + return self.AB + self.BC + self.CA + def heightTriangle(self): + return self.areaTriangle() / (self.AB / 2) +treugolnik1 = Triangle((12, 5), (15, 9), (4, 8)) +print(treugolnik1.areaTriangle()) +print(treugolnik1.heightTriangle()) +print(treugolnik1.perimeterTriangle()) # Задача-2: Написать Класс "Равнобочная трапеция", заданной координатами 4-х точек. # Предусмотреть в классе методы: # проверка, является ли фигура равнобочной трапецией; # вычисления: длины сторон, периметр, площадь. - +class Trapeze: + def __init__(self, A, B, C, D): + def sideLen(dot1, dot2): + return math.sqrt((dot1[0] - dot2[0]) ** 2 + + (dot1[1] - dot2[1]) ** 2) + def areaTriangle(len1, len2, len3): + semi_perimeter = (len1 + len2 + len3) / 2 + return math.sqrt(semi_perimeter + * (semi_perimeter - len1) + * (semi_perimeter - len2) + * (semi_perimeter - len3)) + self.A = A + self.B = B + self.C = C + self.D = D + self.AB = sideLen(self.A, self.B) + self.BC = sideLen(self.B, self.C) + self.CD = sideLen(self.C, self.D) + self.DA = sideLen(self.D, self.A) + self.diagonal_AC = sideLen(self.C, self.A) + self.diagonal_BD = sideLen(self.B, self.D) + self.perimeter = self.AB + self.BC + self.CD + self.DA + self.area = areaTriangle(self.AB, self.diagonal_BD, self.DA) \ + + areaTriangle(self.diagonal_BD, self.BC, self.CD) + def isTrapezeEqu(self): + if self.diagonal_AC == self.diagonal_BD: + return True + return False diff --git a/lesson06/home_work/hw06_normal.py b/lesson06/home_work/hw06_normal.py index 01c3982f4..201be70b9 100644 --- a/lesson06/home_work/hw06_normal.py +++ b/lesson06/home_work/hw06_normal.py @@ -15,3 +15,64 @@ # (Ученик --> Класс --> Учителя --> Предметы) # 4. Узнать ФИО родителей указанного ученика # 5. Получить список всех Учителей, преподающих в указанном классе +class People: + def __init__(self, name, patronymic, surname): + self.name = name + self.surname = surname + self.patronymic = patronymic + + def get_full_name(self): + return self.name + ' ' + self.patronymic + ' ' + self.surname + + def get_short_name(self): + return '{} {}.{}.'.format(self.surname.title(), self.name[0].upper(), self.patronymic[0].upper()) + +class Student(People): + def __init__(self, name, patronymic, surname, mom, dad, school_class): + People.__init__(self, name, patronymic, surname) + self.mom = mom + self.dad = dad + self.school_class = school_class + +class Teacher(People): + def __init__(self, name, patronymic, surname, subject): + People.__init__(self, name, patronymic, surname) + self.subject = subject + + +class Class_rooms: + def __init__(self, class_room, teachers): + self.class_room = class_room + self.teachersdict = {t.subject: t for t in teachers} + + +if __name__ == '__main__': + teachers = [Teacher('Глеб', 'Глебович', 'Глебов', 'Химия'), + Teacher('Влад', 'Владович', 'Владов', 'Биология'), + Teacher('Валя', 'Валинтинович', 'Валентинов', 'География'), + Teacher('Николай', 'Николаевич', 'Николаев', 'Физика'), + Teacher('Василий', 'Васильевич', 'Васин', 'История')] + classes = [Class_rooms('10 А', [teachers[0], teachers[1], teachers[2]]), + Class_rooms('7 Б', [teachers[1], teachers[3], teachers[4]]), + Class_rooms('9 А', [teachers[3], teachers[1], teachers[0]])] + parents = [People('Никита', 'Никитич', 'Никитин'), + People('Светлана', 'Савельевна', 'Семенова'), + People('Роман', 'Романович', 'Романов'), + People('Дмитрий', 'Дмитриевич', 'Дмитриев'), + People('Сергей', 'Сергеевич', 'Сергеев'), + People('Юлия', 'Сергеевна', 'Сергеева')] + students = [Student('Влад', 'Васильевич', 'Васин', parents[0], parents[1], classes[0]), + Student('Ольга', 'Романова', 'Романова', parents[2], parents[3], classes[1]), + Student('Александр', 'Сергеевич', 'Сергеев', parents[4], parents[5], classes[2])] + print('Список классов в школе: ') + for f in classes: + print(f.class_room) + + for f in classes: + print('Учителя, преподающие в {} классе:'.format(f.class_room)) + for teacher in classes[0].teachersdict.values(): + print(teacher.get_full_name()) + for f in classes: + print("Ученики в классе {}:".format(f.class_room)) + for st in students: + print(st.get_short_name()) diff --git a/lesson07/home_work/loto.py b/lesson07/home_work/loto.py index 5ea6ad844..229f975f8 100644 --- a/lesson07/home_work/loto.py +++ b/lesson07/home_work/loto.py @@ -57,3 +57,218 @@ модуль random: http://docs.python.org/3/library/random.html """ +import random + + +class Card: + def __init__(self, rows_amount=3, cols_amount=9, nums_per_row=5, max_num=90): + self._rows_amount = rows_amount + self._cols_amount = cols_amount + self._nums_per_row = nums_per_row + self._max_num = max_num + + +class CommonCard(Card): + counter = 0 + + def __init__(self): + Card.__init__(self, rows_amount=3, cols_amount=9, nums_per_row=5, max_num=90) + self._title = ' ' + self._card = [['' for _ in range(self._cols_amount)] for _ in range(self._rows_amount)] + self._nums = random.sample(range(1, self._max_num + 1), self._nums_per_row * self._rows_amount) + self._pixels = self._cols_amount * 3 - 1 + self.__class__.counter += 1 + self._nums_for_game = self._nums[:] + + @classmethod + def get_created_instances_count(cls): + return cls.counter + + def __del__(self): + self.__class__.counter -= 1 + + @property + def nums(self): + return len(self._nums_for_game) + + def _header(self): + return '{:-^{}}'.format(self._title, self._pixels) + + def _mapping_card(self): + for row in self._card: + while row.count(True) != self._nums_per_row: + i = random.randrange(self._cols_amount) + if not row[i]: + row[i] = True + + def _filling_card_with_numbers(self): + for i, row in enumerate(self._card): + tmp = sorted(self._nums[i * self._nums_per_row:(i + 1) * self._nums_per_row], reverse=True) + for j, item in enumerate(row): + if item: + self._card[i][j] = tmp.pop() + + def __str__(self): + res = list() + res.append(self._header()) + for row in self._card: + res.append(' '.join(['{:<2}'.format(x) for x in row])) + res.append('-' * self._pixels) + return '\n'.join(res) + + def modify_card(self, num): + i = int(self._nums.index(num) / self._nums_per_row) + self._card[i][self._card[i].index(num)] = '-' + self._nums_for_game.remove(num) + + def check_num(self, num): + return num in self._nums + + def create_card(self): + self._mapping_card() + self._filling_card_with_numbers() + + +class PlayerCard(CommonCard): + def __init__(self, rows_amount=3, cols_amount=9, nums_per_row=5, max_num=90): + CommonCard.__init__(self) + self._name = 'Игрок {}'.format(self.get_created_instances_count()) + self._title = ' ' + 'Карточка игрока {}'.format(self.get_created_instances_count()) + ' ' + + @property + def name(self): + return self._name + + +class ComputerCard(CommonCard): + def __init__(self, rows_amount=3, cols_amount=9, nums_per_row=5, max_num=90): + CommonCard.__init__(self) + self._title = ' ' + 'Карточка компьютера' + ' ' + self._name = 'Компьютер' + + @property + def name(self): + return self._name + + +class Game(Card): + def __init__(self): + Card.__init__(self, rows_amount=3, cols_amount=9, nums_per_row=5, max_num=90) + self._do = ['1', '2', 'exit'] + self._menu = '1 - играть с компьютером\n2 - играть с другом\nexit - выйти из игры' + self._unit1 = None + self._unit2 = None + + def _init_game(self): + answer = '' + while answer not in self._do: + print(self._menu) + answer = input() + if answer == '1': + self._init_game_pve() + elif answer == '2': + self._init_game_pvp() + else: + exit() + + def _create_cards(self): + self._unit1.create_card() + self._unit2.create_card() + + def _init_game_pve(self): + self._unit1 = PlayerCard() + self._unit2 = ComputerCard() + self._create_cards() + + def _init_game_pvp(self): + self._unit1 = PlayerCard() + self._unit2 = PlayerCard() + self._create_cards() + + def _get_random_num(self): + random_numbers = random.sample(range(1, self._max_num + 1), self._max_num) + for i in random_numbers: + yield i, self._max_num - random_numbers.index(i) - 1 + + def _check_answer(self, unit, num, answer): + if answer == 'exit': + print('Приходите еще поиграть') + exit() + elif answer != 'y' and answer != 'n': + self._check_answer(unit, num, input('Зачеркнуть цифру? (y/n)')) + elif answer == 'y' and unit.check_num(num): + unit.modify_card(num) + return 0 + elif answer == 'n' and not unit.check_num(num): + return 0 + elif answer == 'y' and not unit.check_num(num): + print('{} нет на вашей карточке.'.format(num), end=' ') + return 1 + elif answer == 'n' and unit.check_num(num): + print('{} на вашей карточке.'.format(num), end=' ') + return 1 + else: + print('Что-то пошло не так', answer) + return 1 + + def _clean(self): + del self._unit1 + del self._unit2 + + def _lets_play(self): + num_generator = self._get_random_num() + gen_res = next(num_generator) + num = gen_res[0] + left = gen_res[1] + + while self._unit1.nums and self._unit2.nums: + print(self._unit1) + print(self._unit2) + + print('Новый бочонок: {} (осталось {})'.format(num, left)) + print('Ходит {}'.format(self._unit1.name)) + + if self._check_answer(self._unit1, num, input('Зачеркнуть цифру? (y/n)')): + if type(self._unit2) == PlayerCard: + return '{}, к сожалению, вы проиграли.\nПоздравляем, {}! Вы победили'.format(self._unit1.name, + self._unit2.name) + else: + return '{}, к сожалению, вы проиграли.'.format(self._unit1.name) + if type(self._unit2) == PlayerCard: + print('Ходит {}'.format(self._unit2.name)) + if self._check_answer(self._unit2, num, input('Зачеркнуть цифру? (y/n)')): + return '{}, к сожалению, вы проиграли.\nПоздравляем, {}! Вы победили'.format(self._unit2.name, + self._unit1.name) + else: + if self._unit2.check_num(num): + self._unit2.modify_card(num) + + gen_res = next(num_generator) + num = gen_res[0] + left = gen_res[1] + + if not self._unit1.nums and not self._unit2.nums: + return 'Ничья!' + elif self._unit2.nums: + return 'Поздравляем, {}, вы победили!'.format(self._unit1.name) + else: + if type(self._unit2) == PlayerCard: + return 'Поздравляем, {}, вы победили!'.format(self._unit2.name) + else: + return 'Компьютер успел первым. Попробуйте еще раз.' + + def main(self): + while True: + answer = input('Сыграем? (y/n)') + if answer == 'y': + self._init_game() + print(self._lets_play()) + self._clean() + elif answer == 'n': + print('До свидания!') + return + + +if __name__ == '__main__': + game = Game() + game.main() \ No newline at end of file diff --git a/lesson08/home_work/export_openweather.py b/lesson08/home_work/export_openweather.py index 0ae937519..7d558f266 100644 --- a/lesson08/home_work/export_openweather.py +++ b/lesson08/home_work/export_openweather.py @@ -20,5 +20,93 @@ """ +import sys import csv import json +import sqlite3 +import datetime + +db_filename = 'weather.db' + + +def export_csv(filename, city): + encoding = 'utf-8' + csv.register_dialect('excel-semicolon', delimiter=';') + sql_str = "select (Select city from cites where weath_city.idcity = cites.id) as cityname,(Select country from countres where weath_city.id_country = countres.id) as countryname,data,w_day,w_night from weath_city where idcity=" + str( + city) + if city == 0: + sql_str = "select (Select city from cites where weath_city.idcity = cites.id) as cityname,(Select country from countres where weath_city.id_country = countres.id) as countryname,data,w_day,w_night from weath_city" + + with open(filename, 'w', encoding=encoding) as csvfile: + writer = csv.writer(csvfile, dialect='excel-semicolon') + writer.writerow(('Город', 'Страна', 'Дата', 'Темп. днем', 'Темп. ночью')) + with sqlite3.connect(db_filename) as conn: + cur = conn.cursor() + for row in cur.execute(sql_str): + writer.writerow((row[0], row[1], row[2], row[3], row[4])) + conn.close + + +def export_json(filename, city): + sql_str = "select (Select city from cites where weath_city.idcity = cites.id) as cityname,(Select country from countres where weath_city.id_country = countres.id) as countryname,data,w_day,w_night from weath_city where idcity=" + str( + city) + if city == 0: + sql_str = "select (Select city from cites where weath_city.idcity = cites.id) as cityname,(Select country from countres where weath_city.id_country = countres.id) as countryname,data,w_day,w_night from weath_city" + f = open(filename, 'w') + f.write('{') + with sqlite3.connect(db_filename) as conn: + cur = conn.cursor() + for row in cur.execute(sql_str): + rjson = "city:{0},country:{1},data:{2},day:{3},night:{4}".format(row[0], row[1], row[2], row[3], row[4]) + f.write("{" + rjson + "},") + conn.close + f.write("{export:" + str(datetime.date.today()) + '}') + f.write('}') + f.close() + + +def exists_city(city): + b = True + with sqlite3.connect(db_filename) as conn: + cur = conn.cursor() + cur.execute("select * from cites where id=" + str(city)) + row = cur.fetchone() + if row == None: + b = False + else: + b = True + conn.close() + return b + + +def main(): + if len(sys.argv) > 4 or len(sys.argv) < 2: + print('usage: python export_weather.py {--csv | --json} file [<город>]') + sys.exit(1) + option = sys.argv[1] + filename = sys.argv[2] + city = 0 + if len(sys.argv) == 4: + city = sys.argv[3] + + if city != 0: + if exists_city(city) == False: + print('City not found!') + sys.exit(1) + if option == '--csv': + export_csv(filename, city) + elif option == '--json': + export_json(filename, city) + else: + print('unknown option: ' + option) + sys.exit(1) + + # city = 3917 - код города белфаст + # print(exists_city(city)) + # filename = "exp39.json" + # export_csv(filename,city) + # export_json(filename,city) + + +if __name__ == '__main__': + main()