diff --git a/.gitignore b/.gitignore index 6b9c94f00..c1d7cb7eb 100644 --- a/.gitignore +++ b/.gitignore @@ -106,3 +106,4 @@ com_crashlytics_export_strings.xml crashlytics.properties crashlytics-build.properties +/*.zip diff --git a/README.md b/README.md index 951a1beec..03f8214c9 100644 --- a/README.md +++ b/README.md @@ -3,7 +3,7 @@ ## Оглавление ### Урок 1: Знакомство с python -1. Где используется питон? +1. Где используется Питон? 1. Сильные стороны языка 1. Установка и запуск интерпретатора python 1. Выполнение .py файлов из консоли @@ -43,11 +43,11 @@ 1. Тернарный оператор if else 1. Оператор is 1. Генераторы списков, словарей -1. Сырые строки (r"")и регулярные выражения -1. Обработка исключений (try except) +1. Сырые строки (r"") и регулярные выражения +1. Обработка исключений (try..except) ### Урок 5: Модули и библиотеки -1. Подключение модулей(import, from) +1. Подключение модулей (import, from) 1. Создание модулей 1. Пространство имен модуля 1. Дополнительные возможности модулей @@ -73,7 +73,7 @@ 1. Создание собственных исключений 1. Подведение итогов 1. Несколько слов о программе Python Advanced: - 1. Герераторы (yield) + 1. Генераторы (yield) 1. Декораторы 1. Множественное наследование 1. Многопоточные приложения diff --git a/lesson01/home_work/hw01_easy.py b/lesson01/home_work/hw01_easy.py index d5622ef4c..4592ef2af 100644 --- a/lesson01/home_work/hw01_easy.py +++ b/lesson01/home_work/hw01_easy.py @@ -1,3 +1,4 @@ + # Задача-1: Дано произвольное целое число, вывести поочередно цифры исходного числа # код пишем тут... diff --git a/lesson01/home_work/hw01_normal.py b/lesson01/home_work/hw01_normal.py index e7da34b3c..8c6435811 100644 --- a/lesson01/home_work/hw01_normal.py +++ b/lesson01/home_work/hw01_normal.py @@ -1,4 +1,8 @@ +__author__ = '' + # Задача-1: Дано произвольное целое число, вывести самую большую цифру этого числа. +# Например, дается x = 58375. Нужно вывести максимальную цифру в данном числе, т.е. 8. +# Подразумевается, что мы не знаем это число заранее. Число приходит в виде целого беззнакового. # Задача-2: Исходные значения двух переменных запросить у пользователя. diff --git a/lesson02/examples/5_iterators!!!.py b/lesson02/examples/5_iterators!!!.py deleted file mode 100644 index 9c067212e..000000000 --- a/lesson02/examples/5_iterators!!!.py +++ /dev/null @@ -1 +0,0 @@ -__author__ = 'main' diff --git a/lesson02/home_work/hw02_easy.py b/lesson02/home_work/hw02_easy.py index 33b02bac4..370c370b2 100644 --- a/lesson02/home_work/hw02_easy.py +++ b/lesson02/home_work/hw02_easy.py @@ -14,5 +14,5 @@ # Даны два произвольные списка. Удалите из первого списка элементы, присутствующие во втором списке. # Задача-3: -# Дан произвольный список из целых чисел. Получите НОВЫЙ список из элементов исходного выполнив следующие условия: +# Дан произвольный список из целых чисел. Получите НОВЫЙ список из элементов исходного, выполнив следующие условия: # если элемент кратен двум, то разделить его на 4, если не кратен, то умножить на два. diff --git a/lesson02/home_work/hw02_hard.py b/lesson02/home_work/hw02_hard.py index 090c09e6d..d2421bc0a 100644 --- a/lesson02/home_work/hw02_hard.py +++ b/lesson02/home_work/hw02_hard.py @@ -1,15 +1,15 @@ -# Задание-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) (в зависимости от месяца, февраль не учитываем) # 2. Месяц должен приводиться к целому числу в диапазоне от 1 до 12 -# 3. Год приводиться к целому положитеьному числу в диапазоне от 1 до 9999 +# 3. Год должен приводиться к целому положительному числу в диапазоне от 1 до 9999 # 4. Длина исходной строки для частей должна быть в соответствии с форматом (т.е. 2 - для дня, 2- месяц, 4 -год) # Пример корректной даты @@ -23,7 +23,7 @@ # Задание-3: "Перевернутая башня" (Задача олимпиадного уровня) # # Вавилонцы решили построить удивительную башню — расширяющуюся к верху и содержащую бесконечное число этажей и комнат. -# Она устроена следующим образом — на первом этаже одна комната, затем идет два этажа +# Она устроена следующим образом — на первом этаже одна комната, затем идет два этажа, # на каждом из которых по две комнаты, затем идёт три этажа, на каждом из которых по три комнаты и так далее: # ... # 12 13 14 @@ -33,7 +33,7 @@ # 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 9b22d6ae5..e446ac144 100644 --- a/lesson02/home_work/hw02_normal.py +++ b/lesson02/home_work/hw02_normal.py @@ -1,5 +1,5 @@ # Задача-1: -# Дан список заполненный произвольными целыми числами, получите новый список элементами которого будут +# Дан список, заполненный произвольными целыми числами, получите новый список, элементами которого будут # квадратные корни элементов исходного списка, но только если результаты извлечения корня не имеют десятичной части и # если такой корень вообще можно извлечь # Пример: Дано: [2, -5, 8, 9, -25, 25, 4] Результат: [3, 5, 2] @@ -8,9 +8,10 @@ # Ваша задача вывести дату в текстовом виде, например: второе ноября 2013 года. # Склонением пренебречь (2000 года, 2010 года) -# Задача-3: Напишите алгоритм заполняющий список произвольными целыми числами в диапазоне от -100 до 100 +# Задача-3: Напишите алгоритм, заполняющий список произвольными целыми числами в диапазоне от -100 до 100 # В списке должно быть n - элементов -# Подсказка: для получения случайного числа изпользуйте функцию randint() модуля random +# Подсказка: для получения случайного числа используйте функцию randint() модуля random -# Задача-4: Дан список заполненный произвольными целыми числами +# Задача-4: Дан список, заполненный произвольными целыми числами # Получите новый список, элементами которого будут только уникальные элементы исходного +# Например, lst = [1,2,4,5,6,2,5,2], нужно получить lst2 = [1,4,6] diff --git a/lesson03/home_work/data/hours_of b/lesson03/home_work/data/hours_of index a8138954e..7e3c12c36 100644 --- a/lesson03/home_work/data/hours_of +++ b/lesson03/home_work/data/hours_of @@ -1,7 +1,7 @@ Имя Фамилия Отработано часов -Перт Алексеев 120 +Петр Алексеев 120 Матвей Бурин 160 Василий Сидоров 122 Альберт Грибов 118 Василий Иванов 180 -Перт Дурин 80 \ No newline at end of file +Петр Дурин 80 \ No newline at end of file diff --git a/lesson03/home_work/data/workers b/lesson03/home_work/data/workers index b1a1b110c..78b2eaf09 100644 --- a/lesson03/home_work/data/workers +++ b/lesson03/home_work/data/workers @@ -1,7 +1,7 @@ Имя Фамилия Зарплата Должность Норма_часов -Перт Алексеев 22000 прораб 140 +Петр Алексеев 22000 прораб 140 Василий Иванов 18000 плотник 150 Матвей Бурин 42000 директор 150 Василий Сидоров 17500 плотник 140 -Перт Дурин 20000 разнорабочий 160 +Петр Дурин 20000 разнорабочий 160 Альберт Грибов 20000 разнорабочий 160 \ No newline at end of file diff --git a/lesson03/home_work/hw03_hard.py b/lesson03/home_work/hw03_hard.py index 2114e4092..9bb864f4d 100644 --- a/lesson03/home_work/hw03_hard.py +++ b/lesson03/home_work/hw03_hard.py @@ -1,31 +1,30 @@ # Задание-1: -# Написать программу выполняющую операции (сложение и вычитание) с простыми дробями. +# Написать программу, выполняющую операции (сложение и вычитание) с простыми дробями. # Дроби вводятся и выводятся в формате: n x/y ,где n - целая часть, x - числитель, у - знаменатель. # Дроби могут быть отрицательные и не иметь целой части, или иметь только целую часть. # Примеры: # Ввод: 5/6 + 4/7 (все выражение вводится целиком в виде строки) # Вывод: 1 17/42 (результат обязательно упростить и выделить целую часть) # Ввод: -2/3 - -2 -# Вывод: 1 2/3 +# Вывод: 1 1/3 # Задание-2: # Дана ведомость расчета заработной платы (файл "data/workers"). # Рассчитайте зарплату всех работников, зная что они получат полный оклад, # если отработают норму часов. Если же они отработали меньше нормы, # то их ЗП уменьшается пропорционально, а за заждый час переработки -# они получают удвоенную ЗП пропорциональную норме. +# они получают удвоенную ЗП, пропорциональную норме. # Кол-во часов, которые были отработаны, указаны в файле "data/hours_of" # Задание-3: # Дан файл ("data/fruits") со списком фруктов. -# Записать в новые файлы все фрукты начинающиеся с определенной буквы. +# Записать в новые файлы все фрукты, начинающиеся с определенной буквы. # Т.е. в одном файле будут все фрукты на букву “А”, во втором на “Б” и т.д. # Файлы назвать соответственно. # Пример имен файлов: fruits_А, fruits_Б, fruits_В …. -# Важно! Обратите внимание, что нет фруктов начинающихся с некоторых букв. +# Важно! Обратите внимание, что нет фруктов, начинающихся с некоторых букв. # Напишите универсальный код, который будет работать с любым списком фруктов -# и распределять по файлам в зависимости от первых букв имеющихся в списке фруктов. +# и распределять по файлам в зависимости от первых букв, имеющихся в списке фруктов. # Подсказка: # Чтобы получить список больших букв русского алфавита: # print(list(map(chr, range(ord('А'), ord('Я')+1)))) - diff --git a/lesson03/home_work/hw03_normal.py b/lesson03/home_work/hw03_normal.py index 2b6a5fd4b..38ac1fcc1 100644 --- a/lesson03/home_work/hw03_normal.py +++ b/lesson03/home_work/hw03_normal.py @@ -2,7 +2,6 @@ # Напишите функцию, возвращающую ряд Фибоначчи с n-элемента до m-элемента. # Первыми элементами ряда считать цифры 1 1 - def fibonacci(n, m): pass @@ -18,7 +17,7 @@ def sort_to_max(origin_list): sort_to_max([2, 10, -12, 2.5, 20, -11, 4, 4, 0]) # Задача-3: -# Напишите собственную реализацию функции filter. +# Напишите собственную реализацию стандартной функции filter. # Разумеется, внутри нельзя использовать саму функцию filter. diff --git a/lesson04/home_work/hw04_easy.py b/lesson04/home_work/hw04_easy.py index 975810823..85035ea8b 100644 --- a/lesson04/home_work/hw04_easy.py +++ b/lesson04/home_work/hw04_easy.py @@ -1,15 +1,18 @@ -# Все задачи текущего блока решите с помощью генераторов! +# Все задачи текущего блока решите с помощью генераторов списков! # Задание-1: -# Дан список, заполненный произвольными целыми числами, получить новый список, элементы которого будут +# Дан список, заполненный произвольными целыми числами. +# Получить новый список, элементы которого будут # квадратами элементов исходного списка # [1, 2, 4, 0] --> [1, 4, 16, 0] # Задание-2: -# Даны два списка фруктов. Получить список фруктов, присутствующих в обоих исходных списках. +# Даны два списка фруктов. +# Получить список фруктов, присутствующих в обоих исходных списках. # Задание-3: -# Дан список, заполненный произвольными числами. Получить список из элементов исходного, удовлетворяющих след. условиям: +# Дан список, заполненный произвольными числами. +# Получить список из элементов исходного, удовлетворяющих следующим условиям: # + Элемент кратен 3 # + Элемент положительный # + Элемент не кратен 4 diff --git a/lesson04/home_work/hw04_hard.py b/lesson04/home_work/hw04_hard.py index a2b2b2163..3b12dc315 100644 --- a/lesson04/home_work/hw04_hard.py +++ b/lesson04/home_work/hw04_hard.py @@ -37,10 +37,13 @@ 07198403850962455444362981230987879927244284909188 84580156166097919133875499200524063689912560717606 05886116467109405077541002256983155200055935729725 -716362695618826704282524836008""" +71636269561882670428252483600823257530420752963450""" + # Задание-3 (Ферзи): -# Известно, что на доске 8×8 можно расставить 8 ферзей так, чтобы они не били друг друга. -# Вам дана расстановка 8 ферзей на доске, определите, есть ли среди них пара бьющих друг друга. -# Программа получает на вход восемь пар чисел, каждое число от 1 до 8 — координаты 8 ферзей. +# Известно, что на доске 8×8 можно расставить 8 ферзей так, чтобы они не били +# друг друга. Вам дана расстановка 8 ферзей на доске. +# Определите, есть ли среди них пара бьющих друг друга. +# Программа получает на вход восемь пар чисел, +# каждое число от 1 до 8 — координаты 8 ферзей. # Если ферзи не бьют друг друга, выведите слово NO, иначе выведите YES. diff --git a/lesson04/home_work/hw04_normal.py b/lesson04/home_work/hw04_normal.py index d67bf6062..f29293105 100644 --- a/lesson04/home_work/hw04_normal.py +++ b/lesson04/home_work/hw04_normal.py @@ -1,36 +1,44 @@ # Задание-1: -# Вывести символы в нижнем регистре, которые окружают 1 или более символа в верхнем регистре. +# Вывести символы в нижнем регистре, которые находятся вокруг +# 1 или более символов в верхнем регистре. +# Т.е. из строки "mtMmEZUOmcq" нужно получить ['mt', 'm', 'mcq'] # Решить задачу двумя способами: с помощью re и без. -line = 'mtMmEZUOmcqWiryMQhhTxqKdSTKCYEJlEZCsGAMkgAYEOmHBSQsSUHKvSfbmxULaysmNOGIPHpEMujalp' \ - 'PLNzRWXfwHQqwksrFeipEUlTLeclMwAoktKlfUBJHPsnawvjPhfgewVzKTUfSYtBydXaVIpxWjNKgXANv' \ - 'IoumesCSSvjEGRJosUfuhRRDUuTQwLlJJJDdkVjfSAHqnLxooisBDWuxIhyjJaXDYwdoVPnsllMngNlmkp' \ - 'YOlqXEFIxPqqqgAWdJsOvqppOfyIVjXapzGOrfinzzsNMtBIOclwbfRzytmDgEFUzxvZGkdOaQYLVBfsGSA' \ - 'fJMchgBWAsGnBnWetekUTVuPluKRMQsdelzBgLzuwiimqkFKpyQRzOUyHkXRkdyIEBvTjdByCfkVIAQaAb' \ - 'fCvzQWrMMsYpLtdqRltXPqcSMXJIvlBzKoQnSwPFkapxGqnZCVFfKRLUIGBLOwhchWCdJbRuXbJrwTRNyA' \ - 'xDctszKjSnndaFkcBZmJZWjUeYMdevHhBJMBSShDqbjAuDGTTrSXZywYkmjCCEUZShGofaFpuespaZWLFN' \ - 'IsOqsIRLexWqTXsOaScgnsUKsJxiihwsCdBViEQBHQaOnLfBtQQShTYHFqrvpVFiiEFMcIFTrTkIBpGUf' \ - 'lwTvAzMUtmSQQZGHlmQKJndiAXbIzVkGSeuTSkyjIGsiWLALHUCsnQtiOtrbQOQunurZgHFiZjWtZCEXZC' \ - 'nZjLeMiFlxnPkqfJFbCfKCuUJmGYJZPpRBFNLkqigxFkrRAppYRXeSCBxbGvqHmlsSZMWSVQyzenWoGxy' \ - 'GPvbnhWHuXBqHFjvihuNGEEFsfnMXTfptvIOlhKhyYwxLnqOsBdGvnuyEZIheApQGOXWeXoLWiDQNJFaXi' \ - 'UWgsKQrDOeZoNlZNRvHnLgCmysUeKnVJXPFIzvdDyleXylnKBfLCjLHntltignbQoiQzTYwZAiRwycdlHfyHNGmkNqSwXUrxGc' + +line = 'mtMmEZUOmcqWiryMQhhTxqKdSTKCYEJlEZCsGAMkgAYEOmHBSQsSUHKvSfbmxULaysmNO'\ + 'GIPHpEMujalpPLNzRWXfwHQqwksrFeipEUlTLeclMwAoktKlfUBJHPsnawvjPhfgewVzK'\ + 'TUfSYtBydXaVIpxWjNKgXANvIoumesCSSvjEGRJosUfuhRRDUuTQwLlJJJDdkVjfSAHqn'\ + 'LxooisBDWuxIhyjJaXDYwdoVPnsllMngNlmkpYOlqXEFIxPqqqgAWdJsOvqppOfyIVjXa'\ + 'pzGOrfinzzsNMtBIOclwbfRzytmDgEFUzxvZGkdOaQYLVBfsGSAfJMchgBWAsGnBnWete'\ + 'kUTVuPluKRMQsdelzBgLzuwiimqkFKpyQRzOUyHkXRkdyIEBvTjdByCfkVIAQaAbfCvzQ'\ + 'WrMMsYpLtdqRltXPqcSMXJIvlBzKoQnSwPFkapxGqnZCVFfKRLUIGBLOwhchWCdJbRuXb'\ + 'JrwTRNyAxDctszKjSnndaFkcBZmJZWjUeYMdevHhBJMBSShDqbjAuDGTTrSXZywYkmjCC'\ + 'EUZShGofaFpuespaZWLFNIsOqsIRLexWqTXsOaScgnsUKsJxiihwsCdBViEQBHQaOnLfB'\ + 'tQQShTYHFqrvpVFiiEFMcIFTrTkIBpGUflwTvAzMUtmSQQZGHlmQKJndiAXbIzVkGSeuT'\ + 'SkyjIGsiWLALHUCsnQtiOtrbQOQunurZgHFiZjWtZCEXZCnZjLeMiFlxnPkqfJFbCfKCu'\ + 'UJmGYJZPpRBFNLkqigxFkrRAppYRXeSCBxbGvqHmlsSZMWSVQyzenWoGxyGPvbnhWHuXB'\ + 'qHFjvihuNGEEFsfnMXTfptvIOlhKhyYwxLnqOsBdGvnuyEZIheApQGOXWeXoLWiDQNJFa'\ + 'XiUWgsKQrDOeZoNlZNRvHnLgCmysUeKnVJXPFIzvdDyleXylnKBfLCjLHntltignbQoiQ'\ + 'zTYwZAiRwycdlHfyHNGmkNqSwXUrxGc' # Задание-2: -# Вывести символы в верхнем регистре, которые окружают ровно два символа в нижнем регистре слева -# и два символа в верхнем регистре справа. Решить задачу двумя способами: с помощью re и без. -line_2 = 'mtMmEZUOmcqWiryMQhhTxqKdSTKCYEJlEZCsGAMkgAYEOmHBSQsSUHKvSfbmxULaysmNOGIPHpEMujalp' \ - 'PLNzRWXfwHQqwksrFeipEUlTLeclMwAoktKlfUBJHPsnawvjPhfgewVzKTUfSYtBydXaVIpxWjNKgXANv' \ - 'IoumesCSSvjEGRJosUfuhRRDUuTQwLlJJJDdkVjfSAHqnLxooisBDWuxIhyjJaXDYwdoVPnsllMngNlmkp' \ - 'YOlqXEFIxPqqqgAWdJsOvqppOfyIVjXapzGOrfinzzsNMtBIOclwbfRzytmDgEFUzxvZGkdOaQYLVBfsGSA' \ - 'fJMchgBWAsGnBnWetekUTVuPluKRMQsdelzBgLzuwiimqkFKpyQRzOUyHkXRkdyIEBvTjdByCfkVIAQaAb' \ - 'fCvzQWrMMsYpLtdqRltXPqcSMXJIvlBzKoQnSwPFkapxGqnZCVFfKRLUIGBLOwhchWCdJbRuXbJrwTRNyA' \ - 'xDctszKjSnndaFkcBZmJZWjUeYMdevHhBJMBSShDqbjAuDGTTrSXZywYkmjCCEUZShGofaFpuespaZWLFN' \ - 'IsOqsIRLexWqTXsOaScgnsUKsJxiihwsCdBViEQBHQaOnLfBtQQShTYHFqrvpVFiiEFMcIFTrTkIBpGUf' \ - 'lwTvAzMUtmSQQZGHlmQKJndiAXbIzVkGSeuTSkyjIGsiWLALHUCsnQtiOtrbQOQunurZgHFiZjWtZCEXZC' \ - 'nZjLeMiFlxnPkqfJFbCfKCuUJmGYJZPpRBFNLkqigxFkrRAppYRXeSCBxbGvqHmlsSZMWSVQyzenWoGxy' \ - 'GPvbnhWHuXBqHFjvihuNGEEFsfnMXTfptvIOlhKhyYwxLnqOsBdGvnuyEZIheApQGOXWeXoLWiDQNJFaXi' \ - 'UWgsKQrDOeZoNlZNRvHnLgCmysUeKnVJXPFIzvdDyleXylnKBfLCjLHntltignbQoiQzTYwZAiRwycdlHfyHNGmkNqSwXUrxGC' +# Вывести символы в верхнем регистре, слева от которых находятся +# два символа в нижнем регистре, а справа два символа в верхнем регистре. +# Т.е. из строки +# "GAMkgAYEOmHBSQsSUHKvSfbmxULaysmNOGIPHpEMujalpPLNzRWXfwHQqwksrFeipEUlTLec" +# нужно получить список строк: ['AY', 'NOGI', 'P'] +# Решить задачу двумя способами: с помощью re и без. + +line_2 = 'mtMmEZUOmcqWiryMQhhTxqKdSTKCYEJlEZCsGAMkgAYEOmHBSQsSUHKvSfbmxULaysm'\ + 'NOGIPHpEMujalpPLNzRWXfwHQqwksrFeipEUlTLeclMwAoktKlfUBJHPsnawvjPhfgewV'\ + 'fzKTUfSYtBydXaVIpxWjNKgXANvIoumesCSSvjEGRJosUfuhRRDUuTQwLlJJJDdkVjfSA'\ + 'HqnLxooisBDWuxIhyjJaXDYwdoVPnsllMngNlmkpYOlqXEFIxPqqqgAWdJsOvqppOfyIV'\'jXapzGOrfinzzsNMtBIOclwbfRzytmDgEFUzxvZGkdOaQYLVBfsGSAfJMchgBWAsGnBnW'\'etekUTVuPluKRMQsdelzBgLzuwiimqkFKpyQRzOUyHkXRkdyIEBvTjdByCfkVIAQaAbfC'\'vzQWrMMsYpLtdqRltXPqcSMXJIvlBzKoQnSwPFkapxGqnZCVFfKRLUIGBLOwhchWCdJbR'\ + 'uXbJrwTRNyAxDctszKjSnndaFkcBZmJZWjUeYMdevHhBJMBSShDqbjAuDGTTrSXZywYkm'\ + 'jCCEUZShGofaFpuespaZWLFNIsOqsIRLexWqTXsOaScgnsUKsJxiihwsCdBViEQBHQaOn'\'LfBtQQShTYHFqrvpVFiiEFMcIFTrTkIBpGUflwTvAzMUtmSQQZGHlmQKJndiAXbIzVkGS'\'euTSkyjIGsiWLALHUCsnQtiOtrbQOQunurZgHFiZjWtZCEXZCnZjLeMiFlxnPkqfJFbCf'\'KCuUJmGYJZPpRBFNLkqigxFkrRAppYRXeSCBxbGvqHmlsSZMWSVQyzenWoGxyGPvbnhWH'\'uXBqHFjvihuNGEEFsfnMXTfptvIOlhKhyYwxLnqOsBdGvnuyEZIheApQGOXWeXoLWiDQN'\'JFaXiUWgsKQrDOeZoNlZNRvHnLgCmysUeKnVJXPFIzvdDyleXylnKBfLCjLHntltignbQ'\ + 'oiQzTYwZAiRwycdlHfyHNGmkNqSwXUrxGC' -# Задача-3: -# Напишите скрипт, заполняющий указанный файл (самостоятельно задайте имя файла) произвольными целыми -# числами, в результате в файле должно быть 2500-значное произвольное число. -# Найдите и выведите самую длинную последовательность одинаковых цифр в вышезаполненном файле. +# Задание-3: +# Напишите скрипт, заполняющий указанный файл (самостоятельно задайте имя файла) +# произвольными целыми цифрами, в результате в файле должно быть +# 2500-значное произвольное число. +# Найдите и выведите самую длинную последовательность одинаковых цифр +# в вышезаполненном файле. diff --git a/lesson06/home_work/data/hours_of b/lesson06/home_work/data/hours_of index a8138954e..7e3c12c36 100644 --- a/lesson06/home_work/data/hours_of +++ b/lesson06/home_work/data/hours_of @@ -1,7 +1,7 @@ Имя Фамилия Отработано часов -Перт Алексеев 120 +Петр Алексеев 120 Матвей Бурин 160 Василий Сидоров 122 Альберт Грибов 118 Василий Иванов 180 -Перт Дурин 80 \ No newline at end of file +Петр Дурин 80 \ No newline at end of file diff --git a/lesson06/home_work/data/workers b/lesson06/home_work/data/workers index b1a1b110c..78b2eaf09 100644 --- a/lesson06/home_work/data/workers +++ b/lesson06/home_work/data/workers @@ -1,7 +1,7 @@ Имя Фамилия Зарплата Должность Норма_часов -Перт Алексеев 22000 прораб 140 +Петр Алексеев 22000 прораб 140 Василий Иванов 18000 плотник 150 Матвей Бурин 42000 директор 150 Василий Сидоров 17500 плотник 140 -Перт Дурин 20000 разнорабочий 160 +Петр Дурин 20000 разнорабочий 160 Альберт Грибов 20000 разнорабочий 160 \ No newline at end of file diff --git a/lesson07/examples/4_interfaces!!!.py b/lesson07/examples/4_interfaces!!!.py deleted file mode 100644 index b8bfc3cf3..000000000 --- a/lesson07/examples/4_interfaces!!!.py +++ /dev/null @@ -1,6 +0,0 @@ -# ================================ -# Интерфейсы в действии -# ================================ - -# Тут будут примеры использования интерфейсов... - diff --git a/lesson07/examples/5_static_methods!!!.py b/lesson07/examples/5_static_methods!!!.py deleted file mode 100644 index e69de29bb..000000000 diff --git a/lesson07/examples/deco.py b/lesson07/examples/deco.py new file mode 100644 index 000000000..46c41702a --- /dev/null +++ b/lesson07/examples/deco.py @@ -0,0 +1,22 @@ +# coding: utf-8 +# === Декораторы === +# Применяются для расширения функционала классов и функций + +def log(func): + def decorated(*args, **kwargs): # <- функция, которая заменит собой декорируемую функцию + res = func(*args, **kwargs) # <- тут происходит вызов декорируемой функции + # а всё остальное - это как раз расширение функционала + print('{}({},{}) = {}'.format(func.__name__, args, kwargs, res)) + return res + + return decorated + + +@log # <- применение декоратора аналогично записи: my_sum = log(my_sum) +def my_sum(a, b): + res = a + b + return res + + +# print(my_sum(5,7)) +my_sum(5,7) \ No newline at end of file diff --git a/lesson07/examples/exceptions.py b/lesson07/examples/exceptions.py new file mode 100644 index 000000000..52a5ea822 --- /dev/null +++ b/lesson07/examples/exceptions.py @@ -0,0 +1,39 @@ +# coding: utf-8 + +import sys + +class BadNumber(Exception): + + def __init__(self, x): + self.x = x + + def __str__(self): + return '! **** Нехорошее число: {} ****'.format(self.x) + + + +f = open('numbers.txt') + +for line in f: + try: + x = int(line.strip()) + if x == 13: + raise BadNumber(x) + except ValueError: + print('Ошибка перевода числа в int') + sys.exit(13) + except BadNumber as bn: + print(bn) + + else: + print(x) + try: + y = 1000 / x + except ZeroDivisionError as z: + print(z) + else: + print(y) + finally: + print('Выходим из блока try') + + diff --git a/lesson07/examples/razminka.py b/lesson07/examples/razminka.py new file mode 100644 index 000000000..43f81b778 --- /dev/null +++ b/lesson07/examples/razminka.py @@ -0,0 +1,39 @@ +# coding: utf-8 + +# class BaseClass(): + # x = 1 + # y = 2 + + +# class ChildClass(BaseClass): + # x = 111 + # y = 222 + + # def mix(BaseClass): + # return BaseClass.y + + +# c = ChildClass() +# print(c.mix()) + +# x = 13 +# def func(): + # x = 1 + # class c: + # x = 2 + # print(x) + # y = input('y = ') + + # def m(self): + # print(x) + # i = c() + # i.m() + +# print(x) +# func() + + + + + + diff --git a/lesson07/home_work/hw0x_easy.py b/lesson07/home_work/hw0x_easy.py deleted file mode 100644 index e69de29bb..000000000 diff --git a/lesson07/home_work/hw0x_hard.py b/lesson07/home_work/hw0x_hard.py deleted file mode 100644 index e69de29bb..000000000 diff --git a/lesson07/home_work/hw0x_normal.py b/lesson07/home_work/hw0x_normal.py deleted file mode 100644 index e69de29bb..000000000 diff --git a/lesson07/home_work/loto.py b/lesson07/home_work/loto.py new file mode 100644 index 000000000..e30db8c3e --- /dev/null +++ b/lesson07/home_work/loto.py @@ -0,0 +1,58 @@ +#!/usr/bin/python3 + +"""Лото + +Правила игры в лото. + +Игра ведется с помощью специальных карточек, на которых отмечены числа, +и фишек (бочонков) с цифрами. + +Количество бочонков — 90 штук (с цифрами от 1 до 90). + +Каждая карточка содержит 3 строки по 9 клеток. В каждой строке по 5 случайных цифр, +расположенных по возрастанию. Все цифры в карточке уникальны. Пример карточки: + +-------------------------- + 9 43 62 74 90 + 2 27 75 78 82 + 41 56 63 76 86 +-------------------------- + +В игре 2 игрока: пользователь и компьютер. Каждому в начале выдается +случайная карточка. + +Каждый ход выбирается один случайный бочонок и выводится на экран. +Также выводятся карточка игрока и карточка компьютера. + +Пользователю предлагается зачеркнуть цифру на карточке или продолжить. +Если игрок выбрал "зачеркнуть": + Если цифра есть на карточке - она зачеркивается и игра продолжается. + Если цифры на карточке нет - игрок проигрывает и игра завершается. +Если игрок выбрал "продолжить": + Если цифра есть на карточке - игрок проигрывает и игра завершается. + Если цифры на карточке нет - игра продолжается. + +Побеждает тот, кто первый закроет все числа на своей карточке. + +Пример одного хода: + +Новый бочонок: 70 (осталось 76) +------ Ваша карточка ----- + 6 7 49 57 58 + 14 26 - 78 85 +23 33 38 48 71 +-------------------------- +-- Карточка компьютера --- + 7 87 - 14 11 + 16 49 55 88 77 + 15 20 - 76 - +-------------------------- +Зачеркнуть цифру? (y/n) + +Подсказка: каждый следующий случайный бочонок из мешка удобно получать +с помощью функции-генератора. + +Подсказка: для работы с псевдослучайными числами удобно использовать +модуль random: http://docs.python.org/3/library/random.html + +""" diff --git a/lesson08/examples/4_itertools.py b/lesson08/examples/4_itertools.py new file mode 100644 index 000000000..eb382c95e --- /dev/null +++ b/lesson08/examples/4_itertools.py @@ -0,0 +1,100 @@ +import itertools + +# -= бесконечные последовательности =- + +# itertools.count(start=0, step=1) +# возвращает бесконечный генератор, начиная от start с шагом step +for i in itertools.count(1, 2): + print(i) + if i > 100: + break + +# itertools.cycle(iterable) +# Бесконечно повторяет заданную последовательность: +tango = itertools.cycle([1, 2, 3]) +for i in range(100): + print(next(tango), end=' ') +print() + +# itertools.repeat(element, times=0) +# повторяет элемент, если times задано, то times раз + +lst = list(map(pow, range(10), itertools.repeat(2))) +print(lst) # [0, 1, 4, 9, 16, 25, 36, 49, 64, 81] + + +# -= контроль за итераторами =- + +# Возвращать пока.. +# itertools.takewhile(predicate, iterable) +# Создает итератор, возвращающий элементы из iterable до тех пор, пока +# predicate истинен +g = itertools.takewhile(lambda n: n<10, itertools.count()) +lst = [i for i in g] +print(lst) # [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] + +# Срезы +# itertools.islice(iterable, stop) +# itertools.islice(iterable, start, stop[, step]) +# cоздает итератор, который возвращает выбранные элементы из iterable +c = itertools.count() +lst = list(itertools.islice(c, 10)) +print(lst) # [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] + +c = itertools.count() +lst = list(itertools.islice(c, 4, 20, 2)) +print(lst) # [4, 6, 8, 10, 12, 14, 16, 18] + + +# -= операции с итераторами =- + +# Перестановки +# itertools.permutations(iterable, r=None) +# Возвращает список последовательностей из перестановок по r элементов +# из исходной последовательности +lst = list(itertools.permutations(['a','b','c'])) +print(lst) # [('a', 'b', 'c'), ('a', 'c', 'b'), ('b', 'a', 'c'), ('b', 'c', 'a'), ('c', 'a', 'b'), ('c', 'b', 'a')] + +# Комбинации +# itertools.combinations(iterable, r) +# возвращает список последовательностей по r элементов из исходной +lst = list(itertools.combinations('abc', 2)) +print(lst) # [('a', 'b'), ('a', 'c'), ('b', 'c')] +lst = list(itertools.combinations(['1','2','3','4'], 3)) +print(lst) #[('1', '2', '3'), ('1', '2', '4'), ('1', '3', '4'), ('2', '3', '4')] + +# Группировка +# itertools.groupby(iterable, key=None) +# создает итератор, возвращающий последовательность ключей и групп элементов +# из итератора. Последовательно перебирает итератор и создает новую группу +# каждый раз при изменении элемента. Возвращаемая группа сама является итератором +lst = [k for k, g in itertools.groupby('AAAABBBCCDAABBB')] +print(lst) # ['A', 'B', 'C', 'D', 'A', 'B'] + + +# itertools.chain(*iterables) +# создает итератор, возвращающий последовательно элементы +# из каждого переданного итератора: +def gen(): + import random + for i in range(random.randint(10,20)): + yield i + +for i in itertools.chain([1, 2, 3], ['a', 'b', 'c'], gen()): + print (i, end=" | ") +print() + + +# Произведение +# itertools.product(*iterables, repeat=1) +# Возвращает декартово произведение входящих итераторов +lst = itertools.product('ABCD', 'xy') +print(list(lst)) # [('A', 'x'), ('A', 'y'), ('B', 'x'), ('B', 'y'), ('C', 'x'), ('C', 'y'), ('D', 'x'), ('D', 'y')] + +lst = itertools.product(range(2), repeat=3) +print(list(lst)) # [(0, 0, 0), (0, 0, 1), (0, 1, 0), (0, 1, 1), (1, 0, 0), (1, 0, 1), (1, 1, 0), (1, 1, 1)] + +# product(A, repeat=4) <---> product(A, A, A, A). + + + diff --git a/lesson08/examples/5_collections.py b/lesson08/examples/5_collections.py new file mode 100644 index 000000000..c152a3f71 --- /dev/null +++ b/lesson08/examples/5_collections.py @@ -0,0 +1,151 @@ +import collections + +# -= Counter (Счетчик) =- + +# Создание +a = collections.Counter(['a', 'b', 'c', 'a', 'b', 'b']) +b = collections.Counter({'a':2, 'b':3, 'c':1}) +c = collections.Counter(a=2, b=3, c=1) +print(a==b==c) + +# Пополнение +c = collections.Counter(['a', 'b']) +print('Initial :', c) + +c.update('abcdaab') +print('Sequence:', c) + +c.update({'a':1, 'd':5}) +print('Dict :', c) + + +# Доступ +for key in sorted(c): + print(key, c[key]) + +# Counter не вызывает исключение KeyError для несуществующих элементов. +# Если значения нет - он возвращает 0. +print(c['e']) + +c.update({'f': -1}) + + +# most_common() возвращает n элементов с сортировкой по количеству +c = collections.Counter() +with open('alice.txt', 'rt') as f: + for line in f: + words = [s.strip(',.!?:;)\'"').lower() for s in line.split()] + c.update(words) + +for letter, count in c.most_common(5): + print ('%s: %7d' % (letter, count)) + + +# С Counter можно работать как с множествами +c1 = collections.Counter(['a', 'b', 'c', 'a', 'b', 'b']) +c2 = collections.Counter('alphabet') + +print('C1:', c1) +print('C2:', c2) + +print('\nКомбинирует счетчики:') +print(c1 + c2) + +print('\nВычитает счетчики:') +print(c1 - c2) + +print('\nПересечение (выбирает положительные минимумы):') +print(c1 & c2) + +print('\nОбъединение (выбирает максимум):') +print(c1 | c2) + + + + +# -= OrderedDict (Отсортированный словарь) =- +# Словарь, запоминающий положение своих элементов +# Если новый элемент перезаписывает существующий - позиция не меняется. +# Удаление элемента и его последующая вставка перемещает его в конец. +print ('\nOrderedDict:') +d = collections.OrderedDict() +d['a'] = 'A' +d['b'] = 'B' +d['c'] = 'C' +d['d'] = 'D' +d['e'] = 'E' + +for k, v in d.items(): + print (k, v) + +# При сравнении сортированнаго словаря учитывается положение элементов: +d1 = d.copy() +print('Equal:', d == d1) + +d1.move_to_end('c') +print('d1:', d1) + +print('Equal:', d == d1) + + + +# -= defaultdict (словарь со значением по умолчанию) =- +# collections.defaultdict([default_factory[, ...]]) +# Возвращает новый словареподобный объект, возвращающий по умолчанию результат +# функции default_factory + +s = [('yellow', 1), ('blue', 2), ('yellow', 3), ('blue', 4), ('red', 1)] +d = collections.defaultdict(list) +for k, v in s: + d[k].append(v) + +print(list(d.items())) + + + +# -= namedtuple (именованный кортеж) =- +# collections.namedtuple(typename, field_names, verbose=False, rename=False) +# field_names - строка, в которой имена полей идут через пробел и/или через +# запятую. Таккже можно использовать последовательность строк: ['x', 'y'] + +Point = collections.namedtuple('Point', ['x', 'y']) +p = Point(11, 22) +print(p) # Point(x=11, y=22) + +Person = collections.namedtuple('Person', 'name age gender') +p = Person('Bob', 40, 'male') +print(p) # Person(name='Bob', age=40, gender='male') + +params = ['Василий', 33, 'муж.'] +p = Person._make(params) +print(p) # Person(name='Василий', age=33, gender='муж.') + +# Возвращает элементы в виде сортированного словаря +print(p._asdict()) + +# Возвращает новый кортеж, в котором заменены значения +p = p._replace(name='Василиса', gender='жен.') +print(p) + +# _fields +# Возвращает кортеж имен полей +Color = collections.namedtuple('Color', 'red green blue') +Pixel = collections.namedtuple('Pixel', Point._fields + Color._fields) + +p = Pixel(10, 20, 100, 100, 100) +print(p) # Pixel(x=10, y=20, red=100, green=100, blue=100) + + + + + + + + + + + + + + + diff --git a/lesson08/examples/6_csv.py b/lesson08/examples/6_csv.py new file mode 100644 index 000000000..0dcfbf417 --- /dev/null +++ b/lesson08/examples/6_csv.py @@ -0,0 +1,69 @@ +import csv + +# -= Чтение =- + +# Создание диалекта +csv.register_dialect('excel-semicolon', delimiter=';') + +f = open('employees.csv', 'rt') +try: + reader = csv.reader(f, dialect="excel-semicolon") + for row in reader: + print(row) +finally: + f.close() + +# Авто определение диалекта файла +with open('employees.csv') as csvfile: + dialect = csv.Sniffer().sniff(csvfile.read(1024)) + csvfile.seek(0) + reader = csv.reader(csvfile, dialect) + for row in reader: + print(row) + +# Считывание в namedtuple +from collections import namedtuple +Employee = namedtuple('Employee', 'name, age, department, pay') + +with open('employees.csv') as csvfile: + for emp in map(Employee._make, csv.reader(csvfile, dialect)): + print(emp.name, emp.pay) + + +# Работа со словарями +# В качестве ключей используется первая строка +with open('employees_excel.csv', encoding='windows-1251') as csvfile: + reader = csv.DictReader(csvfile, dialect=dialect) + for row in reader: + print (row) + + + +# -= Запись =- + +encoding = 'windows-1251' +# encoding = 'utf-8' +with open('employees_out.csv', 'w', encoding=encoding) as csvfile: + writer = csv.writer(csvfile, dialect='excel-semicolon') + writer.writerow( ('Заголовок 1', 'Заголовок 2', 'Заголовок 3') ) + for i in range(10): + writer.writerow( ('строка %s' % (i+1), 2**i, '08/%02d/13' % (i+1)) ) + + +# Запись словарей +with open('employees_out.csv', 'w', encoding=encoding) as csvfile: + fieldnames = ('Заголовок 1', 'Заголовок 2', 'Заголовок 3') + writer = csv.DictWriter(csvfile, fieldnames=fieldnames, dialect='excel-semicolon') + headers = {name:name for name in fieldnames} + writer.writerow(headers) + for i in range(10): + data = dict(zip(fieldnames, ['строка %s' % (i+1), 2**i, '08/%02d/13' % (i+1)])) + writer.writerow(data) + + + + + + + + diff --git a/lesson08/examples/7_sqlite.py b/lesson08/examples/7_sqlite.py new file mode 100644 index 000000000..5dae91967 --- /dev/null +++ b/lesson08/examples/7_sqlite.py @@ -0,0 +1,63 @@ +# +import os +import sqlite3 +import datetime + +# Создание файла базы данных + +db_filename = 'todo.db' +conn = sqlite3.connect(db_filename) +conn.close() + + +# Создание схемы +# Схема определяет таблицы в базе данных + +os.remove(db_filename) +with sqlite3.connect(db_filename) as conn: + conn.execute(""" + create table project ( + name text primary key, + description text, + deadline date + ); + """) + + # Insert + for i in range(10): + conn.execute(""" + insert into project (name, description, deadline) VALUES (?,?,?)""", ( + 'project %s'%i, + 'project %s description'%i, + datetime.date.today()+datetime.timedelta(days=i**2) + ) + ) + +with sqlite3.connect(db_filename) as conn: + # Select + # Объекты connection имеют атрибут row_factory, который позволяет вызывать + # код, контролирующий тип объкта, создаваемого для каждой строки в запросе + # Объекты Row дают доступ к данным по индексу и имени + conn.row_factory = sqlite3.Row + + cur = conn.cursor() + cur.execute("select * from project") + for row in cur.fetchall(): + print(row) + name, description, deadline = row + print(name, description, deadline) + + # Update + cur.execute("update project set deadline=:deadline where name=:name", + {'deadline': '2013-09-15', 'name': 'project 0'}) + + + + + + + + + + + diff --git a/lesson08/examples/8_json.py b/lesson08/examples/8_json.py new file mode 100644 index 000000000..2168e47cb --- /dev/null +++ b/lesson08/examples/8_json.py @@ -0,0 +1,40 @@ +# -*- coding: utf-8 -*- +import json + +data = [{'a':'A', 'b':(2, 4), 'c':3.0 }] +print('DATA:', data) + +# Создание JSON из объекта +data_string = json.dumps(data) +print('JSON:', data_string) + +# Создание объекта из JSON +data2 = json.loads(data_string) +print('LOAD:', data2) + +# Сортировка +print('SORTED:', json.dumps(data, sort_keys=True)) + +# Форматирование с отступами +print('INDENT:', json.dumps(data, sort_keys=True, indent=4)) + +# Плотная упаковка +print('COMPRESSED:', json.dumps(data, separators=(',',':'))) + +# Формат JSON подразумевает, что ключами словаря являются строки +# Если у вас есть другие ключи — то вызовется исключение TypeError. +# Чтобы обойти это нужно использовать skipkeys + +data = [ { 'a':'A', 'b':(2, 4), 'c':3.0, ('d',):'D tuple' } ] +print (json.dumps(data, skipkeys=True)) + + + + + + + + + + + diff --git a/lesson08/home_work/app.id b/lesson08/home_work/app.id new file mode 100644 index 000000000..1abf6bafa --- /dev/null +++ b/lesson08/home_work/app.id @@ -0,0 +1 @@ +== тут будет ваш APPID для доступа к openweathermap.org == diff --git a/lesson08/home_work/export_openweather.py b/lesson08/home_work/export_openweather.py new file mode 100644 index 000000000..0ae937519 --- /dev/null +++ b/lesson08/home_work/export_openweather.py @@ -0,0 +1,24 @@ + +""" OpenWeatherMap (экспорт) + +Сделать скрипт, экспортирующий данные из базы данных погоды, +созданной скриптом openweather.py. Экспорт происходит в формате CSV или JSON. + +Скрипт запускается из командной строки и получает на входе: + export_openweather.py --csv filename [<город>] + export_openweather.py --json filename [<город>] + export_openweather.py --html filename [<город>] + +При выгрузке в html можно по коду погоды (weather.id) подтянуть +соответствующие картинки отсюда: http://openweathermap.org/weather-conditions + +Экспорт происходит в файл filename. + +Опционально можно задать в командной строке город. В этом случае +экспортируются только данные по указанному городу. Если города нет в базе - +выводится соответствующее сообщение. + +""" + +import csv +import json diff --git a/lesson08/home_work/hw0x_easy.py b/lesson08/home_work/hw0x_easy.py deleted file mode 100644 index e69de29bb..000000000 diff --git a/lesson08/home_work/hw0x_hard.py b/lesson08/home_work/hw0x_hard.py deleted file mode 100644 index e69de29bb..000000000 diff --git a/lesson08/home_work/hw0x_normal.py b/lesson08/home_work/hw0x_normal.py deleted file mode 100644 index e69de29bb..000000000 diff --git a/lesson08/home_work/openweather.py b/lesson08/home_work/openweather.py new file mode 100644 index 000000000..5b321286f --- /dev/null +++ b/lesson08/home_work/openweather.py @@ -0,0 +1,110 @@ + +""" OpenWeatherMap +OpenWeatherMap — онлайн-сервис, который предоставляет бесплатный API для доступа к данным о текущей погоде, прогнозам, для web-сервисов и мобильных приложений. Архивные данные доступны только на коммерческой основе. В качестве источника данных используются официальные метеорологические службы, данные из метеостанций аэропортов, и данные с частных метеостанций. + +Необходимо решить следующие задачи: + +== Получение APPID == + Чтобы получать данные о погоде необходимо получить бесплатный APPID. + + Предлагается 2 варианта (по желанию): + - получить APPID вручную + - автоматизировать процесс получения APPID, используя дополнительную библиотеку GRAB (pip install grab) + + Необходимо зарегистрироваться на сайте openweathermap.org: + https://home.openweathermap.org/users/sign_up + + Войти на сайт по ссылке: + https://home.openweathermap.org/users/sign_in + + Свой ключ вытащить со страницы отсюда: + https://home.openweathermap.org/api_keys + + Ключ имеет смысл сохранить в локальный файл, например, "app.id" + + +== Получение списка городов == + Список городов может быть получен по ссылке: http://bulk.openweathermap.org/sample/city.list.json.gz + + Далее снова есть несколько вариантов (по желанию): + - скачать и распаковать список вручную + - автоматизировать скачивание (ulrlib) и распаковку списка + (воспользоваться модулем 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 города. И тут как раз понадобится APPID. + By city ID + Examples of API calls: + http://api.openweathermap.org/data/2.5/weather?id=2172797&appid=b1b15e88fa797225412429c1c50c122a + + Для получения температуры по Цельсию: + http://api.openweathermap.org/data/2.5/weather?id=520068&units=metric&appid=b1b15e88fa797225412429c1c50c122a + + Для запроса по нескольким городам сразу: + http://api.openweathermap.org/data/2.5/group?id=524901,703448,2643743&units=metric&appid=b1b15e88fa797225412429c1c50c122a + + + Данные о погоде выдаются в 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} + + +== Сохранение данных в локальную БД == +Программа должна позволять: +1. Создавать файл базы данных SQLite с следующей структурой данных (если файла + базы данных не существует): + + Погода + id_города INTEGER PRIMARY KEY + Город VARCHAR(255) + Дата DATE + Температура INTEGER + id_погоды INTEGER # weather.id из JSON-данных + +2. Выводить список стран из файла и предлагать пользователю выбрать страну +(ввиду того, что список городов и стран весьма велик имеет смысл запрашивать у пользователя имя города или страны + и искать данные в списке доступных городов/стран (регуляркой)) + +3. Скачивать JSON (XML) файлы погоды в городах выбранной страны +4. Парсить последовательно каждый из файлов и добавлять данные о погоде в базу + данных. Если данные для данного города и данного дня есть в базе - обновить + температуру в существующей записи. + + +При повторном запуске скрипта: +- используется уже скачанный файл с городами +- используется созданная база данных, новые данные добавляются и обновляются + + + +При работе с XML-файлами: + +Доступ к данным в XML файлах происходит через пространство имен: +