diff --git a/lesson01/home_work/hw01_easy.py b/lesson01/home_work/hw01_easy.py index 4592ef2af..140dde149 100644 --- a/lesson01/home_work/hw01_easy.py +++ b/lesson01/home_work/hw01_easy.py @@ -1,11 +1,41 @@ -# Задача-1: Дано произвольное целое число, вывести поочередно цифры исходного числа +__author__ = 'Пыпин Андрей Сергеевич.' + +# Задача-1: Дано произвольное целое число (число заранее неизвестно). +# Вывести поочередно цифры исходного числа (порядок вывода цифр неважен). +# Подсказки: +# * постарайтесь решить задачу с применением арифметики и цикла while; +# * при желании решите задачу с применением цикла for. # код пишем тут... +m = int(input('Введите число')) +i = 0 +while i <= m: + print(i) + i +=1 + + # Задача-2: Исходные значения двух переменных запросить у пользователя. # Поменять значения переменных местами. Вывести новые значения на экран. -# Не нужно решать задачу так: print("a = ", b, "b = ", a) - это неправильное решение! +# Подсказка: +# * постарайтесь сделать решение через дополнительную переменную +# или через арифметические действия +# Не нужно решать задачу так: +# print("a = ", b, "b = ", a) - это неправильное решение! +a = int(input('Введите число')) +b = int(input('Введите число')) +buf = a +a = b +b = buf +print(a, b) + -# Задача-3: Запросите у пользователя его возраст. Если ему есть 18 лет, выведите: "Доступ разрешен", +# Задача-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 d4d9fa7aa..35a5a4d4f 100644 --- a/lesson01/home_work/hw01_hard.py +++ b/lesson01/home_work/hw01_hard.py @@ -1,3 +1,6 @@ + +__author__ = 'Пыпин Андрей Сергеевич' + # Задание-1: # Ваня набрал несколько операций в интерпретаторе и получал результаты: # Код: a == a**2 @@ -6,4 +9,8 @@ # Результат: True # Код: a > 999999 # Результат: True -# Вопрос: Чему была равна переменная a, если точно известно, что её значение не изменялось? +8 +# Вопрос: Чему была равна переменная a, +# если точно известно, что её значение не изменялось? + +# Подсказка: это значение точно есть ;) diff --git a/lesson01/home_work/hw01_normal.py b/lesson01/home_work/hw01_normal.py index 8c6435811..63448bf41 100644 --- a/lesson01/home_work/hw01_normal.py +++ b/lesson01/home_work/hw01_normal.py @@ -1,16 +1,44 @@ -__author__ = '' -# Задача-1: Дано произвольное целое число, вывести самую большую цифру этого числа. -# Например, дается x = 58375. Нужно вывести максимальную цифру в данном числе, т.е. 8. -# Подразумевается, что мы не знаем это число заранее. Число приходит в виде целого беззнакового. +__author__ = 'Пыпин Андрей Сергеевич.' +# Задача-1: Дано произвольное целое число, вывести самую большую цифру этого числа. +# Например, дается x = 58375. +# Нужно вывести максимальную цифру в данном числе, т.е. 8. +# Подразумевается, что мы не знаем это число заранее. +# Число приходит в виде целого беззнакового. +# Подсказки: +# * постарайтесь решить задачу с применением арифметики и цикла while; +# * при желании и понимании решите задачу с применением цикла for. +m = 184 +ls = [] +while m > 10: + ls.append(m % 10) + m //= 10 +r = max(ls) +print(r) # Задача-2: Исходные значения двух переменных запросить у пользователя. # Поменять значения переменных местами. Вывести новые значения на экран. # Решите задачу, используя только две переменные. - - -# Задача-3: Напишите программу, вычисляющую корни квадратного уравнения вида ax2 + bx + c = 0. -# Для вычисления квадратного корня воспользуйтесь функцией sqrt() модуля math +# Подсказки: +# * постарайтесь сделать решение через действия над числами; +# * при желании и понимании воспользуйтесь синтаксисом кортежей 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 370c370b2..9fde8a34a 100644 --- a/lesson02/home_work/hw02_easy.py +++ b/lesson02/home_work/hw02_easy.py @@ -1,5 +1,13 @@ # Задача-1: -# Дан список фруктов. Напишите программу, выводящую фрукты в виде нумерованного списка, выровненного по правой стороне +# Дан список фруктов. +# Напишите программу, выводящую фрукты в виде нумерованного списка, +# выровненного по правой стороне. +empty_list = [] +my_list = ["яблоко", "банан", "киви", "арбуз"] +for index, value in enumerate(my_list, 1): + print("{}. {:>10}".format(index, value)) + + # Пример: # Дано: ["яблоко", "банан", "киви", "арбуз"] # Вывод: @@ -8,11 +16,26 @@ # 3. киви # 4. арбуз -# Подсказка: использует метод .format() +# Подсказка: воспользоваться методом .format() + # Задача-2: -# Даны два произвольные списка. Удалите из первого списка элементы, присутствующие во втором списке. +# Даны два произвольные списка. +# Удалите из первого списка элементы, присутствующие во втором списке. + +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_hard.py b/lesson02/home_work/hw02_hard.py index d2421bc0a..c96843184 100644 --- a/lesson02/home_work/hw02_hard.py +++ b/lesson02/home_work/hw02_hard.py @@ -1,16 +1,20 @@ -# Задание-1: уравнение прямой вида y = kx + b задано ввиде строки. -# Определить координату y точки с заданной координатой x +# Задание-1: уравнение прямой вида y = kx + b задано в виде строки. +# Определить координату y точки с заданной координатой x. equation = 'y = -12x + 11111140.2121' x = 2.5 # вычислите и выведите y -# Задание-2: Дата задана в виде строки формата 'dd.mm.yyyy'. Проверить, корректно ли введена дата. + +# Задание-2: Дата задана в виде строки формата 'dd.mm.yyyy'. +# Проверить, корректно ли введена дата. # Условия корректности: -# 1. День должен приводиться к целому числу в диапазоне от 1 до 30(31) (в зависимости от месяца, февраль не учитываем) +# 1. День должен приводиться к целому числу в диапазоне от 1 до 30(31) +# (в зависимости от месяца, февраль не учитываем) # 2. Месяц должен приводиться к целому числу в диапазоне от 1 до 12 # 3. Год должен приводиться к целому положительному числу в диапазоне от 1 до 9999 -# 4. Длина исходной строки для частей должна быть в соответствии с форматом (т.е. 2 - для дня, 2- месяц, 4 -год) +# 4. Длина исходной строки для частей должна быть в соответствии с форматом +# (т.е. 2 символа для дня, 2 - для месяца, 4 - для года) # Пример корректной даты date = '01.11.1985' @@ -20,11 +24,14 @@ date = '1.12.1001' date = '-2.10.3001' -# Задание-3: "Перевернутая башня" (Задача олимпиадного уровня) + +# Задание-3: "Перевёрнутая башня" (Задача олимпиадного уровня) # -# Вавилонцы решили построить удивительную башню — расширяющуюся к верху и содержащую бесконечное число этажей и комнат. -# Она устроена следующим образом — на первом этаже одна комната, затем идет два этажа, -# на каждом из которых по две комнаты, затем идёт три этажа, на каждом из которых по три комнаты и так далее: +# Вавилонцы решили построить удивительную башню — +# расширяющуюся к верху и содержащую бесконечное число этажей и комнат. +# Она устроена следующим образом — на первом этаже одна комната, +# затем идет два этажа, на каждом из которых по две комнаты, +# затем идёт три этажа, на каждом из которых по три комнаты и так далее: # ... # 12 13 14 # 9 10 11 @@ -33,7 +40,8 @@ # 2 3 # 1 # -# Эту башню решили оборудовать лифтом --- и вот задача: нужно научиться по номеру комнаты определять, +# Эту башню решили оборудовать лифтом --- и вот задача: +# нужно научиться по номеру комнаты определять, # на каком этаже она находится и какая она по счету слева на этом этаже. # # Входные данные: В первой строчке задан номер комнаты N, 1 ≤ N ≤ 2 000 000 000. diff --git a/lesson02/home_work/hw02_normal.py b/lesson02/home_work/hw02_normal.py index e446ac144..e3d19e53f 100644 --- a/lesson02/home_work/hw02_normal.py +++ b/lesson02/home_work/hw02_normal.py @@ -1,17 +1,142 @@ # Задача-1: -# Дан список, заполненный произвольными целыми числами, получите новый список, элементами которого будут -# квадратные корни элементов исходного списка, но только если результаты извлечения корня не имеют десятичной части и +# Дан список, заполненный произвольными целыми числами, получите новый список, +# элементами которого будут квадратные корни элементов исходного списка, +# но только если результаты извлечения корня не имеют десятичной части и # если такой корень вообще можно извлечь # Пример: Дано: [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) -# Задача-3: Напишите алгоритм, заполняющий список произвольными целыми числами в диапазоне от -100 до 100 -# В списке должно быть n - элементов -# Подсказка: для получения случайного числа используйте функцию randint() модуля random +# Задача-4: Дан список, заполненный произвольными целыми числами. +# Получите новый список, элементами которого будут: +# а) неповторяющиеся элементы исходного списка: +# например, 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) -# Задача-4: Дан список, заполненный произвольными целыми числами -# Получите новый список, элементами которого будут только уникальные элементы исходного -# Например, lst = [1,2,4,5,6,2,5,2], нужно получить lst2 = [1,4,6] +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 6027c08ef..b60b60709 100644 --- a/lesson03/home_work/hw03_easy.py +++ b/lesson03/home_work/hw03_easy.py @@ -1,14 +1,17 @@ # Задание-1: # Напишите функцию, округляющую полученное произвольное десятичное число -# до кол-ва знаков (кол-во знаков передается вторым аргументом) +# до кол-ва знаков (кол-во знаков передается вторым аргументом). # Округление должно происходить по математическим правилам (0.6 --> 1, 0.4 --> 0). -# Для решения задачи не используйте встроенные функции и функции из модуля math +# Для решения задачи не используйте встроенные функции и функции из модуля math. +def my_round(number, digits): + multiplier = pow(10.0, digits) + return int (number*multiplier + 0.5) / multiplier -def my_round(number, ndigits): - pass +print(my_round(2.1234567, 5)) +print(my_round(2.1999967, 5)) +print(my_round(2.9999967, 5)) -my_round(2.1234567, 5) # Задание-2: # Дан шестизначный номер билета. Определить, является ли билет счастливым. @@ -16,7 +19,7 @@ def my_round(number, ndigits): # Билет считается счастливым, если сумма его первых и последних цифр равны. # !!!P.S.: функция не должна НИЧЕГО print'ить - 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)))) diff --git a/lesson03/home_work/hw03_hard.py b/lesson03/home_work/hw03_hard.py index 9bb864f4d..a8c7f668a 100644 --- a/lesson03/home_work/hw03_hard.py +++ b/lesson03/home_work/hw03_hard.py @@ -1,13 +1,15 @@ # Задание-1: # Написать программу, выполняющую операции (сложение и вычитание) с простыми дробями. -# Дроби вводятся и выводятся в формате: n x/y ,где n - целая часть, x - числитель, у - знаменатель. +# Дроби вводятся и выводятся в формате: +# n x/y ,где n - целая часть, x - числитель, у - знаменатель. # Дроби могут быть отрицательные и не иметь целой части, или иметь только целую часть. # Примеры: -# Ввод: 5/6 + 4/7 (все выражение вводится целиком в виде строки) -# Вывод: 1 17/42 (результат обязательно упростить и выделить целую часть) +# Ввод: 5/6 + 4/7 (всё выражение вводится целиком в виде строки) +# Вывод: 1 17/42 (результат обязательно упростить и выделить целую часть) # Ввод: -2/3 - -2 # Вывод: 1 1/3 + # Задание-2: # Дана ведомость расчета заработной платы (файл "data/workers"). # Рассчитайте зарплату всех работников, зная что они получат полный оклад, @@ -16,6 +18,7 @@ # они получают удвоенную ЗП, пропорциональную норме. # Кол-во часов, которые были отработаны, указаны в файле "data/hours_of" + # Задание-3: # Дан файл ("data/fruits") со списком фруктов. # Записать в новые файлы все фрукты, начинающиеся с определенной буквы. 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 f29293105..461961c0f 100644 --- a/lesson04/home_work/hw04_normal.py +++ b/lesson04/home_work/hw04_normal.py @@ -20,9 +20,11 @@ 'XiUWgsKQrDOeZoNlZNRvHnLgCmysUeKnVJXPFIzvdDyleXylnKBfLCjLHntltignbQoiQ'\ 'zTYwZAiRwycdlHfyHNGmkNqSwXUrxGc' + # Задание-2: + # Вывести символы в верхнем регистре, слева от которых находятся -# два символа в нижнем регистре, а справа два символа в верхнем регистре. +# два символа в нижнем регистре, а справа - два символа в верхнем регистре. # Т.е. из строки # "GAMkgAYEOmHBSQsSUHKvSfbmxULaysmNOGIPHpEMujalpPLNzRWXfwHQqwksrFeipEUlTLec" # нужно получить список строк: ['AY', 'NOGI', 'P'] @@ -31,11 +33,54 @@ line_2 = 'mtMmEZUOmcqWiryMQhhTxqKdSTKCYEJlEZCsGAMkgAYEOmHBSQsSUHKvSfbmxULaysm'\ 'NOGIPHpEMujalpPLNzRWXfwHQqwksrFeipEUlTLeclMwAoktKlfUBJHPsnawvjPhfgewV'\ 'fzKTUfSYtBydXaVIpxWjNKgXANvIoumesCSSvjEGRJosUfuhRRDUuTQwLlJJJDdkVjfSA'\ - 'HqnLxooisBDWuxIhyjJaXDYwdoVPnsllMngNlmkpYOlqXEFIxPqqqgAWdJsOvqppOfyIV'\'jXapzGOrfinzzsNMtBIOclwbfRzytmDgEFUzxvZGkdOaQYLVBfsGSAfJMchgBWAsGnBnW'\'etekUTVuPluKRMQsdelzBgLzuwiimqkFKpyQRzOUyHkXRkdyIEBvTjdByCfkVIAQaAbfC'\'vzQWrMMsYpLtdqRltXPqcSMXJIvlBzKoQnSwPFkapxGqnZCVFfKRLUIGBLOwhchWCdJbR'\ + 'HqnLxooisBDWuxIhyjJaXDYwdoVPnsllMngNlmkpYOlqXEFIxPqqqgAWdJsOvqppOfyIV'\ + 'jXapzGOrfinzzsNMtBIOclwbfRzytmDgEFUzxvZGkdOaQYLVBfsGSAfJMchgBWAsGnBnW'\ + 'etekUTVuPluKRMQsdelzBgLzuwiimqkFKpyQRzOUyHkXRkdyIEBvTjdByCfkVIAQaAbfC'\ + 'vzQWrMMsYpLtdqRltXPqcSMXJIvlBzKoQnSwPFkapxGqnZCVFfKRLUIGBLOwhchWCdJbR'\ 'uXbJrwTRNyAxDctszKjSnndaFkcBZmJZWjUeYMdevHhBJMBSShDqbjAuDGTTrSXZywYkm'\ - 'jCCEUZShGofaFpuespaZWLFNIsOqsIRLexWqTXsOaScgnsUKsJxiihwsCdBViEQBHQaOn'\'LfBtQQShTYHFqrvpVFiiEFMcIFTrTkIBpGUflwTvAzMUtmSQQZGHlmQKJndiAXbIzVkGS'\'euTSkyjIGsiWLALHUCsnQtiOtrbQOQunurZgHFiZjWtZCEXZCnZjLeMiFlxnPkqfJFbCf'\'KCuUJmGYJZPpRBFNLkqigxFkrRAppYRXeSCBxbGvqHmlsSZMWSVQyzenWoGxyGPvbnhWH'\'uXBqHFjvihuNGEEFsfnMXTfptvIOlhKhyYwxLnqOsBdGvnuyEZIheApQGOXWeXoLWiDQN'\'JFaXiUWgsKQrDOeZoNlZNRvHnLgCmysUeKnVJXPFIzvdDyleXylnKBfLCjLHntltignbQ'\ + 'jCCEUZShGofaFpuespaZWLFNIsOqsIRLexWqTXsOaScgnsUKsJxiihwsCdBViEQBHQaOn'\ + 'LfBtQQShTYHFqrvpVFiiEFMcIFTrTkIBpGUflwTvAzMUtmSQQZGHlmQKJndiAXbIzVkGS'\ + 'euTSkyjIGsiWLALHUCsnQtiOtrbQOQunurZgHFiZjWtZCEXZCnZjLeMiFlxnPkqfJFbCf'\ + 'KCuUJmGYJZPpRBFNLkqigxFkrRAppYRXeSCBxbGvqHmlsSZMWSVQyzenWoGxyGPvbnhWH'\ + '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 59252493d..86cfcc003 100644 --- a/lesson05/home_work/hw05_easy.py +++ b/lesson05/home_work/hw05_easy.py @@ -1,9 +1,28 @@ # Задача-1: -# Напишите скрипт, создающий директории dir_1 - dir_9 в папке, из которой запущен данный скрипт. +# Напишите скрипт, создающий директории 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_hard.py b/lesson05/home_work/hw05_hard.py index 5161f162b..7507e47b2 100644 --- a/lesson05/home_work/hw05_hard.py +++ b/lesson05/home_work/hw05_hard.py @@ -5,10 +5,11 @@ # rm - удаляет указанный файл (запросить подтверждение операции) # cd - меняет текущую директорию на указанную # ls - отображение полного пути текущей директории -# путь считать абсолютным (full_path) - в Linux начинается с /, в Windows с имени диска +# путь считать абсолютным (full_path) - +# в Linux начинается с /, в Windows с имени диска, # все остальные пути считать относительными. -# Важно! Все операции должны выполняться в той директории, в который вы находитесь. Исходной директорией считать ту, -# в которой был запущен скрипт. +# Важно! Все операции должны выполняться в той директории, в который вы находитесь. +# Исходной директорией считать ту, в которой был запущен скрипт. # P.S. По возможности, сделайте кросс-платформенную реализацию. diff --git a/lesson05/home_work/hw05_normal.py b/lesson05/home_work/hw05_normal.py index 6c0d59d25..684cc8f17 100644 --- a/lesson05/home_work/hw05_normal.py +++ b/lesson05/home_work/hw05_normal.py @@ -1,12 +1,16 @@ # Задача-1: -# Напишите небольшую консольную утилиту, позволяющую работать с папками текущей директории. +# Напишите небольшую консольную утилиту, +# позволяющую работать с папками текущей директории. # Утилита должна иметь меню выбора действия, в котором будут пункты: # 1. Перейти в папку # 2. Просмотреть содержимое текущей папки # 3. Удалить папку # 4. Создать папку # При выборе пунктов 1, 3, 4 программа запрашивает название папки -# и выводит результат действия: "Успешно создано/удалено/перешел", "Невозможно создать/удалить/перейти" +# и выводит результат действия: "Успешно создано/удалено/перешел", +# "Невозможно создать/удалить/перейти" # Для решения данной задачи используйте алгоритмы из задания easy, -# оформленные в виде соответствующих функций, и импортированные в данный файл из easy.py +# оформленные в виде соответствующих функций, +# и импортированные в данный файл из easy.py + diff --git a/lesson06/home_work/hw06_easy.py b/lesson06/home_work/hw06_easy.py index 547617f80..89e1b7faa 100644 --- a/lesson06/home_work/hw06_easy.py +++ b/lesson06/home_work/hw06_easy.py @@ -1,8 +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_hard.py b/lesson06/home_work/hw06_hard.py index 069742ce0..fae8d84d2 100644 --- a/lesson06/home_work/hw06_hard.py +++ b/lesson06/home_work/hw06_hard.py @@ -1,10 +1,12 @@ # Задание-1: Решите задачу (дублированную ниже): -# Дана ведомость расчета заработной платы (файл "data/workers"). Рассчитайте зарплату всех работников, -# зная что они получат полный оклад, если отработают норму часов. Если же они отработали меньше нормы, -# то их ЗП уменьшается пропорционально, а за заждый час переработки они получают удвоенную ЗП, -# пропорциональную норме. +# Дана ведомость расчета заработной платы (файл "data/workers"). +# Рассчитайте зарплату всех работников, зная что они получат полный оклад, +# если отработают норму часов. Если же они отработали меньше нормы, +# то их ЗП уменьшается пропорционально, а за заждый час переработки они получают +# удвоенную ЗП, пропорциональную норме. # Кол-во часов, которые были отработаны, указаны в файле "data/hours_of" # С использованием классов. -# Реализуйте классы сотрудников так, чтобы на вход функции-конструктора каждый работник получал строку из файла +# Реализуйте классы сотрудников так, чтобы на вход функции-конструктора +# каждый работник получал строку из файла diff --git a/lesson06/home_work/hw06_normal.py b/lesson06/home_work/hw06_normal.py index e5a1581e1..201be70b9 100644 --- a/lesson06/home_work/hw06_normal.py +++ b/lesson06/home_work/hw06_normal.py @@ -1,13 +1,78 @@ # Задание-1: # Реализуйте описаную ниже задачу, используя парадигмы ООП: -# В школе есть Классы(5А, 7Б и т.д.), в которых учатся Ученики. У каждого ученика есть два Родителя(мама и папа). -# Также в школе преподают Учителя, один учитель может преподавать в неограниченном кол-ве классов -# свой определенный предмет. Т.е. Учитель Иванов может преподавать математику у 5А и 6Б, но больше математику не -# может преподавать никто другой. +# В школе есть Классы(5А, 7Б и т.д.), в которых учатся Ученики. +# У каждого ученика есть два Родителя(мама и папа). +# Также в школе преподают Учителя. Один учитель может преподавать +# в неограниченном кол-ве классов свой определенный предмет. +# Т.е. Учитель Иванов может преподавать математику у 5А и 6Б, +# но больше математику не может преподавать никто другой. # Выбранная и заполненная данными структура должна решать следующие задачи: # 1. Получить полный список всех классов школы -# 2. Получить список всех учеников в указанном классе(каждый ученик отображается в формате "Фамилия И.О.") -# 3. Получить список всех предметов указанного ученика (Ученик --> Класс --> Учителя --> Предметы) +# 2. Получить список всех учеников в указанном классе +# (каждый ученик отображается в формате "Фамилия И.О.") +# 3. Получить список всех предметов указанного ученика +# (Ученик --> Класс --> Учителя --> Предметы) # 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 e30db8c3e..229f975f8 100644 --- a/lesson07/home_work/loto.py +++ b/lesson07/home_work/loto.py @@ -1,6 +1,7 @@ #!/usr/bin/python3 -"""Лото +""" +== Лото == Правила игры в лото. @@ -43,8 +44,8 @@ 23 33 38 48 71 -------------------------- -- Карточка компьютера --- - 7 87 - 14 11 - 16 49 55 88 77 + 7 11 - 14 87 + 16 49 55 77 88 15 20 - 76 - -------------------------- Зачеркнуть цифру? (y/n) @@ -56,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() diff --git a/lesson08/home_work/openweather.py b/lesson08/home_work/openweather.py index 5b321286f..a9debfa1c 100644 --- a/lesson08/home_work/openweather.py +++ b/lesson08/home_work/openweather.py @@ -1,6 +1,12 @@ -""" OpenWeatherMap -OpenWeatherMap — онлайн-сервис, который предоставляет бесплатный API для доступа к данным о текущей погоде, прогнозам, для web-сервисов и мобильных приложений. Архивные данные доступны только на коммерческой основе. В качестве источника данных используются официальные метеорологические службы, данные из метеостанций аэропортов, и данные с частных метеостанций. +""" +== OpenWeatherMap == + +OpenWeatherMap — онлайн-сервис, который предоставляет бесплатный API + для доступа к данным о текущей погоде, прогнозам, для web-сервисов + и мобильных приложений. Архивные данные доступны только на коммерческой основе. + В качестве источника данных используются официальные метеорологические службы + данные из метеостанций аэропортов, и данные с частных метеостанций. Необходимо решить следующие задачи: @@ -9,7 +15,8 @@ Предлагается 2 варианта (по желанию): - получить APPID вручную - - автоматизировать процесс получения APPID, используя дополнительную библиотеку GRAB (pip install grab) + - автоматизировать процесс получения APPID, + используя дополнительную библиотеку GRAB (pip install grab) Необходимо зарегистрироваться на сайте openweathermap.org: https://home.openweathermap.org/users/sign_up @@ -17,23 +24,25 @@ Войти на сайт по ссылке: https://home.openweathermap.org/users/sign_in - Свой ключ вытащить со страницы отсюда: + Свой ключ "вытащить" со страницы отсюда: https://home.openweathermap.org/api_keys Ключ имеет смысл сохранить в локальный файл, например, "app.id" == Получение списка городов == - Список городов может быть получен по ссылке: http://bulk.openweathermap.org/sample/city.list.json.gz + Список городов может быть получен по ссылке: + http://bulk.openweathermap.org/sample/city.list.json.gz Далее снова есть несколько вариантов (по желанию): - скачать и распаковать список вручную - автоматизировать скачивание (ulrlib) и распаковку списка - (воспользоваться модулем gzip или вызвать распаковку через создание процесса архиватора через модуль subprocess) + (воспользоваться модулем gzip + или распаковать внешним архиватором, воспользовавшись модулем subprocess) Список достаточно большой. Представляет собой 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}} +{"_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}} == Получение погоды == @@ -50,13 +59,19 @@ Данные о погоде выдаются в JSON-формате - {"coord":{"lon":38.44,"lat":55.87},"weather":[{"id":803,"main":"Clouds","description":"broken clouds","icon":"04n"}],"base":"cmc stations","main":{"temp":280.03,"pressure":1006,"humidity":83,"temp_min":273.15,"temp_max":284.55},"wind":{"speed":3.08,"deg":265,"gust":7.2},"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} + {"coord":{"lon":38.44,"lat":55.87}, + "weather":[{"id":803,"main":"Clouds","description":"broken clouds","icon":"04n"}], + "base":"cmc stations","main":{"temp":280.03,"pressure":1006,"humidity":83, + "temp_min":273.15,"temp_max":284.55},"wind":{"speed":3.08,"deg":265,"gust":7.2}, + "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} == Сохранение данных в локальную БД == Программа должна позволять: -1. Создавать файл базы данных SQLite с следующей структурой данных (если файла - базы данных не существует): +1. Создавать файл базы данных SQLite со следующей структурой данных + (если файла базы данных не существует): Погода id_города INTEGER PRIMARY KEY @@ -66,7 +81,8 @@ id_погоды INTEGER # weather.id из JSON-данных 2. Выводить список стран из файла и предлагать пользователю выбрать страну -(ввиду того, что список городов и стран весьма велик имеет смысл запрашивать у пользователя имя города или страны +(ввиду того, что список городов и стран весьма велик + имеет смысл запрашивать у пользователя имя города или страны и искать данные в списке доступных городов/стран (регуляркой)) 3. Скачивать JSON (XML) файлы погоды в городах выбранной страны @@ -76,14 +92,13 @@ При повторном запуске скрипта: -- используется уже скачанный файл с городами -- используется созданная база данных, новые данные добавляются и обновляются - +- используется уже скачанный файл с городами; +- используется созданная база данных, новые данные добавляются и обновляются. При работе с XML-файлами: -Доступ к данным в XML файлах происходит через пространство имен: +Доступ к данным в XML-файлах происходит через пространство имен: