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 4791e7930..03f8214c9 100644 --- a/README.md +++ b/README.md @@ -3,7 +3,7 @@ ## Оглавление ### Урок 1: Знакомство с python -1. Где используется питон? +1. Где используется Питон? 1. Сильные стороны языка 1. Установка и запуск интерпретатора python 1. Выполнение .py файлов из консоли @@ -21,7 +21,7 @@ 1. Форматирование строк 1. Списки (list) 1. Кортежи (tuple) -1. Последовательности (итераторы) обобщение +1. Последовательности (итераторы), обобщение 1. Обход последовательностей (цикл for in) 1. Словари (dict) 1. Множества (set) @@ -43,17 +43,17 @@ 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. Дополнительные возможности модулей 1. Модули os, sys -### Урок 6: Объектно Ориентированное Программирование +### Урок 6: Объектно-Ориентированное Программирование 1. Введение в ООП 1. Классы 1. Инкапсуляция @@ -72,9 +72,9 @@ 1. Паттерн Делегирование 1. Создание собственных исключений 1. Подведение итогов -1. Несколько слов о программа Python Advanced: - 1. Герераторы (yield) +1. Несколько слов о программе Python Advanced: + 1. Генераторы (yield) 1. Декораторы 1. Множественное наследование - 1. Много-поточные приложения + 1. Многопоточные приложения 1. Системные скрипты на python diff --git a/lesson01/examples/1_operation_instruction.py b/lesson01/examples/1_operation_instruction.py index a138a6dff..454d7e40a 100644 --- a/lesson01/examples/1_operation_instruction.py +++ b/lesson01/examples/1_operation_instruction.py @@ -9,14 +9,14 @@ print('9/3 = ', 9 / 3) # операция деления в python3 всегда возвращает дробный результат print('(60-2*4)/2 = ', (60-2*4)/2) -# целочисленное деление -print('6//5 = ', 6 // 5) # вернет 1 +# Целочисленное деление +print('6//5 = ', 6 // 5) # вернет 1 print('6.0//5 = ', 6.0 // 5) # вернет float 1.0 # Остаток от деления print('7%2 = ', 7 % 2) # вернет остаток от деления -print(2 ** 4) # возведение в степень +print(2 ** 4) # возведение в степень print((2+3j)**2) # комплексные числа @@ -30,13 +30,14 @@ print(4 / 2) print(6 - 4) -# Унарные операции +# Унарные операции (один операнд) a = -5 print(-a) # меняет знак на противоположный print(not True) # инвертор. True --> False, False --> True # !Инструкции говорят интерпретатору что нужно сделать, но НЕ возвращают результата -n = 12 # присваивание в Python это инструкция +n = 12 # присваивание в Python - это инструкция + # Инструкции Не допускаются там, где python ожидает значение # 2 + n = 4 <-- ошибка diff --git a/lesson01/examples/2_variables.py b/lesson01/examples/2_variables.py index 8fc6bc6c4..f856cfc8e 100644 --- a/lesson01/examples/2_variables.py +++ b/lesson01/examples/2_variables.py @@ -2,10 +2,10 @@ # Переменные и типы данных # ================================= -# Переменые используются для хранения данных в программе +# Переменные используются для хранения данных в программе # Требования к имени переменных: -# 1. Имя переменной может содержать a-z, A-Z, 0-9, _ (сомвол нижнего подчеркивания) +# 1. Имя переменной может содержать a-z, A-Z, 0-9, _ (символ нижнего подчеркивания) # 2. Имя переменной не может начинаться с цифры # 3. Не рекомендуется использовать зарезервированные слова и имена встроенных функций # в качестве имени переменной @@ -13,13 +13,13 @@ # type() - позволяет узнать тип данных, хранящихся в переменной x = 10 # int print('type(10) -> ', type(x)) -# python язык с динамической типизацией. Переменная может указывать на объекты различных типов. +# python - язык с динамической типизацией. Переменная может указывать на объекты различных типов. x = -2.4 # float print('type(-2.4) -> ', type(x)) # print(X) <-- ошибка # Нельзя использовать переменную прежде чем ей будет присвоено значение -# x и X - разные переменные, python регистрочувствительный +# x и X - разные переменные, python - регистрочувствительный x += 1 # краткая запись выражения: x = x + 1 print('x = ', x) @@ -56,8 +56,3 @@ # None равен только себе и никакому другому типу print(None == None) - - - - - diff --git a/lesson01/examples/3_input_output.py b/lesson01/examples/3_input_output.py index add84fff3..e51618e38 100644 --- a/lesson01/examples/3_input_output.py +++ b/lesson01/examples/3_input_output.py @@ -8,6 +8,7 @@ print('Приветствую,', name) # input() - запросить ввод с клавиатуры +# raw_input() - для Python 2.x name = input('Введите ваше имя: ') print('Приятно познакомиться,', name) diff --git a/lesson01/examples/4_logic.py b/lesson01/examples/4_logic.py index 91a4be899..05fc793f4 100644 --- a/lesson01/examples/4_logic.py +++ b/lesson01/examples/4_logic.py @@ -8,19 +8,19 @@ x = True y = False print('bool --> ', x, '/', y) -print("1 + True = ", 1 + True) # True по сути и есть 1 +print("1 + True = ", 1 + True) # True, по сути, и есть 1 # Логические опараторы # > Больше # < Меньше # == Равно # != Не равно -# >= Больше или раво +# >= Больше или равно # <= Меньше или равно print("5 > 6 -->", 5 > 6) print("2 != 7 -->", 2 != 7) -# Любое значение может быть преобразовано с логическому типу функией bool() +# Любое значение может быть преобразовано к логическому типу функией bool() print("bool(0) -->", bool(0)) print("bool(-1) -->", bool(-1)) print("bool('') -->", bool("")) diff --git a/lesson01/examples/5_if_else.py b/lesson01/examples/5_if_else.py index 76f42959e..dfb4dbcbd 100644 --- a/lesson01/examples/5_if_else.py +++ b/lesson01/examples/5_if_else.py @@ -2,7 +2,7 @@ # Логические выражения и ветвление # ================================= -# Результат любого логического выражения либо "Ложь" (False) либо "Истина" (True) +# Результат любого логического выражения либо "Ложь" (False), либо "Истина" (True) # Логические операторы >(больше) <(меньше) ==(равно) !=(не равно) >=(Больше или равно) <=(меньше или равно) print('2 > 4 --> ', 2 > 4) @@ -13,17 +13,17 @@ print('2 < 0 < 10 -->', 2 < 0 < 10) # Операторы and(и), or(или), not(не) -print('2 > 0 and 2 > 10 -->', 2 > 0 and 2 > 10) # True если оба выражения True -print('2 > 0 or 2 > 10 -->', 2 > 0 or 2 > 10) # True если любое выражение True +print('2 > 0 and 2 > 10 -->', 2 > 0 and 2 > 10) # True, если оба выражения True +print('2 > 0 or 2 > 10 -->', 2 > 0 or 2 > 10) # True, если любое выражение True print('not(2 > 0) -->', not(2 > 0)) # инвертор - меняет результат на противоположный # Операторы ветвления age = 12 if age >= 18: - print('Пользователь совершеннолтний') + print('Пользователь совершеннолетний') access = True # доступ куда-либо else: - print('Пользователь НЕсовершеннолтний') + print('Пользователь НЕсовершеннолетний') access = False # доступ куда-либо # if <логическое выражение>: @@ -31,7 +31,7 @@ # блок if # блок if -# !!!В языке python операторными скобками(отделяющими блоки) являются ОДИНАКОВЫЕ оступы слева +# !!!В языке python операторными скобками (отделяющими блоки) являются ОДИНАКОВЫЕ оступы слева # После инструкции if может находиться любое значение, которое будет автоматически преобразовано к типу bool if 2 + 2 - 8: @@ -56,11 +56,11 @@ if color == 'blue': print('синий') -elif color == 'red': # elif сокращение от else if(иначе если) +elif color == 'red': # elif сокращение от else if (иначе если) print('красный') elif color == 'green': print('зеленый') -else: # else выполняется только если все предыдущие проверки вернули False +else: # else выполняется, только если все предыдущие проверки вернули False print('неизвестный цвет') # Допускается вкладывать инструкции друг в друга: @@ -69,7 +69,7 @@ if n < 50: print('n больше нуля, но меньше 50') # !Но старайтесь избегать вложения, чем больше уровень вложенности, тем сложнее читать ваш код -# Предыдцщий код лучше переписать так: +# Предыдущий код лучше переписать так: if n > 0 and n < 50: print('n больше нуля, но меньше 50') # Или так: diff --git a/lesson01/examples/6_cycle_while.py b/lesson01/examples/6_cycle_while.py index e2460115a..f05078659 100644 --- a/lesson01/examples/6_cycle_while.py +++ b/lesson01/examples/6_cycle_while.py @@ -15,7 +15,7 @@ # тело цикла # Тело цикла будет повторяться до тех пор, пока выражение после while --> True -# Как только выражение --> False работа цикла прекращается +# Как только выражение --> False, работа цикла прекращается # while True: # Бесконечный цикл # pass # Инструкция заглушка, ставится там, где вы планируете дописать код позднее diff --git a/lesson01/home_work/hw01_easy.py b/lesson01/home_work/hw01_easy.py index d662da7a1..f927b0b06 100644 --- a/lesson01/home_work/hw01_easy.py +++ b/lesson01/home_work/hw01_easy.py @@ -1,10 +1,24 @@ -# Задача-1: Дано произвольное целое число, вывести поочередно цифры исходного числа + +__author__ = 'Ваши Ф.И.О.' + +# Задача-1: Дано произвольное целое число (число заранее неизвестно). +# Вывести поочередно цифры исходного числа (порядок вывода цифр неважен). +# Подсказки: +# * постарайтесь решить задачу с применением арифметики и цикла while; +# * при желании решите задачу с применением цикла for. # код пишем тут... + # Задача-2: Исходные значения двух переменных запросить у пользователя. # Поменять значения переменных местами. Вывести новые значения на экран. -# Не нужно решать задачу так: print("a = ", b, "b = ", a) - это неправильное решение! +# Подсказка: +# * постарайтесь сделать решение через дополнительную переменную +# или через арифметические действия +# Не нужно решать задачу так: +# print("a = ", b, "b = ", a) - это неправильное решение! + -# Задача-3: Запросите у пользователя год рождения. Если ему есть 18 лет, выведите: "Доступ разрешени", +# Задача-3: Запросите у пользователя его возраст. +# Если ему есть 18 лет, выведите: "Доступ разрешен", # иначе "Извините, пользование данным ресурсом только с 18 лет" diff --git a/lesson01/home_work/hw01_hard.py b/lesson01/home_work/hw01_hard.py index cc8eb525b..7df268664 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, если точно известно что её значение не изменялось? + +# Вопрос: Чему была равна переменная a, +# если точно известно, что её значение не изменялось? + +# Подсказка: это значение точно есть ;) diff --git a/lesson01/home_work/hw01_normal.py b/lesson01/home_work/hw01_normal.py index b46c55e58..991724e9a 100644 --- a/lesson01/home_work/hw01_normal.py +++ b/lesson01/home_work/hw01_normal.py @@ -1,11 +1,27 @@ -# Задача-1: Дано произвольное целое число, вывести самую большую цифру этого числа + +__author__ = 'Ваши Ф.И.О.' + +# Задача-1: Дано произвольное целое число, вывести самую большую цифру этого числа. +# Например, дается x = 58375. +# Нужно вывести максимальную цифру в данном числе, т.е. 8. +# Подразумевается, что мы не знаем это число заранее. +# Число приходит в виде целого беззнакового. +# Подсказки: +# * постарайтесь решить задачу с применением арифметики и цикла while; +# * при желании и понимании решите задачу с применением цикла for. # Задача-2: Исходные значения двух переменных запросить у пользователя. # Поменять значения переменных местами. Вывести новые значения на экран. -# Решите задачу используя только две переменные +# Решите задачу, используя только две переменные. +# Подсказки: +# * постарайтесь сделать решение через действия над числами; +# * при желании и понимании воспользуйтесь синтаксисом кортежей Python. + -# Задача-3: Напишите программу, вычисляющую корни квадратного уравнения вида ax2 + bx + c = 0. -# Для вычисления квадратного корня воспользуйтесь функицй sqrt() молудя math +# Задача-3: Напишите программу, вычисляющую корни квадратного уравнения вида +# ax² + bx + c = 0. +# Коэффициенты уравнения вводятся пользователем. +# Для вычисления квадратного корня воспользуйтесь функцией sqrt() модуля math: # import math # math.sqrt(4) - вычисляет корень числа 4 diff --git a/lesson02/examples/1_strings.py b/lesson02/examples/1_strings.py index fb766aab2..b65e0d091 100644 --- a/lesson02/examples/1_strings.py +++ b/lesson02/examples/1_strings.py @@ -10,6 +10,7 @@ # Многострочные строки s3 = '''Lorem ipsum dolor sit amet''' + print("-"*10) # Операция мультипликация - дублирование строки print(s3) print("-"*10) # Добавил для улучшения читабельности вывода @@ -29,15 +30,15 @@ print("*******Операции со строками********") # 1. Строки можно складывать: print('Hello' + ' ' + 'world') -# 2. Если строки идут друг за другом, + можно опустить (конкатенация строк прозойдет автоматически): +# 2. Если строки идут друг за другом, + можно опустить (конкатенация строк произойдет автоматически): print('Hello' ' ' 'world') # 3. Строки повторять операцией *: print('Hey! ' * 3) -string = 'произвольна строка' +string = 'произвольная строка' print('string = ', string) # 4. Получение символа строки по индексу: -# Все элементы строки нумеруются порядковыми индексами (первый индекс НОЛЬ): +# Все элементы строки нумеруются порядковыми индексами (первый индекс - НОЛЬ): print('string[1] --> ', string[1]) # 5. Срезы @@ -73,7 +74,7 @@ # 6. Срезы с шагом print('string[:12:2] -->', string[:12:2]) # Получаем каждый второй символ для указанного среза -print('string[::-1] -->', string[::-1]) # Переворачиваем строку задом наперед +print('string[::-1] -->', string[::-1]) # Переворачиваем строку задом наперед # 7. Длина строки: print(len(s)) @@ -84,7 +85,7 @@ # Пока воспринимайте метод как функцию, принимающую значение перед точкой в качестве первого аргумента # 'hello'.upper() воспринимайте как upper('hello') -# Методы строк всегда возвращат новую строку, не изменяя исходную, т.к. строка неизменяемая +# Методы строк всегда возвращают новую строку, не изменяя исходную, т.к. строка неизменяемая print("'иван'.title() -->", 'иван'.title()) print("'python'.upper() -->", 'python'.upper()) print("'трололошка'.find('ло') -->", 'трололошка'.find('ло', 4)) # индекс искомой подстроки (первое вхождение) diff --git a/lesson02/examples/2_string_format.py b/lesson02/examples/2_string_format.py index df0ec4a24..1d25413d8 100644 --- a/lesson02/examples/2_string_format.py +++ b/lesson02/examples/2_string_format.py @@ -10,7 +10,7 @@ # Старый способ форматирования print('Welcome, %s %s, to our conference' % (name, surname)) -# Более новый и гибкий метод +# Более новый и гибкий метод print('Welcome, {} {}, to our conference'.format(name, surname)) print('Welcome, {1} {0}, to our conference'.format(name, surname)) diff --git a/lesson02/examples/3_list.py b/lesson02/examples/3_list.py index 3a14ebe6a..d0937b77e 100644 --- a/lesson02/examples/3_list.py +++ b/lesson02/examples/3_list.py @@ -7,15 +7,15 @@ my_list = [1, 3, 5, 3.45, 'ddd', 's', 333] print('my_list = ', my_list) -# Т.к. список является последовательностью, с ним можно выполнять те же операции что и со срокой: +# Т.к. список является последовательностью, с ним можно выполнять те же операции что и со строкой: # Получение элемента по индексу -print(my_list[0]) # получим первый элемент списка +print(my_list[0]) # получим первый элемент списка print(my_list[-1]) # последний элемент списка # Срезы print(my_list[0:-3]) # 3 последних элемента списка # Конкатенация print(my_list[0:3] + [7, 8, 9]) # получим новый список из 6 элементов -# Мультиликация +# Мультипликация print([3, '4'] * 3) # размножим список # В отличие от строк, элементы списка можно изменять: diff --git a/lesson02/examples/4_tuple.py b/lesson02/examples/4_tuple.py index a78dafacb..3add5366e 100644 --- a/lesson02/examples/4_tuple.py +++ b/lesson02/examples/4_tuple.py @@ -6,13 +6,13 @@ empty_tuple = () # Пустой кортеж my_tuple = (1, 4, 'Hello', [1, 2, 5], 1.5) -my_tuple_2 = 2, 4, 6 # Так тоже кортеж +my_tuple_2 = 2, 4, 6 # Так - тоже кортеж -# Кортеж созжают не скобки, а наличие запятых +# Кортеж создают не скобки, а наличие запятых tup1 = (4) # Так получится Int print("type(tup1) --> ", type(tup1)) -tup2 = 2, 4 # А так кортеж +tup2 = 2, 4 # А так - кортеж print("type(tup2) --> ", type(tup2)) # Изменить элементы кортежа нельзя 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/examples/6_for_in.py b/lesson02/examples/6_for_in.py index d7759982e..57c6b09db 100644 --- a/lesson02/examples/6_for_in.py +++ b/lesson02/examples/6_for_in.py @@ -10,7 +10,7 @@ i += 1 # Для поочередного перебора элементов ЛЮБОЙ последовательности в Python есть специальный цикл -for fruit in fruits: # переменная fruit при каждой итерации(полном обороте) цикла присваиваются элементы поочереди +for fruit in fruits: # переменной fruit при каждой итерации(полном обороте) цикла присваиваются элементы поочереди print('fruit = ', fruit) print() # Просто пустая строка, для удобства чтения вывода diff --git a/lesson02/examples/7_dict.py b/lesson02/examples/7_dict.py index 9a7485880..f8a728033 100644 --- a/lesson02/examples/7_dict.py +++ b/lesson02/examples/7_dict.py @@ -25,7 +25,7 @@ f = dict.fromkeys(['a', 'b', 'c'], 'initial') print('f = ', f) -# создание словаря с помощью генератора: +# Создание словаря с помощью генератора: g = {i: i ** 2 for i in range(10)} print('g = ', g) @@ -35,17 +35,17 @@ f['b'] = 'spam' f['d'] = 'eggs' print('f_change = ', f) -# f['from'] # обращение к несуществующему ключу вызовет исключение +# f['from'] # обращение к несуществующему ключу вызовет исключение -# удаление элемента +# Удаление элемента del f['d'] # Операции со словарями -# кол-во элементов +# Кол-во элементов print('len(f) --> ', len(f)) -# проверим, есть ли данный ключ +# Проверим, есть ли данный ключ if 'a' in f: print("a in f") @@ -57,7 +57,7 @@ print("f.get('d', 'eggs') -->", f.get('d', 'eggs')) -# цикл по словарю +# Цикл по словарю for key, value in f.items(): print(key, value) @@ -67,24 +67,24 @@ for value in f.values(): print(value) -# удаляет элемент c и возвращает его значение +# Удаляет элемент c и возвращает его значение print(f.pop('c')) print(f) -# удаляет и возвращает пару (ключ, значение) +# Удаляет и возвращает пару (ключ, значение) print(f.popitem()) print(f.setdefault('x', 'spam')) print(f) -# вывод отсортированных по ключу пар ключ/значение +# Вывод отсортированных по ключу пар ключ/значение d = {'a': 'alpfa', 'b': 'beta', 'g': 'gamma'} print(dict) for key in sorted(d.keys()): print(key, d[key]) -# вывод пар ключ/значение отсортированных по значению +# Вывод пар ключ/значение, отсортированных по значению d = {'one': 10, 'more': 5, 'thing': 11} d = sorted(d.items(), key=lambda x: x[-1]) for key, value in d: diff --git a/lesson02/home_work/hw02_easy.py b/lesson02/home_work/hw02_easy.py index eec707139..ed4447e50 100644 --- a/lesson02/home_work/hw02_easy.py +++ b/lesson02/home_work/hw02_easy.py @@ -1,5 +1,8 @@ # Задача-1: -# Дан список фруктов. Напишите программу, выводящую фрукты в виде нумерованного списка выровненного по правой сторне +# Дан список фруктов. +# Напишите программу, выводящую фрукты в виде нумерованного списка, +# выровненного по правой стороне. + # Пример: # Дано: ["яблоко", "банан", "киви", "арбуз"] # Вывод: @@ -8,11 +11,15 @@ # 3. киви # 4. арбуз -# Подсказка: использует метод .format() +# Подсказка: воспользоваться методом .format() + # Задача-2: -# Даны два произвольные списка. Удалите из первого списка элементы присутствующие во втором списке +# Даны два произвольные списка. +# Удалите из первого списка элементы, присутствующие во втором списке. + # Задача-3: -# Дан произвольный список из целых чисел. Получите НОВЫЙ список из элементов исходного выполнив следующие условия: -# если элемент кратный двум, то разделить его на 4, если не кратен, то умножить на два. +# Дан произвольный список из целых чисел. +# Получите НОВЫЙ список из элементов исходного, выполнив следующие условия: +# если элемент кратен двум, то разделить его на 4, если не кратен, то умножить на два. diff --git a/lesson02/home_work/hw02_hard.py b/lesson02/home_work/hw02_hard.py index 090c09e6d..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', проверить корректно ли введена дата -# Условия коррекности: -# 1. День должен приводиться к целому числу в диапазоне от 1 до 30(31) (в зависимости от месяца, февраль не учитываем) + +# Задание-2: Дата задана в виде строки формата 'dd.mm.yyyy'. +# Проверить, корректно ли введена дата. +# Условия корректности: +# 1. День должен приводиться к целому числу в диапазоне от 1 до 30(31) +# (в зависимости от месяца, февраль не учитываем) # 2. Месяц должен приводиться к целому числу в диапазоне от 1 до 12 -# 3. Год приводиться к целому положитеьному числу в диапазоне от 1 до 9999 -# 4. Длина исходной строки для частей должна быть в соответствии с форматом (т.е. 2 - для дня, 2- месяц, 4 -год) +# 3. Год должен приводиться к целому положительному числу в диапазоне от 1 до 9999 +# 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 9b22d6ae5..3acfaabb6 100644 --- a/lesson02/home_work/hw02_normal.py +++ b/lesson02/home_work/hw02_normal.py @@ -1,16 +1,25 @@ # Задача-1: -# Дан список заполненный произвольными целыми числами, получите новый список элементами которого будут -# квадратные корни элементов исходного списка, но только если результаты извлечения корня не имеют десятичной части и +# Дан список, заполненный произвольными целыми числами, получите новый список, +# элементами которого будут квадратные корни элементов исходного списка, +# но только если результаты извлечения корня не имеют десятичной части и # если такой корень вообще можно извлечь # Пример: Дано: [2, -5, 8, 9, -25, 25, 4] Результат: [3, 5, 2] + # Задача-2: Дана дата в формате dd.mm.yyyy, например: 02.11.2013. # Ваша задача вывести дату в текстовом виде, например: второе ноября 2013 года. # Склонением пренебречь (2000 года, 2010 года) -# Задача-3: Напишите алгоритм заполняющий список произвольными целыми числами в диапазоне от -100 до 100 -# В списке должно быть n - элементов -# Подсказка: для получения случайного числа изпользуйте функцию randint() модуля random -# Задача-4: Дан список заполненный произвольными целыми числами -# Получите новый список, элементами которого будут только уникальные элементы исходного +# Задача-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] diff --git a/lesson03/examples/2+_func.py b/lesson03/examples/2+_func.py index 40212ea74..a58c188d5 100644 --- a/lesson03/examples/2+_func.py +++ b/lesson03/examples/2+_func.py @@ -2,19 +2,19 @@ # Функции # ==================== -# Функции - фрагмент программного кода(подпрограмма), к которому можно обратиться из другого места программы +# Функции - фрагмент программного кода (подпрограмма), к которому можно обратиться из другого места программы -def test(str1, str2): # Объявления функции (в скобочках параметры функции) +def test(str1, str2): # Объявление функции (в скобочках - параметры функции) """ Возвращает сумму аргументов """ return "{}/{}".format(str1, str2) # Возвращаемое значение - # Если фнкция ничего не возвращает, она возвращает спец.тип None + # Если функция ничего не возвращает, она возвращает спец.тип None result = test('Hello', 'Ivan') -# test("Hello") <-- ошибка, т.к. ожидается два аргумента, передан один +# test("Hello") <-- ошибка, т.к. ожидается два аргумента, а передан один print(result) z = 15 @@ -29,7 +29,7 @@ def local(x): local(5) -# Когда интерпретатор встречает инструкцию def test - создается переменная test с указателем на объект-функцию +# Когда интерпретатор встречает инструкцию def test - создается переменная test с указателем на объект-функцию, # поэтому функции можно объявлять внутри других инструкций и даже в других функциях access = True if access: diff --git a/lesson03/examples/2.1_scope.py b/lesson03/examples/2.1_scope.py index 51a0a11a0..1f65cc57c 100644 --- a/lesson03/examples/2.1_scope.py +++ b/lesson03/examples/2.1_scope.py @@ -6,12 +6,12 @@ # В python есть 4 области видимости: # 1/ Локальная # 2/ Объемлющей функции -# 3/ Глобальная(модуля) -# 4/ Встроенная(builtins) +# 3/ Глобальная (модуля) +# 4/ Встроенная (builtins) -# Поиск переменной происходит поочередно с 1 по 4 +# Поиск переменной происходит поочередно с 1 по 4 область -x = 5 # Глобальная переменная - доступна в любом месте данного модуля(файла) +x = 5 # Глобальная переменная - доступна в любом месте данного модуля (файла) def outside(): diff --git a/lesson03/examples/2.2_lambda.py b/lesson03/examples/2.2_lambda.py index 231c1a5f6..727eeaa6e 100644 --- a/lesson03/examples/2.2_lambda.py +++ b/lesson03/examples/2.2_lambda.py @@ -11,7 +11,7 @@ def mult(x): # Используя эту переменную, можно вызвать функцию print(a(4)) # тоже, что и print(mult(4)) -f = lambda x: x ** 2 # в переменную f будет сохранена ссылка на объект-функции +f = lambda x: x ** 2 # в переменную f будет сохранена ссылка на объект-функцию # Суть в том, что инструкция lambda возвращает ссылку на функцию print(f(4)) diff --git a/lesson03/examples/2.3_func_part2.py b/lesson03/examples/2.3_func_part2.py index ae17b85b6..b4ccfd520 100644 --- a/lesson03/examples/2.3_func_part2.py +++ b/lesson03/examples/2.3_func_part2.py @@ -3,7 +3,7 @@ # ==================== # Уточню! Чтобы не было путаницы... -# переменные в которые функция получает значения - ПАРАМЕТРЫ, +# переменные, в которые функция получает значения - ПАРАМЕТРЫ, # значения, которые передаются в функцию - АРГУМЕНТЫ: # def func(param1, param2, ...): @@ -16,7 +16,7 @@ def test1(*args): # *args - принимает любое кол-во аргументов в виде кортежа print(args) -# функцию можно вызвать с любым кол-вом аргументов +# Функцию можно вызвать с любым кол-вом аргументов test1() test1(1, 2, 3) test1(1, 2, 3, 5, 8) @@ -41,12 +41,13 @@ def test3(*args, **kwargs): # kwargs - принимает все именова test3(1, 2, 3, 4, a=5, b=6, c=12) -def test4(a, b, c, *, d, e, f): # a,b,c - позиционные, d,e,f - именованные(без значений по умолчанию) +def test4(a, b, c, *, d, e, f): # a,b,c - позиционные, d,e,f - именованные (без значений по умолчанию) print(a, b, c, d, e, f) test4(1, 2, 3, d=4, e=5, f=6) # test4(1, 2, 3, 4, 5, 6) # <-- ошибка + if __name__ == "__main__": - # все что написано тут, не будет импорировано, при импорте данного модуля в другой + # все, что написано тут, не будет выполнено при импорте данного модуля в другой pass diff --git a/lesson03/examples/2.4_inside_func_p2.py b/lesson03/examples/2.4_inside_func_p2.py index 3da7f440e..9e1c75ee6 100644 --- a/lesson03/examples/2.4_inside_func_p2.py +++ b/lesson03/examples/2.4_inside_func_p2.py @@ -2,13 +2,13 @@ # Встроенные функции часть-2 # ================================ -# map(func_link, <итератор>) --> итератор, каждый которого результат применение функции funk_link к -# элементам исходного итератора +# map(func_link, <итератор>) --> итератор, +# каждый элемент которого - результат применения функции funk_link к элементам исходного итератора print(list(map(len, ['mother', 'father', 'daughter', 'son']))) print(list(map(lambda x: x / 2, [2, 4, 5, 10]))) -# lambda - лямбда-функция(безымянная функция). Подробнее на следующем вебинаре +# lambda - лямбда-функция (безымянная функция). Подробнее на следующем вебинаре -# filter(filter_func, <итератоор>) --> итератор с отфильтровыванием элементов функцией filter_func +# filter(filter_func, <итератор>) --> итератор с отфильтровыванием элементов функцией filter_func print(list(filter(lambda x: x > 5, [2, 10, -10, 8, 2, 0, 14]))) -# Отбрасываем все элементы долиной НОЛЬ +# Отбрасываем все элементы длиной НОЛЬ print(list(filter(len, ['', 'not null', 'bla', '', '10']))) diff --git a/lesson03/examples/3+_file.py b/lesson03/examples/3+_file.py index 5db4863b5..c0e3a0499 100644 --- a/lesson03/examples/3+_file.py +++ b/lesson03/examples/3+_file.py @@ -4,14 +4,14 @@ import os path = 'files/text.txt' # не самый хороший способ задания пути -path = os.path.join('files', 'text.txt') # хороший кросплатформенный метод указани пути +path = os.path.join('files', 'text.txt') # хороший кроссплатформенный метод указания пути f = open(path, 'r', encoding='UTF-8') print(f.readlines()) # Считываем всю информацию из файла в виде списка строк f.close() # Наиболее правильный способ работы с файлами -# По окончанию инструкции with файл гарантировано будет закрыт, даже если произойдет ошибка +# По окончанию инструкции with файл гарантированно будет закрыт, даже если произойдет ошибка with open(path, 'r', encoding='UTF-8') as f: print(f.readlines()) diff --git a/lesson03/examples/3.1_file_pickle.py b/lesson03/examples/3.1_file_pickle.py index e16c49b9f..2be79a223 100644 --- a/lesson03/examples/3.1_file_pickle.py +++ b/lesson03/examples/3.1_file_pickle.py @@ -15,4 +15,4 @@ print(read_data) print(read_data[0]) -# При помощи модуля pickle можно сохранять любые python объекты +# При помощи модуля pickle можно сохранять любые python-объекты diff --git a/lesson03/examples/3.2_file_json.py b/lesson03/examples/3.2_file_json.py index be207159b..305a9ac8c 100644 --- a/lesson03/examples/3.2_file_json.py +++ b/lesson03/examples/3.2_file_json.py @@ -9,7 +9,7 @@ json.dump(python_data, f, ensure_ascii=False) # ensure_ascii=False - чтобы некирилические символы не были преобразованы к unicode-последовательности -# Читаем JSON их файла и преобразуем к типу Python +# Читаем JSON из файла и преобразуем к типу Python with open(os.path.join(DIR, 'save_json_data.json'), 'r', encoding='UTF-8') as f: read_data = json.load(f) 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_easy.py b/lesson03/home_work/hw03_easy.py index bf9beee40..63d13f646 100644 --- a/lesson03/home_work/hw03_easy.py +++ b/lesson03/home_work/hw03_easy.py @@ -1,22 +1,28 @@ # Задание-1: -# Напишите функцию округлящую полученное произвольное десятичное число, -# до кол-ва знаков (кол-во знаков передается вторым аргументом) +# Напишите функцию, округляющую полученное произвольное десятичное число +# до кол-ва знаков (кол-во знаков передается вторым аргументом). # Округление должно происходить по математическим правилам (0.6 --> 1, 0.4 --> 0). -# Для решения задачи не используйте встроенные и функции и функции из модуля math - +# Для решения задачи не используйте встроенные функции и функции из модуля math. def my_round(number, ndigits): pass -my_round(2.1234567, 5) + +print(my_round(2.1234567, 5)) +print(my_round(2.1999967, 5)) +print(my_round(2.9999967, 5)) + # Задание-2: -# Дан шестизначный номер билета, определить является ли билет счасливым -# Решение реализовать в виде функции -# Билет считается счастливым, если сумма его первых и последних цифр равны +# Дан шестизначный номер билета. Определить, является ли билет счастливым. +# Решение реализовать в виде функции. +# Билет считается счастливым, если сумма его первых и последних цифр равны. # !!!P.S.: функция не должна НИЧЕГО print'ить - def lucky_ticket(ticket_number): pass + +print(lucky_ticket(123006)) +print(lucky_ticket(12321)) +print(lucky_ticket(436751)) diff --git a/lesson03/home_work/hw03_hard.py b/lesson03/home_work/hw03_hard.py index 71df44dc0..a8c7f668a 100644 --- a/lesson03/home_work/hw03_hard.py +++ b/lesson03/home_work/hw03_hard.py @@ -1,31 +1,33 @@ # Задание-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 2/3 +# Вывод: 1 1/3 + # Задание-2: # Дана ведомость расчета заработной платы (файл "data/workers"). # Рассчитайте зарплату всех работников, зная что они получат полный оклад, -# если отработаю норму часов. Если же они отработали меньше нормы, +# если отработают норму часов. Если же они отработали меньше нормы, # то их ЗП уменьшается пропорционально, а за заждый час переработки -# они получают удвоенную ЗП пропорциональную норме. -# Кол-во часов, которые были отработаны указаны в файле "data/hours_of" +# они получают удвоенную ЗП, пропорциональную норме. +# Кол-во часов, которые были отработаны, указаны в файле "data/hours_of" + # Задание-3: -# Дан файл ("data/fruits") со списком фруктов -# Записать в новые файлы все фрукты начинающиеся с определенной буквы. +# Дан файл ("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 85f5ee4c3..38ac1fcc1 100644 --- a/lesson03/home_work/hw03_normal.py +++ b/lesson03/home_work/hw03_normal.py @@ -1,15 +1,14 @@ # Задание-1: -# Напишите функцию возвращающую ряд Фибоначчи с n-элемента до m-элемент +# Напишите функцию, возвращающую ряд Фибоначчи с n-элемента до m-элемента. # Первыми элементами ряда считать цифры 1 1 - def fibonacci(n, m): pass # Задача-2: -# Напишите функцию сортирующую принимаемый список по возрастанию. +# Напишите функцию, сортирующую принимаемый список по возрастанию. # Для сортировки используйте любой алгоритм (например пузырьковый). -# Для решения данной задачи нельзя использовать встроенную фукцию и метод sort() +# Для решения данной задачи нельзя использовать встроенную функцию и метод sort() def sort_to_max(origin_list): @@ -18,11 +17,11 @@ def sort_to_max(origin_list): sort_to_max([2, 10, -12, 2.5, 20, -11, 4, 4, 0]) # Задача-3: -# Напишите собственную реализацию функции filter -# Разумеется, внутри нельзя использовать саму функцию filter +# Напишите собственную реализацию стандартной функции filter. +# Разумеется, внутри нельзя использовать саму функцию filter. # Задача-4: # Даны четыре точки А1(х1, у1), А2(x2 ,у2), А3(x3 , у3), А4(х4, у4). -# Определить, будут ли они вершинами параллелограмма +# Определить, будут ли они вершинами параллелограмма. diff --git a/lesson04/examples/1_link_value.py b/lesson04/examples/1_link_value.py index 184eeacb8..390658efe 100644 --- a/lesson04/examples/1_link_value.py +++ b/lesson04/examples/1_link_value.py @@ -12,9 +12,9 @@ l2.append(4) print("l1 = ", l1, "l2 = ", l2) -# Переменная(в python)) - это всего лишь указатель на объект в памяти +# Переменная (в python) - это всего лишь указатель на объект в памяти. # Если несколько переменных указывают на один и тот же ИЗМЕНЯЕМЫЙ объект, -# то изменив объет по одной из ссылок мы меняем его для всех остальных +# то, изменив объет по одной из ссылок, мы меняем его для всех остальных. # Это особо важно понимать при передаче изменяемых объектов в функцию # и при изменении объекта в цикле for in (который итерирует данный объект) @@ -35,11 +35,11 @@ def modify(lst): # Но исходный список тоже изменился, подобное неявное поведение нежелательно для функций print('my_list = ', my_list) -# Будте аккуратны, при работе с изменяемыми объектами, лучше работайте с их копиями +# Будьте аккуратны при работе с изменяемыми объектами, лучше работайте с их копиями mod_list = modify(my_list) my_list = [1, 2, 3] -# Теперь фкнкция получит копию списка и не изменить исходный +# Теперь функция получит копию списка и не изменит исходный mod_list = modify(my_list[:]) print('mod_list = ', mod_list) print('my_list = ', my_list) @@ -51,12 +51,12 @@ def modify(lst): if el < 0: my_list.remove(el) -# Думаю, это не тот результат которого вы ожидали +# Думаю, это не тот результат, которого вы ожидали print("1)my_list after remove -->", my_list) my_list = [1, -2, -4, 0, 5, -2] -# Итерируем покопии, а удаляем из оригинала +# Итерируем по копии, а удаляем из оригинала for el in my_list[:]: if el < 0: my_list.remove(el) @@ -64,7 +64,7 @@ def modify(lst): # А как хорошо print("2)my_list after remove -->", my_list) -# Если нужно сделать полную копию, со всеми вложенными изменяемыми объектами, используем copy +# Если нужно сделать полную копию, со всеми вложенными изменяемыми объектами, используем модуль copy import copy l = [[2, 3], [4, 6, [7, 8]]] diff --git a/lesson04/examples/2_matrix.py b/lesson04/examples/2_matrix.py index dd588372a..5053bb318 100644 --- a/lesson04/examples/2_matrix.py +++ b/lesson04/examples/2_matrix.py @@ -24,11 +24,11 @@ # # # Все можно сделать гораздо проще и элегантнее # # Результат один, а код гораздо проще пишется, читается и компактнее -print("*************FOR NI ***************") +print("*************FOR IN ***************") for i, line in enumerate(matrix): for j, el in enumerate(line): print("matrix[{}][{}] = {}".format(i, j, matrix[i][j])) # -# # Пример транспонирвания(поворота) матрицы +# # Пример транспонирования (поворота) матрицы print("rotate_matrix = ", list(map(list, zip(*matrix)))) # # Да, вот так все просто-сложно :-) diff --git a/lesson04/examples/3_and_or.py b/lesson04/examples/3_and_or.py index 1b31cdeb5..5af1c4e03 100644 --- a/lesson04/examples/3_and_or.py +++ b/lesson04/examples/3_and_or.py @@ -31,7 +31,7 @@ name = "Безымянный" print(name) -# Тоже самое с помощью or: +# То же самое с помощью or: print(people.get("name") or "Безымнный") # Несмотря на несуществующую переменную, код все равно выполняется, diff --git a/lesson04/examples/4_op_if_else.py b/lesson04/examples/4_op_if_else.py index 137bc6770..5ea7ba8b7 100644 --- a/lesson04/examples/4_op_if_else.py +++ b/lesson04/examples/4_op_if_else.py @@ -9,7 +9,7 @@ name = "Безымянный" print(name) -# Или так с помощью тенарного if else +# Или так - с помощью тернарного if else print(d.get("name") if d.get("name") else "Безымянный") # Синтаксис diff --git a/lesson04/examples/5_op_is.py b/lesson04/examples/5_op_is.py index 0ed694696..38cb6aec6 100644 --- a/lesson04/examples/5_op_is.py +++ b/lesson04/examples/5_op_is.py @@ -1,4 +1,4 @@ -# Оператор is - возвращает True если операнды указывают на один и то же объект в памяти +# Оператор is - возвращает True, если операнды указывают на один и тот же объект в памяти a = 10 b = 10 @@ -6,9 +6,9 @@ d = c e = [1, 2] -print(a is b) # Неизменяемые типы данных python кэширует для экономия памяти +print(a is b) # Неизменяемые типы данных python кэширует для экономии памяти -print(c is d) # с и d - указывают на один и то же объект +print(c is d) # с и d - указывают на один и тот же объект print(d is e) # d и e - разные объекты # Так лучше, чем: if a == None diff --git a/lesson04/examples/6_gen.py b/lesson04/examples/6_gen.py index 21c855db3..17dbd776d 100644 --- a/lesson04/examples/6_gen.py +++ b/lesson04/examples/6_gen.py @@ -9,7 +9,7 @@ lst.append(random.randint(-10, 10)) print('lst = ', lst) -# Тоже самое ,но с помощью генератора списка +# То же самое, но с помощью генератора списка. # Компактнее код и выполняется быстрее lst_g = [random.randint(-10, 10) for _ in range(10)] print('lst_g = ', lst_g) diff --git a/lesson04/examples/7_regexp.py b/lesson04/examples/7_regexp.py index 1166a7004..7406b8250 100644 --- a/lesson04/examples/7_regexp.py +++ b/lesson04/examples/7_regexp.py @@ -28,7 +28,7 @@ # * 0 и более вхождений шаблона слева # \w Любая цифра или буква (\W — все, кроме буквы или цифры) # \d Любая цифра [0-9] (\D — все, кроме цифры) -# \s Любой пробельный символ (\S — любой непробельнй символ) +# \s Любой пробельный символ (\S — любой непробельный символ) # \b Граница слова # [..] Один из символов в скобках ([^..] — любой символ, кроме тех, что в скобках) # \ Экранирование специальных символов (\. означает точку или \+ — знак «плюс») @@ -69,7 +69,7 @@ print(re.findall(pattern2, string2)) -# Получим нужные данные из лога, для дальнейшего анализа +# Получим нужные данные из лога для дальнейшего анализа log = [ '64 bytes from localhost.localdomain (127.0.0.1): ' 'icmp_req=1 ttl=64 time=0.033 ms', diff --git a/lesson04/examples/8_exception.py b/lesson04/examples/8_exception.py index a41b6b4e9..df2b4ffa8 100644 --- a/lesson04/examples/8_exception.py +++ b/lesson04/examples/8_exception.py @@ -2,8 +2,8 @@ # Несколько слов об обработке исключений # ======================================== -# Когда python не может выполнить операцию(инструкцию) то вызывается ошибка(исключение) -# Такие исключений можно перехватывать и обрабатывать так, как вам это нужно +# Когда python не может выполнить операцию (инструкцию), то вызывается ошибка (исключение). +# Такие исключения можно перехватывать и обрабатывать так, как вам это нужно. # n = 10 n = 'Hello' @@ -13,9 +13,9 @@ print('n успешно преобразована к типу Int') except ValueError: # Тип перехватываемого исключения print('значение n невозможно преобразовать к типу int') -# except OtherError: except'ов может быть любое кол-во, если вы хотите разные ошибки обрабатывать по разному +# except OtherError: except'ов может быть любое кол-во, если вы хотите разные ошибки обрабатывать по-разному # except (ValueError, TypeError, FloatingPointError): или в виде перечисления -# В python использование обработки исключений как части алгоритма является нормальным, но старайтесь не злоупотреблять +# В python использование обработки исключений как части алгоритма является нормальным, но старайтесь не злоупотреблять. # Подробнее об исключениях см.в справочнике diff --git a/lesson04/home_work/hw04_easy.py b/lesson04/home_work/hw04_easy.py index 029699897..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 d6903a528..3b12dc315 100644 --- a/lesson04/home_work/hw04_hard.py +++ b/lesson04/home_work/hw04_hard.py @@ -1,11 +1,12 @@ # Задание-1: # Матрицы в питоне реализуются в виде вложенных списков: -# Пример Дано: +# Пример. Дано: matrix = [[1, 0, 8], [3, 4, 1], [0, 4, 2]] -# Выполнить поворот(транспонирование) матрицы -# Пример Результат: + +# Выполнить поворот (транспонирование) матрицы +# Пример. Результат: # matrix_rotate = [[1, 3, 0], # [0, 4, 4], # [8, 1, 2]] @@ -13,9 +14,8 @@ # Суть сложности hard: Решите задачу в одну строку # Задание-2: -# Найдите наибольшее произведение пяти последовательных цифр в -# 1000-значном числе. -# Выведите произведение и индекс смещения первого числа последовательных 5-ти цифр +# Найдите наибольшее произведение пяти последовательных цифр в 1000-значном числе. +# Выведите произведение и индекс смещения первого числа последовательных 5-ти цифр. # Пример 1000-значного числа: number = """ 73167176531330624919225119674426574742355349194934 @@ -37,10 +37,13 @@ 07198403850962455444362981230987879927244284909188 84580156166097919133875499200524063689912560717606 05886116467109405077541002256983155200055935729725 -716362695618826704282524836008""" +71636269561882670428252483600823257530420752963450""" -# Задание-3( Ферзи): -# Известно, что на доске 8×8 можно расставить 8 ферзей так, чтобы они не били друг друга. -# Вам дана расстановка 8 ферзей на доске, определите, есть ли среди них пара бьющих друг друга. -# Программа получает на вход восемь пар чисел, каждое число от 1 до 8 — координаты 8 ферзей. + +# Задание-3 (Ферзи): +# Известно, что на доске 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 4191a3ce1..739dd33f8 100644 --- a/lesson04/home_work/hw04_normal.py +++ b/lesson04/home_work/hw04_normal.py @@ -1,36 +1,53 @@ # Задание-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/lesson05/examples/1_modules.py b/lesson05/examples/1_modules.py index d7271fe53..db1efdb60 100644 --- a/lesson05/examples/1_modules.py +++ b/lesson05/examples/1_modules.py @@ -15,7 +15,7 @@ # Другой вариант подключения модуля from math import sqrt # Из модуля math мы подключили только функцию sqrt() -# Она доступна без math. ,а напрямую +# Она доступна без math. , напрямую print(sqrt(4)) # Импортируем несколько функций сразу @@ -25,10 +25,10 @@ # Можно импортировать все содержимое модуля from math import * # Это плохой подход, т.к. имена функций модуля, модут конфликтовать с именами вашего -# Или других подключенных(импортированных) модулей. -print(cos(0.4)) # несовсем понятно из какого модуля данная функция, особенно если подключено много модулей +# Или других подключенных (импортированных) модулей. +print(cos(0.4)) # не совсем понятно из какого модуля данная функция, особенно если подключено много модулей # Удобство import math - заключается в том, что вы создаете пространство имен math, -# и избегаете конфликтов(при одинаковых именах функций и классов в различных модулях) +# и избегаете конфликтов (при одинаковых именах функций и классов в различных модулях) # Пространства имен: # Например в module1 есть функция do_this() и в module2 есть функция do_this @@ -41,6 +41,6 @@ # Зачем нужны модули? # Для логического разбиения программы на части для: -# 1. Повторного использования програмного кода +# 1. Повторного использования программного кода # 2. Разделения пространств имен (см. пример выше) -# 3. Реализация служб или данных для совместного использвания +# 3. Реализация служб или данных для совместного использования diff --git a/lesson05/examples/2_my_modules.py b/lesson05/examples/2_my_modules.py index 9bd0b733f..fc2faea0f 100644 --- a/lesson05/examples/2_my_modules.py +++ b/lesson05/examples/2_my_modules.py @@ -2,8 +2,8 @@ # Создание собственных Модулей # ================================ -# В Python модуле - это просто питоновский(.py) файл -# import my_module - ищет файл my_module.py в определенных местах, +# В Python модуль - это просто питоновский (.py) файл +# import my_module - ищет файл my_module.py в определенных местах. # Пути поиска модуля: # 1. Домашний каталог проекта @@ -39,7 +39,7 @@ # Импорт каждого модуля выполняется только ОДИН раз! - это сделано для экономии ресурсов -# Импорт запускает импортируемы файл - выполняя весь код в нем: +# Импорт запускает импортируемый файл - выполняя весь код в нем: import lesson05.examples.my_libs.lib2 as lib2 import math @@ -49,8 +49,8 @@ pass # Нужно помнить, что т.к. импортируемый файл выполняется, следовательно из модуля -# доступны не тольлько функции и классы, но и все переменные импортированного модуля +# доступны не только функции и классы, но и все переменные импортированного модуля print(lib2.G) # Переменная модуля lib2 -# Не забываем - что инструкция def my_func по сути присваивает переменной my_func +# Не забываем, что инструкция def my_func, по сути, присваивает переменной my_func # ссылку на объект-функцию diff --git a/lesson05/examples/4_system.py b/lesson05/examples/4_system.py index 4676879b8..772d8d09e 100644 --- a/lesson05/examples/4_system.py +++ b/lesson05/examples/4_system.py @@ -14,4 +14,4 @@ key = input("press 'q' to Exit") if key == 'q': - sys.exit() # Вызов данной функции мгновенно заверешает работу модуля(скрипта) + sys.exit() # Вызов данной функции мгновенно завершает работу модуля (скрипта) diff --git a/lesson05/home_work/hw05_easy.py b/lesson05/home_work/hw05_easy.py index b990086b0..c6317de2b 100644 --- a/lesson05/home_work/hw05_easy.py +++ b/lesson05/home_work/hw05_easy.py @@ -1,9 +1,10 @@ # Задача-1: -# Напишите скрипт создающий директории dir_1 - dir_9 в папке из которой запущен данный скрипт. +# Напишите скрипт, создающий директории dir_1 - dir_9 в папке, +# из которой запущен данный скрипт. # И второй скрипт, удаляющий эти папки. # Задача-2: -# Напишите скрипт отображающий папки текущей директории +# Напишите скрипт, отображающий папки текущей директории. # Задача-3: -# Напишите скрипт создающий копию файла, из которого запущен данный скрипт +# Напишите скрипт, создающий копию файла, из которого запущен данный скрипт. diff --git a/lesson05/home_work/hw05_hard.py b/lesson05/home_work/hw05_hard.py index b7c56900e..7507e47b2 100644 --- a/lesson05/home_work/hw05_hard.py +++ b/lesson05/home_work/hw05_hard.py @@ -1,14 +1,15 @@ # Задание-1: # Доработайте реализацию программы из примера examples/5_with_args.py, -# добавив реализацию следующих команд(переданных в качестве аргументов): +# добавив реализацию следующих команд (переданных в качестве аргументов): # cp - создает копию указанного файла -# rm - удаляет указанный файл(запросить подтверждение операции) +# rm - удаляет указанный файл (запросить подтверждение операции) # cd - меняет текущую директорию на указанную # ls - отображение полного пути текущей директории -# путь считать абсолютным(full_path) - в Linux начинается с /, в Windows с имени диска -# все остальные пути считать относительными +# путь считать абсолютным (full_path) - +# в Linux начинается с /, в Windows с имени диска, +# все остальные пути считать относительными. -# Важно! Все операции должны выполняться в той директории, в который вы находитесь. Исходной директорией считать ту, -# в которой был запущен скрипт. +# Важно! Все операции должны выполняться в той директории, в который вы находитесь. +# Исходной директорией считать ту, в которой был запущен скрипт. -# P.S. По возможности, сделайте кросс-платформеную реализацию. +# P.S. По возможности, сделайте кросс-платформенную реализацию. diff --git a/lesson05/home_work/hw05_normal.py b/lesson05/home_work/hw05_normal.py index 6831c129a..ead6bbc19 100644 --- a/lesson05/home_work/hw05_normal.py +++ b/lesson05/home_work/hw05_normal.py @@ -1,12 +1,15 @@ # Задача-1: -# Напишите небольшую консольную утилиту, позволяющую работать с папками текущей директории. +# Напишите небольшую консольную утилиту, +# позволяющую работать с папками текущей директории. # Утилита должна иметь меню выбора действия, в котором будут пункты: # 1. Перейти в папку # 2. Просмотреть содержимое текущей папки # 3. Удалить папку # 4. Создать папку -# При выборе пунктов: 1, 3,4, программа запрашивает название папки -# и выводит результат действия: "Успешно создано/удалено/перешел", "Невозможно создать/удалить/прейти" +# При выборе пунктов 1, 3, 4 программа запрашивает название папки +# и выводит результат действия: "Успешно создано/удалено/перешел", +# "Невозможно создать/удалить/перейти" -# Для решения данной задачи используйте алоритмы из задания easy, -# оформленныйе в виде соответствующих функций, и импортированные в данный файл из easy.py +# Для решения данной задачи используйте алгоритмы из задания easy, +# оформленные в виде соответствующих функций, +# и импортированные в данный файл из easy.py diff --git a/lesson06/examples/1_Struct.py b/lesson06/examples/1_Struct.py index d569cac29..c30b0916d 100644 --- a/lesson06/examples/1_Struct.py +++ b/lesson06/examples/1_Struct.py @@ -2,7 +2,7 @@ # Словарь как структура данных # ================================= -# Словарь по принципу работы поход на объект - по ключу вы находите значение +# Словарь по принципу работы похож на объект - по ключу вы находите значение student = { "name": "Алексадр", "surname": "Иванов", diff --git a/lesson06/examples/2_Classes.py b/lesson06/examples/2_Classes.py index 12335315c..35f6c373a 100644 --- a/lesson06/examples/2_Classes.py +++ b/lesson06/examples/2_Classes.py @@ -3,9 +3,9 @@ # ================================= # class - шаблон для создания объектов -# Классы содеражат атрибуты - данные, и методы - функции для обработки данных +# Классы содержат атрибуты - данные, и методы - функции для обработки данных class Student: - # функция-конструктор - запускается автоматически при создании объекта(экземпляра класса) + # функция-конструктор - запускается автоматически при создании объекта (экземпляра класса) def __init__(self, name, surname, birth_date, school, class_room): self.name = name self.surname = surname @@ -25,7 +25,7 @@ def set_name(self, new_name): self.name = new_name -# Создаем объекты(экземпляры класса) на основании класса-шаблона +# Создаем объекты (экземпляры класса) на основании класса-шаблона # Агрументы передаются в функцию-конструктор student1 = Student("Александр", "Иванов", '10.11.1998', "8 гимназия", "5 А") student2 = Student("Петр", "Сидоров", '10.01.1995', "8 гимназия", "8 Б") @@ -34,13 +34,13 @@ def set_name(self, new_name): print(student1.class_room) # Вызываем метод, который переводит ученика в следующий класс student1.next_class() -# Проверяем изменился ли класс +# Проверяем, изменился ли класс print(student1.class_room) -# Выводим текущий класс второго ученика. Классы имеют обзую структуру и методы, но различные данные +# Выводим текущий класс второго ученика. Классы имеют общую структуру и методы, но различные данные. print(student1.class_room) -# Вызываем метод, для получения полного-отображаемого имени студента +# Вызываем метод для получения полного отображаемого имени студента print(student1.get_full_name()) print(student2.get_full_name()) @@ -48,7 +48,7 @@ def set_name(self, new_name): student1.name = 'Вася' print(student1.name) -# Любой ООП язык должен следовать слеющим парадигмам: +# Любой ООП-язык должен следовать следующим парадигмам: # 1. Инкапсуляция # 2. Полиморфизм # 3. Наследование diff --git a/lesson06/examples/3_encapsulation.py b/lesson06/examples/3_encapsulation.py index 6d75c3bb0..f44e32cdc 100644 --- a/lesson06/examples/3_encapsulation.py +++ b/lesson06/examples/3_encapsulation.py @@ -22,7 +22,7 @@ def set_name(self, new_name): self.name = new_name -# Далее, мы используем класс в многих местах различных программ +# Далее мы используем класс в многих местах различных программ students = [Student("Александр", "Иванов", '10.11.1998', "8 гимназия", "5 А"), Student("Петр", "Сидоров", '10.01.1995', "8 гимназия", "8 Б"), Student("Иван", "Петров", '12.11.1999', "8 гимназия", "4 В"), @@ -37,8 +37,8 @@ def set_name(self, new_name): # ... и еще куча кода с использованием Student -# Но потом вы заметили, что реализация методы .next_class() смотрится ну очень плохо -# И что бы написать хороший код, решили хранить инфо. о классе по другому +# Но потом вы заметили, что реализация метода .next_class() смотрится ну очень плохо +# И чтобы написать хороший код, решили хранить инфо. о классе по-другому # class Student: # def __init__(self, name, surname, birth_date, school, class_room): @@ -61,7 +61,7 @@ def __init__(self, name, surname, birth_date, school, class_room): self.surname = surname self.birth_date = birth_date self.school = school - # Сивол нижнего подчеркивания, говорит пользователям класса, что атрибут для внутренеего использования + # Символ нижнего подчеркивания говорит пользователям класса, что атрибут для внутреннего использования self._class_room = {'class_num': int(class_room.split()[0]), 'class_char': class_room.split()[1]} @@ -82,7 +82,7 @@ def set_name(self, new_name): self.name = new_name -# Старый код, работает с новым классом без изменений +# Старый код работает с новым классом без изменений print("******После изменения класса*******") students = [Student("Александр", "Иванов", '10.11.1998', "8 гимназия", "5 А"), Student("Петр", "Сидоров", '10.01.1995', "8 гимназия", "8 Б"), @@ -96,10 +96,10 @@ def set_name(self, new_name): for num, student in enumerate(students, start=1): print("{}) {} класс: {}".format(num, student.get_full_name(), student.class_room)) -# В данном примере мы использовали приемы инкапсуляции, чтобы скрыть внутренюю реализацию класса +# В данном примере мы использовали приемы инкапсуляции, чтобы скрыть внутреннюю реализацию класса -# Еще один пример инкапсуляции, с использование класса Вектор +# Еще один пример инкапсуляции, с использованием класса Вектор import math @@ -117,7 +117,7 @@ def __init__(self, coords): def x(self): return self.__coords[0] - @x.setter # Позволяет в удобной форме устанавливать атрибут x --> self,x = 10 или obj.x = 10 + @x.setter # Позволяет в удобной форме устанавливать атрибут x --> self.x = 10 или obj.x = 10 def x(self, x): self.__coords = x, self.__coords[1] @@ -154,6 +154,6 @@ def rotate(self, angle): print('v2.y', v2.y) # print(v1.__coords) <-- так обратиться нельзя -# Изменение атрибуты, вызывает метод: def x(self, x) с декоратором @x.setter +# Изменение атрибута вызывает метод: def x(self, x) с декоратором @x.setter v1.x = -21 print('v1.x = ', v1.x) \ No newline at end of file diff --git a/lesson06/examples/4_inheritance.py b/lesson06/examples/4_inheritance.py index c3bfd7695..c2fc1ef1e 100644 --- a/lesson06/examples/4_inheritance.py +++ b/lesson06/examples/4_inheritance.py @@ -1,4 +1,4 @@ -# Наследование подразумевает то, что дочерний класс содержит все атрибуты родительского класса, +# Наследование подразумевает, что дочерний класс содержит все атрибуты родительского класса, # при этом некоторые из них могут быть переопределены или добавлены в дочернем. @@ -51,7 +51,7 @@ def set_name(self, new_name): # Но часть информации у них общая(атрибуты, методы) -# Общую информацию выносим в Класс предок(родитель) +# Общую информацию выносим в Класс-предок (родитель) class People: def __init__(self, name, surname, birth_date, school): self.name = name @@ -75,7 +75,7 @@ def __init__(self, name, surname, birth_date, school, class_room): self._class_room = {'class_num': int(class_room.split()[0]), 'class_char': class_room.split()[1]} - # И уникальные сметоды + # И уникальные методы @property def class_room(self): return "{} {}".format(self._class_room['class_num'], self._class_room['class_char']) 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/lesson06/home_work/hw06_easy.py b/lesson06/home_work/hw06_easy.py index 04295a4fe..fe5dc2b11 100644 --- a/lesson06/home_work/hw06_easy.py +++ b/lesson06/home_work/hw06_easy.py @@ -1,7 +1,9 @@ # Задача-1: Написать класс для фигуры-треугольника, заданного координатами трех точек. -# Определть методы позволяющие вычислить: Площадь, высоту и периметр фигуры +# Определить методы, позволяющие вычислить: площадь, высоту и периметр фигуры. -# Задача-2: Написать Класс Равнобочная трапеция, заданной координатами 4-х точек. -# Предусмотреть в классе методы: проверка, является ли фигура равнобочной трапецией; -# вычисления: длины сторон, периметр, площадь. + +# Задача-2: Написать Класс "Равнобочная трапеция", заданной координатами 4-х точек. +# Предусмотреть в классе методы: +# проверка, является ли фигура равнобочной трапецией; +# вычисления: длины сторон, периметр, площадь. diff --git a/lesson06/home_work/hw06_hard.py b/lesson06/home_work/hw06_hard.py index 551623241..fae8d84d2 100644 --- a/lesson06/home_work/hw06_hard.py +++ b/lesson06/home_work/hw06_hard.py @@ -1,10 +1,12 @@ # Задание-1: Решите задачу (дублированную ниже): -# Дана ведомость расчеты заработной платы (файл "data/workers"). Рассчитайте зарплату всех работников, -# зная что они получат полный оклад, если отработаю норму часов. Если же они отработали меньше нормы, -# то их ЗП уменьшается пропорционально, а за заждый час переработки они получают удвоенную ЗП -# пропорциональную норме. -# Кол-во часов, которые были отработаны указаны в файле "data/hours_of" +# Дана ведомость расчета заработной платы (файл "data/workers"). +# Рассчитайте зарплату всех работников, зная что они получат полный оклад, +# если отработают норму часов. Если же они отработали меньше нормы, +# то их ЗП уменьшается пропорционально, а за заждый час переработки они получают +# удвоенную ЗП, пропорциональную норме. +# Кол-во часов, которые были отработаны, указаны в файле "data/hours_of" # С использованием классов. -# Рализуйте классы сотрудников так, чтобы на вход функции-конструктора каждый работник получал строку из файла +# Реализуйте классы сотрудников так, чтобы на вход функции-конструктора +# каждый работник получал строку из файла diff --git a/lesson06/home_work/hw06_normal.py b/lesson06/home_work/hw06_normal.py index e5a1581e1..01c3982f4 100644 --- a/lesson06/home_work/hw06_normal.py +++ b/lesson06/home_work/hw06_normal.py @@ -1,13 +1,17 @@ # Задание-1: # Реализуйте описаную ниже задачу, используя парадигмы ООП: -# В школе есть Классы(5А, 7Б и т.д.), в которых учатся Ученики. У каждого ученика есть два Родителя(мама и папа). -# Также в школе преподают Учителя, один учитель может преподавать в неограниченном кол-ве классов -# свой определенный предмет. Т.е. Учитель Иванов может преподавать математику у 5А и 6Б, но больше математику не -# может преподавать никто другой. +# В школе есть Классы(5А, 7Б и т.д.), в которых учатся Ученики. +# У каждого ученика есть два Родителя(мама и папа). +# Также в школе преподают Учителя. Один учитель может преподавать +# в неограниченном кол-ве классов свой определенный предмет. +# Т.е. Учитель Иванов может преподавать математику у 5А и 6Б, +# но больше математику не может преподавать никто другой. # Выбранная и заполненная данными структура должна решать следующие задачи: # 1. Получить полный список всех классов школы -# 2. Получить список всех учеников в указанном классе(каждый ученик отображается в формате "Фамилия И.О.") -# 3. Получить список всех предметов указанного ученика (Ученик --> Класс --> Учителя --> Предметы) +# 2. Получить список всех учеников в указанном классе +# (каждый ученик отображается в формате "Фамилия И.О.") +# 3. Получить список всех предметов указанного ученика +# (Ученик --> Класс --> Учителя --> Предметы) # 4. Узнать ФИО родителей указанного ученика # 5. Получить список всех Учителей, преподающих в указанном классе diff --git a/lesson07/examples/1_overloading.py b/lesson07/examples/1_overloading.py index 5908bc4e1..e3c96700a 100644 --- a/lesson07/examples/1_overloading.py +++ b/lesson07/examples/1_overloading.py @@ -3,8 +3,8 @@ # ============================= # Имена методов, начинающиеся и заканчивающиеся двумя символами подчеркивания __X__, имеют специальное назначение. -# Такие методы вызываются автоматически, кода объект участвует в соответствующей операции -# Возвращаемое значение метода становится результатом соответствующей операции +# Такие методы вызываются автоматически, когда объект участвует в соответствующей операции. +# Возвращаемое значение метода становится результатом соответствующей операции. class Vector: @@ -19,21 +19,21 @@ def __add__(self, other): def as_point(self): return self.x, self.y - # Формируем удобное отображение объекта при выводе функцие print() + # Формируем удобное отображение объекта при выводе функцией print() def __str__(self): return "V(x:{} y:{})".format(self.x, self.y) -# Создаем экземпляры класса(объекты) +# Создаем экземпляры класса (объекты) v1 = Vector((10, 15)) v2 = Vector((12, 10)) -# Наши объекты участвуют в операции сложение (+) +# Наши объекты участвуют в операции сложения (+) v3 = v1 + v2 # На самом деле это работает так: # v3 = v1.__add__(v2) -# Благодаря перегрузке, мы можем использовать более удобную и привычную запись: v3 = v1+v2 +# Благодаря перегрузке, мы можем использовать более удобную и привычную запись: v3 = v1 + v2 -# Выыдим результат +# Выводим результат print('v3 = ', v3) # Функция print() для получения строки для вывода вызывает методы __str__() print('v3 + v3 =', v3 + v3) diff --git a/lesson07/examples/2_iter_rules.py b/lesson07/examples/2_iter_rules.py index 8d861ed19..1b2b2444d 100644 --- a/lesson07/examples/2_iter_rules.py +++ b/lesson07/examples/2_iter_rules.py @@ -9,13 +9,13 @@ # Python выполняет: # 1. Вызывает метод __iter__(): test_list.__iter__() -# Метод __iter__() должен вернуть объект у которого есть метод __next__() -# 2. Цикл for in каждую итерацию вызывает метод __next__() +# Метод __iter__() должен вернуть объект, у которого есть метод __next__() +# 2. Цикл for..in каждую итерацию вызывает метод __next__() # __next__() при каждом вызове возвращает следующий элемент итератора # 3. Когда элементы итератора заканчиваются, метод __next__() возбуждает исключение StopIteration -# for in завершает свою работу, когда перехватывает это исключение +# for..in завершает свою работу, когда перехватывает это исключение -# Проведем обход элементов списка test_list вручную(без цикла) +# Проведем обход элементов списка test_list вручную (без цикла) print("Итерируем вручную...") # Получаем объект-итератор diff --git a/lesson07/examples/3_myIter.py b/lesson07/examples/3_myIter.py index 7476a82f4..53d6c3fbf 100644 --- a/lesson07/examples/3_myIter.py +++ b/lesson07/examples/3_myIter.py @@ -5,7 +5,7 @@ class IterObj: """ - Объект итератор + Объект-итератор """ def __init__(self, start=0): self.i = start @@ -21,7 +21,7 @@ def __next__(self): class Iter: """ - Объект поддерживающий интерфейс итерации + Объект, поддерживающий интерфейс итерации """ def __init__(self, start=0): self.start = start - 1 @@ -47,7 +47,7 @@ def __iter__(self): print('next(map_iter) --> ', next(map_iter)) print('next(map_iter) --> ', next(map_iter)) -# Цикл for in продолжает перебор элементов, т.к. map_iter является итератором +# Цикл for..in продолжает перебор элементов, т.к. map_iter является итератором for el in map_iter: print("el in for in -->", el) @@ -57,7 +57,7 @@ def __init__(self, start=0): self.i = start def __iter__(self): - # Метод __iter__ должен возвращать объект итератор + # Метод __iter__ должен возвращать объект-итератор return self def __next__(self): diff --git a/lesson07/examples/4_interfaces!!!.py b/lesson07/examples/4_interfaces!!!.py deleted file mode 100644 index e1c8ad8df..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/6_types_extension.py b/lesson07/examples/6_types_extension.py index 4674879af..9c3ca8f0f 100644 --- a/lesson07/examples/6_types_extension.py +++ b/lesson07/examples/6_types_extension.py @@ -9,7 +9,7 @@ class my_dict(dict): def new_method(self): return "I'm new_method" - # Добавляем дополнительный функционал с существующему методу + # Добавляем дополнительный функционал к существующему методу def __setitem__(self, key, value): print('Setting %r to %r' % (key, value)) return super().__setitem__(key, value) @@ -31,7 +31,7 @@ def __setitem__(self, key, value): class MyList(list): """ - Список - индексы которого начинатся с 1, а не с 0 + Список, индексы которого начинатся с 1, а не с 0 """ def __getitem__(self, offset): print('(indexing % s at % s)' % (self, offset)) 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..da01d4c00 --- /dev/null +++ b/lesson07/home_work/loto.py @@ -0,0 +1,59 @@ +#!/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/3_my_exceptions.py b/lesson08/examples/3_my_exceptions.py index 26b0ce459..5c6254b9a 100644 --- a/lesson08/examples/3_my_exceptions.py +++ b/lesson08/examples/3_my_exceptions.py @@ -1,11 +1,11 @@ # Можно, а часто и нужно создавать исключения отличающиеся от стандартных типов -# Любое исключение это экземпляр класса, который должен наследоваться от Exception +# Любое исключение - это экземпляр класса, который должен наследоваться от Exception class ShortInputError(Exception): """Пользовательский класс исключения.""" def __init__(self, length, atleast): Exception.__init__(self) - # Добавляем два доп.атрибута, дл вывода более информативного сообщения об ошибке + # Добавляем два доп.атрибута, для вывода более информативного сообщения об ошибке self.length = length self.atleast = atleast @@ -21,7 +21,7 @@ class TestError(ShortInputError): def max_char(text): if len(text) < 2: - # Вывываем искючение с помощью оператора raise + # Вызываем исключение с помощью оператора raise raise ShortInputError(len(text), 2) # ... 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..a9debfa1c --- /dev/null +++ b/lesson08/home_work/openweather.py @@ -0,0 +1,125 @@ + +""" +== 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-файлах происходит через пространство имен: +