diff --git a/lesson01/home_work/hw01_easy.py b/lesson01/home_work/hw01_easy.py index f927b0b06..f253dfe89 100644 --- a/lesson01/home_work/hw01_easy.py +++ b/lesson01/home_work/hw01_easy.py @@ -1,5 +1,5 @@ -__author__ = 'Ваши Ф.И.О.' +__author__ = 'Качарин Михаил Александрович' # Задача-1: Дано произвольное целое число (число заранее неизвестно). # Вывести поочередно цифры исходного числа (порядок вывода цифр неважен). @@ -9,6 +9,32 @@ # код пишем тут... +# Этот вариант нагуглил. Выводит в обратном порядке через пробел. +""" +a = int(input('Введите число:')) +while a: + print(a%10,end = ' ') + a //= 10 +""" + +# Этот вариант сам сделал используя знания нулеого курса. +# Выводит по порядку в столбик. +""" +a = str(input('Введите число:')) +i = 0 +while i < len(a): + print(a[i]) + i += 1 +""" + +# Тоже самое в обратном порядке. +""" +a = str(input('Введите число:')) +i = len(a) - 1 +while i == 0 or i > 0: + print(a[i]) + i = i - 1 +""" # Задача-2: Исходные значения двух переменных запросить у пользователя. # Поменять значения переменных местами. Вывести новые значения на экран. @@ -18,7 +44,28 @@ # Не нужно решать задачу так: # print("a = ", b, "b = ", a) - это неправильное решение! +""" +a = 3 +b = 5 +print('Исходные данные:') +print('a =', a) +print('b =', b) +c = a +a = b +b = c +print('Меняем местами:') +print('a =', a) +print('b =', b) +""" # Задача-3: Запросите у пользователя его возраст. # Если ему есть 18 лет, выведите: "Доступ разрешен", # иначе "Извините, пользование данным ресурсом только с 18 лет" + +""" +age = int(input('Сколько вам полных лет? ')) +if age > 18 or age == 18: + print('Доступ разрешен!') +else: + print('Извините, пользование данным ресурсом только с 18 лет.') +""" \ No newline at end of file diff --git a/lesson01/home_work/hw01_normal.py b/lesson01/home_work/hw01_normal.py index 991724e9a..da1aa647e 100644 --- a/lesson01/home_work/hw01_normal.py +++ b/lesson01/home_work/hw01_normal.py @@ -1,5 +1,5 @@ -__author__ = 'Ваши Ф.И.О.' +__author__ = 'Качарин Михаил Александрович' # Задача-1: Дано произвольное целое число, вывести самую большую цифру этого числа. # Например, дается x = 58375. @@ -10,6 +10,19 @@ # * постарайтесь решить задачу с применением арифметики и цикла while; # * при желании и понимании решите задачу с применением цикла for. +""" +a = str(input('Введите число:')) +m = 0 +i = 0 +while i < len(a): + print(a[i]) + if m < int(a[i]): + m = int(a[i]) + i += 1 + +print('Максимальная цифра в вашем числе: ', m) +""" + # Задача-2: Исходные значения двух переменных запросить у пользователя. # Поменять значения переменных местами. Вывести новые значения на экран. @@ -18,6 +31,16 @@ # * постарайтесь сделать решение через действия над числами; # * при желании и понимании воспользуйтесь синтаксисом кортежей Python. +""" +a = int(input('Введите число a = ')) +b = int(input('Введите число b = ')) + +a, b = b, a + +print('Меняем местами:') +print('a =', a) +print('b =', b) +""" # Задача-3: Напишите программу, вычисляющую корни квадратного уравнения вида # ax² + bx + c = 0. @@ -25,3 +48,25 @@ # Для вычисления квадратного корня воспользуйтесь функцией sqrt() модуля math: # import math # math.sqrt(4) - вычисляет корень числа 4 + +""" +import math + +print('Введите коэффициенты уравнения:') +a = int(input('a = ')) +b = int(input('b = ')) +c = int(input('c = ')) + +# формулы для решения взяты тут https://clck.ru/FD6vb + +d = math.fabs(b*b - 4*a*c) # моуль дискриминанта +d1 = math.sqrt(d) # корень из дискриминанта + +x1 = (-b - d1) / 2*a +x2 = (-b + d1) / 2*a + +print('Корни квадратного уравнения:') +print('x1 =', x1) +print('x2 =', x2) + +""" \ No newline at end of file diff --git a/lesson02/home_work/hw02_easy.py b/lesson02/home_work/hw02_easy.py index ed4447e50..f3ee0527c 100644 --- a/lesson02/home_work/hw02_easy.py +++ b/lesson02/home_work/hw02_easy.py @@ -13,13 +13,70 @@ # Подсказка: воспользоваться методом .format() +""" + +fruits = ['яблоко', 'банан', 'киви', 'арбуз'] +print('Было:') +print(fruits) +print() +print('Стало:') +for i in range(0, len(fruits)): + print('{} {: >10}'.format(str(i+1) + '.', fruits[i])) + +""" # Задача-2: # Даны два произвольные списка. # Удалите из первого списка элементы, присутствующие во втором списке. +""" + +list1 = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 'конь', 'телескоп'] +list2 = [7, 74, 535, 5, 67, 8, 74, 'конь', 733, 3, 9, 65, 5, 353, 1, 4688, 0] + +print('Список №1:') +print(list1) +print() +print('Список №2:') +print(list2) +print() + +for i in range(0, len(list2)): + j = 0 + while j < len(list1): + if list1[j] == list2[i]: + list1.pop(j) + j += 1 + +print('Список №1 после удаления элементов, присутствующие в списке №2:') +print(list1) + +""" # Задача-3: # Дан произвольный список из целых чисел. # Получите НОВЫЙ список из элементов исходного, выполнив следующие условия: -# если элемент кратен двум, то разделить его на 4, если не кратен, то умножить на два. +# если элемент кратен двум, то разделить его на 4, +# если не кратен, то умножить на два. + +""" + +numbers = [43, 534, 88, 386, 46, 775, 979, 742, 115, 87] +newnumbers = [] + +print('Список из целых чисел:') +print(numbers) +print() + +for i in range(0, len(numbers)): + if numbers[i]%2 == 0: + numbers[i] = numbers[i] / 4 + newnumbers.append(numbers[i]) + else: + numbers[i] = numbers[i] * 2 + newnumbers.append(numbers[i]) + +print('Новый список чисел:') +print(newnumbers) + +""" \ No newline at end of file diff --git a/lesson03/home_work/hw03_easy.py b/lesson03/home_work/hw03_easy.py index 63d13f646..0a804bc40 100644 --- a/lesson03/home_work/hw03_easy.py +++ b/lesson03/home_work/hw03_easy.py @@ -4,14 +4,46 @@ # Округление должно происходить по математическим правилам (0.6 --> 1, 0.4 --> 0). # Для решения задачи не используйте встроенные функции и функции из модуля math. -def my_round(number, ndigits): - pass +""" +def my_round(number, ndigits): + number = str(number) + ndigits = int(ndigits) + + # Находим место где целая часть отделяется от дробной + p = number.find('.') + + # Создаем число на которое нужно увеличить + # в случае округления в большую сторону + okrup = str(0.) + i = 0 + while i < ndigits-2: + okrup = okrup + str(0) + i += 1 + okrup = okrup + str(1) + + # Находим цифру, которая определяет куда округлять + lastdigit = number[ndigits+p+1] + + if int(lastdigit) > 5: + # Округление в большую сторону + number = float(number) + float(okrup) + number = str(number) + number = number[0:ndigits+p+1] + else: + # Округление в меньшую сторону + number = str(number) + number = number[0:ndigits+p+1] + return number +# Это все округляется в большую сторону print(my_round(2.1234567, 5)) print(my_round(2.1999967, 5)) print(my_round(2.9999967, 5)) +# Добавим пример с округлением в меньшую +print(my_round(235232.987654321, 7)) +""" # Задание-2: # Дан шестизначный номер билета. Определить, является ли билет счастливым. @@ -19,10 +51,36 @@ def my_round(number, ndigits): # Билет считается счастливым, если сумма его первых и последних цифр равны. # !!!P.S.: функция не должна НИЧЕГО print'ить +""" + def lucky_ticket(ticket_number): - pass + ticket_number = str(ticket_number) + + sum_begin = 0 + sum_end = 0 + + if len(ticket_number) == 6: + i = 0 + while i < 6: + if i < 3: + sum_begin = sum_begin + int(ticket_number[i]) + else: + sum_end = sum_end + int(ticket_number[i]) + i += 1 + if sum_begin == sum_end: + lucky_ticket = 'Ваш билет счастливый. Поздравляем!' + else: + lucky_ticket = 'К сожалению, билет не счастливый.' + else: + lucky_ticket = 'Неправильный билет. Номер должен состоять из 6 цифр.' + return lucky_ticket +# Это примеры счастливого и неправильного билетов print(lucky_ticket(123006)) print(lucky_ticket(12321)) print(lucky_ticket(436751)) +# Добавим пример не счастливого билета +print(lucky_ticket(478682)) + +""" diff --git a/lesson04/home_work/hw04_easy.py b/lesson04/home_work/hw04_easy.py index 85035ea8b..eedc8eb3f 100644 --- a/lesson04/home_work/hw04_easy.py +++ b/lesson04/home_work/hw04_easy.py @@ -6,13 +6,84 @@ # квадратами элементов исходного списка # [1, 2, 4, 0] --> [1, 4, 16, 0] +""" + +from random import randint + +numbers = [] +for i in range(10): + numbers.append(randint(-5, 5)) + +print('Исходный список:') +print(numbers) +print() + +numbers2 = [] +for i in numbers: + numbers2.append(i ** 2) + +print('Cписок в квадрате:') +print(numbers2) + +""" + # Задание-2: # Даны два списка фруктов. # Получить список фруктов, присутствующих в обоих исходных списках. +""" + +fruits1 = ['яблоко', 'мандарин', 'банан', 'абрикос', 'груша', + 'апельсин', 'слива', 'манго', 'папайя', 'персик'] +fruits2 = ['авокадо', 'манго', 'помело', 'апельсин', 'мангостин', + 'груша', 'гуава', 'банан', 'киви', 'яблоко'] +fruits3 = [] + +print('Список фруктов №1:') +print(fruits1) +print() +print('Список фруктов №2:') +print(fruits2) +print() + +for f1 in fruits1: + for f2 in fruits2: + if f1 == f2: + fruits3.append(f1) + +print('Список фруктов №3, присутствующих в списках №1 и №2:') +print(fruits3) + +""" + + # Задание-3: # Дан список, заполненный произвольными числами. # Получить список из элементов исходного, удовлетворяющих следующим условиям: # + Элемент кратен 3 # + Элемент положительный # + Элемент не кратен 4 + +""" + +from random import randint + +numbers = [] +for i in range(30): + numbers.append(randint(-10, 1000)) + +print('Исходный список:') +print(numbers) +print() + +newnumbers = [] +for i in numbers: + if i > 0: + if i%3 == 0: + if i%4 != 0: + newnumbers.append(i) + +print('Список, удовлетворяющий условиям:') +print(newnumbers) + +""" diff --git a/lesson04/home_work/hw04_normal.py b/lesson04/home_work/hw04_normal.py index 739dd33f8..21b0bd66c 100644 --- a/lesson04/home_work/hw04_normal.py +++ b/lesson04/home_work/hw04_normal.py @@ -20,6 +20,29 @@ 'XiUWgsKQrDOeZoNlZNRvHnLgCmysUeKnVJXPFIzvdDyleXylnKBfLCjLHntltignbQoiQ'\ 'zTYwZAiRwycdlHfyHNGmkNqSwXUrxGc' +""" + +#Используем re +import re +lowercase = [i for i in re.findall('([a-z]+)[A-Z]', line)] +print('Используем re:') +print(lowercase) +print() + +#Не используем re +lowercase2 = [] +lc2 = '' +for s in range(len(line)): + if line[s].islower(): + lc2 += line[s] + else: + if line[s - 1].islower(): + lowercase2.append(lc2) + lc2 = '' +print('Не используем re:') +print(lowercase2) + +""" # Задание-2: # Вывести символы в верхнем регистре, слева от которых находятся @@ -29,6 +52,8 @@ # нужно получить список строк: ['AY', 'NOGI', 'P'] # Решить задачу двумя способами: с помощью re и без. + + line_2 = 'mtMmEZUOmcqWiryMQhhTxqKdSTKCYEJlEZCsGAMkgAYEOmHBSQsSUHKvSfbmxULaysm'\ 'NOGIPHpEMujalpPLNzRWXfwHQqwksrFeipEUlTLeclMwAoktKlfUBJHPsnawvjPhfgewV'\ 'fzKTUfSYtBydXaVIpxWjNKgXANvIoumesCSSvjEGRJosUfuhRRDUuTQwLlJJJDdkVjfSA'\ @@ -45,9 +70,71 @@ 'JFaXiUWgsKQrDOeZoNlZNRvHnLgCmysUeKnVJXPFIzvdDyleXylnKBfLCjLHntltignbQ'\ 'oiQzTYwZAiRwycdlHfyHNGmkNqSwXUrxGC' +""" + +#Используем re +import re +uppercase = [i for i in re.findall('[a-z][a-z]([A-Z]+)[A-Z][A-Z]', line_2)] +print('Используем re:') +print(uppercase) +print() + +#Не используем re +uppercase2 = [] +uc2 = '' + +for s in range(len(line_2)): + try: + if (line_2[s - 2].islower() and line_2[s - 1].islower() and line_2[s].isupper()) or len( + uc2) > 0: + uc2 += line_2[s] + if line_2[s + 1].isupper() and line_2[s + 2].isupper(): + if line_2[s + 2].isupper() and line_2[s + 3].isupper(): + pass + else: + uppercase2.append(uc2) + uc2 = '' + else: + uc2 = '' + except IndexError: + pass +print('Не используем re:') +print (uppercase2) + +""" + # Задание-3: # Напишите скрипт, заполняющий указанный файл (самостоятельно задайте имя файла) # произвольными целыми цифрами, в результате в файле должно быть # 2500-значное произвольное число. # Найдите и выведите самую длинную последовательность одинаковых цифр # в вышезаполненном файле. + +""" + +from random import randint + +with open('newfile.txt', 'w', encoding='utf-8') as nf: + n = [str(random.randint(0, 9)) for _ in range(2499)] + n = str(random.randint(1, 9)) + ''.join(n) + nf.write(n) + +with open('newfile.txt', 'r', encoding='utf-8') as nf: + number = nf.readline() + search = '([0]{2,}|[1]{2,}|[2]{2,}|[3]{2,}|[4]{2,}|' \ + '[5]{2,}|[6]{2,}|[7]{2,}|[8]{2,}|[9]{2,})' + sequence = re.findall(search, number) + +print('2500-значное произвольное число:') +print(number) +print() +print('Все последовательности одинаковых цифр:') +print(sequence) +print() + +longest = [] +[longest.insert(0, i) for i in sequence if len(i) > len(longest)] +print('Самая длинная последовательность одинаковых цифр:') +print(longest[0]) + +""" diff --git a/lesson05/home_work/hw05_defs.py b/lesson05/home_work/hw05_defs.py new file mode 100644 index 000000000..9df9d35c5 --- /dev/null +++ b/lesson05/home_work/hw05_defs.py @@ -0,0 +1,45 @@ +def goto(): + dirgo = input('Введите полный путь до директории в которую хотите перейти: ') + try: + os.chdir(dirgo) + print('Вы успешно перешли в нужную диреткорию.') + action() + except: + print('Что то пошло не так... Не удалось изменит директорию.') + action() + +def listdir(): + print('Содержание текущей директории:') + print(os.listdir()) + action() + +def makedir(): + dirmake = input('Введите название директории которую хотите создать: ') + try: + os.mkdir(dirmake) + print('Вы успешно создали нужную диреткорию.') + action() + except: + print('Что то пошло не так... Не удалось создать директорию.') + action() + +def removedir(): + dirremove = input('Введите название директории которую хотите создать: ') + try: + os.rmdir(dirremove) + print('Вы успешно удалили нужную диреткорию.') + action() + except: + print('Что то пошло не так... Не удалось удалить директорию.') + action() + +def exitprog(): + pass + +def action(): + actiondo = input('Введите цифру, которая соответсвует нужному действию: ') + if bool(whattodo.get(actiondo)) == True: + whattodo(actiondo) + else: + print('Такого действия пока нет... Повторите попытку!') + action() diff --git a/lesson05/home_work/hw05_easy.py b/lesson05/home_work/hw05_easy.py index c6317de2b..3dc41d43d 100644 --- a/lesson05/home_work/hw05_easy.py +++ b/lesson05/home_work/hw05_easy.py @@ -3,8 +3,67 @@ # из которой запущен данный скрипт. # И второй скрипт, удаляющий эти папки. +""" +import os + +# Создаем +for i in range(1, 10): + if os.path.exists("dir_" + str(i)) == False: + os.mkdir("dir_" + str(i)) + print("Папка с названием dir_" + str(i) + " создана.") + else: + print("Папка dir_" + str(i) + " не создана, т.к. уже существует.") +print() + +# Удаляем +for i in range(1, 10): + if os.path.exists("dir_" + str(i)) == True: + os.rmdir("dir_" + str(i)) + print("Папка с названием dir_" + str(i) + " удалена.") + else: + print("Папка dir_" + str(i) + " не удалена, т.к. не существует.") +""" + # Задача-2: # Напишите скрипт, отображающий папки текущей директории. +""" +import os + +print('Папки в текущей директории:') + +dirfile = os.listdir() + +p = 0 + +for name in dirfile: + if os.path.isdir(name) == True: + p += 1 + print(name) + +if p == 0: + print('- в текущей директории папок не найдено.') +""" + # Задача-3: # Напишите скрипт, создающий копию файла, из которого запущен данный скрипт. + +""" + +import os, shutil + +runfile = os.path.basename(__file__) +print('Файл, из которого запущен данный скрипт:') +print(runfile) +print() + +print('Копия файла, из которого запущен данный скрипт:') + +runcopy = runfile + '.copy' + +if os.path.isfile(runcopy) == False: + shutil.copyfile(runfile, runcopy) + print(runcopy) +else: + print('- файл ' + runcopy + ' не создан, т.к. уже существует.') +""" diff --git a/lesson05/home_work/hw05_normal.py b/lesson05/home_work/hw05_normal.py index ead6bbc19..09b891f55 100644 --- a/lesson05/home_work/hw05_normal.py +++ b/lesson05/home_work/hw05_normal.py @@ -13,3 +13,78 @@ # Для решения данной задачи используйте алгоритмы из задания easy, # оформленные в виде соответствующих функций, # и импортированные в данный файл из easy.py + +import os + +from hw05_defs import goto, listdir, makedir, removedir, exitprog, action + +whattodo = { + '1': goto(), + '2': listdir(), + '3': makedir(), + '4': removedir(), + '5': exitprog(), +} + +message = """ +Добро пожаловать в систумную утилиту! + +Вот что она умеет: +1 - Перейти в папку. +2 - Просмотреть содержимое текущей папки. +3 - Удалить папку. +4 - Создать папку. +5 - Завершить программу. +""" +print(message) + +action() + +""" +# Содержимое файла hw05_defs.py +def goto(): + dirgo = input('Введите полный путь до директории в которую хотите перейти: ') + try: + os.chdir(dirgo) + print('Вы успешно перешли в нужную диреткорию.') + action() + except: + print('Что то пошло не так... Не удалось изменит директорию.') + action() + +def listdir(): + print('Содержание текущей директории:') + print(os.listdir()) + action() + +def makedir(): + dirmake = input('Введите название директории которую хотите создать: ') + try: + os.mkdir(dirmake) + print('Вы успешно создали нужную диреткорию.') + action() + except: + print('Что то пошло не так... Не удалось создать директорию.') + action() + +def removedir(): + dirremove = input('Введите название директории которую хотите создать: ') + try: + os.rmdir(dirremove) + print('Вы успешно удалили нужную диреткорию.') + action() + except: + print('Что то пошло не так... Не удалось удалить директорию.') + action() + +def exitprog(): + pass + +def action(): + actiondo = input('Введите цифру, которая соответсвует нужному действию: ') + if bool(whattodo.get(actiondo)) == True: + whattodo(actiondo) + else: + print('Такого действия пока нет... Повторите попытку!') + action() +""" diff --git a/lesson06/home_work/hw06_easy.py b/lesson06/home_work/hw06_easy.py index fe5dc2b11..6961eb4f7 100644 --- a/lesson06/home_work/hw06_easy.py +++ b/lesson06/home_work/hw06_easy.py @@ -1,9 +1,118 @@ # Задача-1: Написать класс для фигуры-треугольника, заданного координатами трех точек. # Определить методы, позволяющие вычислить: площадь, высоту и периметр фигуры. +""" + +import math + +class Triangle: + def __init__(self, a, b, c): + # Метод считает длинну стороны по координатам точек + def side(point1, point2): + return math.sqrt((point1[0] - point2[0]) ** 2 + + (point1[1] - point2[1]) ** 2) + self.a = a + self.b = b + self.c = c + # Считаем длину всех сторон + self.ab = side(self.a, self.b) + self.bc = side(self.b, self.c) + self.ca = side(self.c, self.a) + # Считаем площадь треугольника по формуле Герона, + # которая взята тут https://clck.ru/EUCMh + def area(self): + semiperim = self.perimeter() / 2 + return math.sqrt(semiperim + * (semiperim - self.ab) + * (semiperim - self.bc) + * (semiperim - self.ca)) + # Считаем периметр + def perimeter(self): + return self.ab + self.bc + self.ca + # Считаем высоту + def hTriangle(self): + return self.area() / (self.ab / 2) + + +points = Triangle((1, 1), (15, 8), (6, 15)) + +print('Параметры треугольника: ') +print(f'- площадь = {round(points.area(),2)};') +print(f'- высота = {round(points.hTriangle(),2)};') +print(f'- периметр = {round(points.perimeter(),2)}.') + +""" # Задача-2: Написать Класс "Равнобочная трапеция", заданной координатами 4-х точек. # Предусмотреть в классе методы: # проверка, является ли фигура равнобочной трапецией; # вычисления: длины сторон, периметр, площадь. +""" + +import math + +class Trapeze: + def __init__(self, a, b, c, d): + # Метод считает длинну стороны по координатам точек + def side(point1, point2): + return math.sqrt((point1[0] - point2[0]) ** 2 + + (point1[1] - point2[1]) ** 2) + # Считаем площадь треугольника как в 1-й задаче + def areatri(len1, len2, len3): + semiperim = (len1 + len2 + len3) / 2 + return math.sqrt(semiperim + * (semiperim - len1) + * (semiperim - len2) + * (semiperim - len3)) + + self.a = a + self.b = b + self.c = c + self.d = d + self.ab = side(self.a, self.b) + self.bc = side(self.b, self.c) + self.cd = side(self.c, self.d) + self.da = side(self.d, self.a) + self.diagonalac = side(self.c, self.a) + self.diagonalbd = side(self.b, self.d) + self.perimeter = self.ab + self.bc + self.cd + self.da + # Площадь трапеции проще посчитать + # как сумму площадей 2-х треугольников из которых она состоит + self.area = areatri(self.ab, self.diagonalbd, self.da) \ + + areatri(self.diagonalbd, self.bc, self.cd) + def areat(self): + return self.area + def perimetert(self): + return self.perimeter + def sideab(self): + return self.ab + def sidebc(self): + return self.bc + def sidecd(self): + return self.cd + def sideda(self): + return self.da + # Проверка равнорабочести трапеции + def isTrapezeEqu(self): + if self.diagonalac == self.diagonalbd: + return True + return False + + +# Для упрощения проверки возьмем координаты квадрата, +# т.к. это частный случай равнорабочей трапеции +points = Trapeze((3, 3), (12, 3), (12, 12), (3, 12)) + +if points.isTrapezeEqu() == True: + print('Параметры равнорабочей трапеции: ') + print(f'- площадь = {round(points.areat(),2)};') + print(f'- периметр = {round(points.perimetert(),2)};') + print(f'- длинны сторон AB = {round(points.sideab(),2)}, \ +BC = {round(points.sidebc(),2)}, \ +CD = {round(points.sidecd(),2)}, \ +DA = {round(points.sideda(),2)}.') +else: + print('Трапеция не равнорабочая.') + +""" diff --git a/lesson06/home_work/hw06_normal.py b/lesson06/home_work/hw06_normal.py index 01c3982f4..e630946a6 100644 --- a/lesson06/home_work/hw06_normal.py +++ b/lesson06/home_work/hw06_normal.py @@ -15,3 +15,69 @@ # (Ученик --> Класс --> Учителя --> Предметы) # 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 schoolchild(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: + def __init__(self, class_room, teachers): + self.class_room = class_room + self.teachersdict = {t.subject: t for t in teachers} + + # Проверка +print('Не успеваю полностью проверить и доделать. Работает частично...') +print() +if __name__ == '__main__': + teachers = [Teacher('Амиран', 'Сидорович', 'Убираев', 'Физкультура'), + Teacher('Андрей', 'Олегович', 'Моль', 'Химия'), + Teacher('Васген', 'Робертович', 'Бесконечный', 'Математика'), + Teacher('Джон', 'Ашотович', 'Цукерман', 'Физика'), + Teacher('Фёкла', 'Нурлановна', 'Поппинс', 'Английский')] + classes = [Class('1А', [teachers[3], teachers[3], teachers[0]]), + Class('2Б', [teachers[0], teachers[1], teachers[2]]), + Class('3В', [teachers[1], teachers[3], teachers[4]])] + parents = [People('Иван', 'Иванович', 'Иванов'), + People('Ульяна', 'Ульяновна', 'Ульянова'), + People('Тимур', 'Тимурович', 'Тимуров'), + People('Наталья', 'Николаевна', 'Николаева'), + People('Чингиз', 'Хасанович', 'Оглыев'), + People('Мария', 'Иннокеньтьевна', 'Краснопресненская')] + schoolchildren = [schoolchild('Газис', 'Бурханович', 'Волкодавов', parents[3], parents[2], classes[0]), + schoolchild('Динара', 'Мухмаровна', 'Гульнарова', parents[0], parents[1], classes[1]), + schoolchild('Арулон', 'Петрович', 'Абоев', parents[5], parents[4], classes[2])] + print('Полный список всех классов в школе: ') + for f in classes: + print(f.class_room + '.') + print() + for f in classes: + print("Список всех учеников в классе {}:".format(f.class_room)) + for st in schoolchildren: + print(st.get_short_name()) + print() + for f in classes: + print('Список всех учителей, преподающих в {} классе:'.format(f.class_room)) + for teacher in classes[1].teachersdict.values(): + print(teacher.get_full_name() + '.') + print() diff --git a/lesson07/home_work/loto.py b/lesson07/home_work/loto.py index 5ea6ad844..0ecb6ce26 100644 --- a/lesson07/home_work/loto.py +++ b/lesson07/home_work/loto.py @@ -57,3 +57,212 @@ модуль 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() diff --git a/lesson08/home_work/app.id b/lesson08/home_work/app.id index 1abf6bafa..877eebad9 100644 --- a/lesson08/home_work/app.id +++ b/lesson08/home_work/app.id @@ -1 +1 @@ -== тут будет ваш APPID для доступа к openweathermap.org == +f74db86ec42e653fa5cb362a138bcc68 diff --git a/lesson08/home_work/openweather.py b/lesson08/home_work/openweather.py index a9debfa1c..cf4b3db28 100644 --- a/lesson08/home_work/openweather.py +++ b/lesson08/home_work/openweather.py @@ -123,3 +123,144 @@ def gen_ns(tag): """ +import urllib.request +import os +import sys +import gzip +import json +import sqlite3 +import re + + +def preparations(): + """Подготовка к работе программы: + получение ключей, имен городов, создание или проверка базы данных + """ + # Getting APPID + appid_key = open('app.id').read().strip() + + # Downloading city names + url = 'http://bulk.openweathermap.org/sample/city.list.json.gz' + try: + os.stat('data') + except FileNotFoundError: + os.mkdir('data') + + out = os.path.join('data', 'city.list.json.gz') + + try: + os.stat(out) + except FileNotFoundError: + urllib.request.urlretrieve(url, out) + + # Unzipping city names + cities = gzip.open(out, 'rb').read().decode() + + # List of dictionaries with cities' info + city_names = [json.loads(line) for line in cities.split('\n')[:-1]] + + # DB creation and filling in + path_db = os.path.join('data', 'weather.db') + + # DB existence checking + try: + os.stat(path_db) + except FileNotFoundError: + with sqlite3.connect(path_db) as conn: + curs = conn.cursor() + curs.execute(""" + CREATE TABLE Weather ( + City_id INTEGER PRIMARY KEY, + City_name VARCHAR(255), + Date DATE, + Temperature INTEGER, + Weather_id INTEGER + ); + """) + return appid_key, city_names +# Filling in DB if it's not existing +# def db_filling(path, data): +# with sqlite3.connect(path) as conn: +# curs = conn.cursor() +# curs.execute(""" +# CREATE TABLE Weather ( +# City Name TEXT PRIMARY KEY, +# Coordinates BLOB, +# ID INTEGER PRIMARY KEY, +# Country TEXT, +# ); +# """) +# curs.executemany("INSERT INTO Weather VALUES (?, ?, ?, ?)", data) + + +def weatherrequest(name, unit): + """Запрос погоды по Id города + Получение данных в формате JSON и обработка + """ + for num in range(len(cityNames)): + if name == cityNames[num]['name']: + city_id = 'id=' + str(cityNames[num]['_id']) + metr = 'units=' + unit + final_url = 'http://api.openweathermap.org/data/2.5/weather?' + city_id + \ + metr + '&lang=ru&appid=' + appid + webdata = urllib.request.urlopen(final_url) + # encoding = webdata.info().get_content_charset('utf-8') + weatherdata = json.loads(webdata) + return weatherdata + +if __name__ == '__main__': + while True: + start = input('Начнём работу? (y\\n)\n>>> ').lower() + if start == 'y': + print('Загрузка...') + appid, cityNames = preparations() + break + elif start == 'n': + sys.exit() + else: + print("Непонятный ввод") + + while True: + metric = input('Температура в Цельсиях или Фаренгейтах? (C\F)\n>>> ').lower() + if metric == 'c': + units = 'metric' + break + elif metric == 'f': + units = 'imperial' + break + else: + print('Нет других метрик') + + while True: + weatherdata = None + cityName = input('Введите название города: ').title() + if cityName == 'Exit': + sys.exit() + catches = [] + for line in cityNames: + if cityName == line['name']: + weatherdata = weatherrequest(cityName, units) + break + elif line['name'].startswith(cityName[:int(len(cityName) / 1.5)]): + catches.append(line['name']) + if weatherdata is not None: + break + print("Уточните название") + if len(catches): + print("Возможные варианты:") + print('\n'.join(catches)) + else: + print('не обнаружено совпадений') + + conn = sqlite3.connect(os.path.join('data', 'weather.db')) + curs = conn.cursor() + curs.execute('INSERT INTO Weather ' + 'VALUES ({}, {}, {}, {}, {})'.format(weatherdata['id'], + weatherdata['name'], + weatherdata['dt'], + weatherdata['main']['temp'], + weatherdata['weather']['id'])) + conn.commit() + res = curs.execute('SELECT * FROM Weather') + res.fetchall() + conn.close() diff --git a/lesson08/home_work/out.html b/lesson08/home_work/out.html new file mode 100644 index 000000000..5b17cecad --- /dev/null +++ b/lesson08/home_work/out.html @@ -0,0 +1 @@ +{"coord":{"lon":9.4,"lat":56.45},"weather":[{"id":800,"main":"Clear","description":"ясно","icon":"01d"}],"base":"stations","main":{"temp":13,"pressure":1020,"humidity":50,"temp_min":13,"temp_max":13},"wind":{"speed":10.8,"deg":110,"gust":16.5},"clouds":{"all":0},"dt":1493637780,"sys":{"type":1,"id":5252,"message":0.0691,"country":"DK","sunrise":1493609720,"sunset":1493665493},"id":2610319,"name":"Viborg","cod":200} diff --git a/lesson08/home_work/project_weather.py b/lesson08/home_work/project_weather.py new file mode 100644 index 000000000..fd7ed8c94 --- /dev/null +++ b/lesson08/home_work/project_weather.py @@ -0,0 +1,121 @@ + +import os +import sys +import re +import multiprocessing as mp +import pprint +import gzip +import json +import urllib.request +import grab + + +def connect(url, grabber): + """Авторизация на сайте и получения apid ключа для запроса + """ + grabber.go(url) + grabber.doc.set_input('user[email]', 'weather_zora@mail.ru') + grabber.doc.set_input('user[password]', 'Simple_Weather') + grabber.doc.submit() + page = gr.doc.unicode_body() + success = re.search(r"(?<=
)(.*)(?=)", page).group(0) + + return apid_key + + +def get_cities(queue): + """Скачивание словаря с названиями городов + """ + # Downloading city names + url = 'http://bulk.openweathermap.org/sample/city.list.json.gz' + try: + os.stat('data') + except FileNotFoundError: + os.mkdir('data') + + out = os.path.join('data', 'city.list.json.gz') + + try: + os.stat(out) + except FileNotFoundError: + urllib.request.urlretrieve(url, out) + + # Unzipping city names + cities = gzip.open(out, 'rb').read().decode() + + # List of dictionaries with cities' info + names = [json.loads(line) for line in cities.split('\n')[:-1]] + queue.put(names) + + +def get_weather_data(grabber, city_id, apid_key): + """Получение и вывод данных о погоде + """ + + def printing(data): + """Вывод погоды в красивом виде + """ + print('{:-^30}'.format('Погода сегодня')) + print('Температура: {}'.format(data['main']['temp'])) + print('Условия: {}'.format(data['weather'][0]['description'])) + print('Давление: {}'.format(data['main']['pressure'])) + print('Влажность : {}'.format(data['main']['humidity'])) + + + url = ('http://api.openweathermap.org/data/2.5/weather?' + 'id={}&units=metric&lang=ru&appid={}').format(city_id, apid_key) + grabber.go(url) + weather_data = json.loads(grabber.doc.unicode_body()) + printing(weather_data) + + +def get_city_id(cities, grabber, apid_key): + """Получаем от пользователя id города + """ + pp = pprint.PrettyPrinter(width=40, compact=True) + print('{:*^40}'.format('Погода')) + city_id = None + while True: + choise = input('\nВведите название города (quit - выход)\n>>> ').capitalize() + if choise == 'Quit': + print('Выход из программы') + sys.exit() + else: + suggest = [] + for line in cities: + if choise == line['name']: + city_id = line['_id'] + break + elif line['name'].startswith(choise[:int(len(choise) / 1.5)]): + suggest.append(line['name']) + if city_id is not None: + get_weather_data(grabber, city_id, apid_key) + continue + + print("Уточните название") + if len(suggest): + print("Возможные варианты:") + pp.pprint(suggest) + else: + print('не обнаружено совпадений') + + +if __name__ == '__main__': + # Та часть, где получаем все необходимые данные + url = 'https://home.openweathermap.org/users/sign_in' + gr = grab.Grab(log_file='out.html') + queue = mp.Queue() + download_names = mp.Process(target=get_cities, args=(queue,)) + download_names.start() + apid_key = connect(url, gr) + cities = queue.get() + download_names.join() + + # Та часть, где пользователь вводит данные + get_city_id(cities, gr, apid_key)