diff --git a/homeworks/les04/task01.py b/homeworks/les04/task01.py new file mode 100644 index 0000000..3826d82 --- /dev/null +++ b/homeworks/les04/task01.py @@ -0,0 +1,22 @@ +""" +1. Реализовать скрипт, в котором должна быть предусмотрена функция расчета заработной платы сотрудника. +В расчете необходимо использовать формулу: (выработка в часах * ставка в час) + премия. +Для выполнения расчета для конкретных значений необходимо запускать скрипт с параметрами. +""" +from sys import argv + +# первый параметр (название скрипта) пропускаем +_, param_produce_hours, param_rate, param_bonus = argv + + +def salary(produce_hours, rate, bonus): + """ Простой расчет зарплаты + :param produce_hours: + :param rate: + :param bonus: + :return: + """ + return produce_hours * rate + bonus + + +print('Зарплата : ', salary(int(param_produce_hours), int(param_rate), int(param_bonus))) diff --git a/homeworks/les04/task02.py b/homeworks/les04/task02.py new file mode 100644 index 0000000..4478768 --- /dev/null +++ b/homeworks/les04/task02.py @@ -0,0 +1,26 @@ +""" +2. Представлен список чисел. +Необходимо вывести элементы исходного списка, значения которых больше предыдущего элемента. +Подсказка: элементы, удовлетворяющие условию, оформить в виде списка. +Для формирования списка использовать генератор. +Пример исходного списка: [300, 2, 12, 44, 1, 1, 4, 10, 7, 1, 78, 123, 55]. +Результат: [12, 44, 4, 10, 78, 123]. +""" + + +def my_range(start, end): + """ частичная реализация range + :param start: + :param end: + :return: + """ + while start < end: + yield start + start += 1 + + +a = [300, 2, 12, 44, 1, 1, 4, 10, 7, 1, 78, 123, 55] +# начинаем с 1 чтобы спавнивать с предыдущим индексом (0) +b = [a[i] for i in my_range(1, len(a)) if a[i] > a[i - 1]] + +print("Решение :", b) diff --git a/homeworks/les04/task03.py b/homeworks/les04/task03.py new file mode 100644 index 0000000..88bebca --- /dev/null +++ b/homeworks/les04/task03.py @@ -0,0 +1,31 @@ +""" +3. Для чисел в пределах от 20 до 240 найти числа, кратные 20 или 21. +Необходимо решить задание в одну строку. +Подсказка: использовать функцию range() и генератор. +""" + + +def my_range(start, end, step=1): + """ частичная реализация range + :param start: + :param end: + :param step: + :return: + """ + while start < end: + yield start + start += step + + +# 1 вариант - в лоб +a1 = [x for x in my_range(20, 240) if not (x % 20) or not (x % 21)] + +# 1 вариант эффективный - ленивый +a2 = [x for x in my_range(20, 240, 20)] + [x for x in my_range(21, 240, 21)] + +# 2 вариант эффективный - жадный +a3 = [x for x in list(my_range(20, 240, 20)) + list(my_range(21, 240, 21))] + +print("Список чисел, кратных 20 и 21", a1) +print("Список чисел, кратных 20 и 21", a2) +print("Список чисел, кратных 20 и 21", a3) diff --git a/homeworks/les04/task04.py b/homeworks/les04/task04.py new file mode 100644 index 0000000..4e95e31 --- /dev/null +++ b/homeworks/les04/task04.py @@ -0,0 +1,12 @@ +""" +4. Представлен список чисел. Определить элементы списка, не имеющие повторений. +Сформировать итоговый массив чисел, соответствующих требованию. +Элементы вывести в порядке их следования в исходном списке. +Для выполнения задания обязательно использовать генератор. +Пример исходного списка: [2, 2, 2, 7, 23, 1, 44, 44, 3, 2, 10, 7, 4, 11]. +Результат: [23, 1, 3, 10, 4, 11] +""" +a = [2, 2, 2, 7, 23, 1, 44, 44, 3, 2, 10, 7, 4, 11] +# генератор заполнения списка +b = [k for k in a if a.count(k) == 1] +print("Список без повторений : ", b) diff --git a/homeworks/les04/task05.py b/homeworks/les04/task05.py new file mode 100644 index 0000000..f686aa4 --- /dev/null +++ b/homeworks/les04/task05.py @@ -0,0 +1,40 @@ +""" +5. Реализовать формирование списка, используя функцию range() и возможности генератора. +В список должны войти четные числа от 100 до 1000 (включая границы). +Необходимо получить результат вычисления произведения всех элементов списка. +Подсказка: использовать функцию reduce(). +""" +from functools import reduce + + +def my_range(start, end, step): + """ частичная реализация range + :param start: + :param end: + :param step: + :return: + """ + while start < end: + yield start + start += step + + +def my_reduce(func, li): + """ + Частичная реализация reduce + :param func: + :param li: + :return: + """ + s = li[0] + for el in li[1:]: + s = func(s, el) + return s + + +a = [x for x in my_range(100, 1000 + 2, 2)] +b = my_reduce((lambda prev, mul: prev * mul), a) + +print("Произведение : ", b) +print("Количество разрядов : ", len(str(b))) +print("Хеш : ", hash(b)) diff --git a/homeworks/les04/task06-1.py b/homeworks/les04/task06-1.py new file mode 100644 index 0000000..9dbc48c --- /dev/null +++ b/homeworks/les04/task06-1.py @@ -0,0 +1,36 @@ +""" +6. Реализовать два небольших скрипта: +а) итератор, генерирующий целые числа, начиная с указанного, +б) итератор, повторяющий элементы некоторого списка, определенного заранее. +Подсказка: использовать функцию count() и cycle() модуля itertools. +Обратите внимание, что создаваемый цикл не должен быть бесконечным. +Необходимо предусмотреть условие его завершения. +Например, в первом задании выводим целые числа, начиная с 3, а при достижении числа 10 завершаем цикл. +Во втором также необходимо предусмотреть условие, при котором повторение элементов списка будет прекращено. +""" +from itertools import count, cycle + + +def iter_int(start, end): + """ + Итератор на основе cycle с границей + :param start: начальное значение + :param end: конечное значение + :return: + """ + # конфигурация итератора + gen = count(start) + + def wrap(iter_gen): + i = next(iter_gen) + # контроль границ + while i <= end: + yield i + i = next(iter_gen) + + # возврат итератора + return wrap(gen) + + +iter1 = iter_int(3, 10) +print("Последовательность :", list(iter1)) diff --git a/homeworks/les04/task06-2.py b/homeworks/les04/task06-2.py new file mode 100644 index 0000000..7278846 --- /dev/null +++ b/homeworks/les04/task06-2.py @@ -0,0 +1,34 @@ +""" +6. Реализовать два небольших скрипта: +а) итератор, генерирующий целые числа, начиная с указанного, +б) итератор, повторяющий элементы некоторого списка, определенного заранее. +Подсказка: использовать функцию count() и cycle() модуля itertools. +Обратите внимание, что создаваемый цикл не должен быть бесконечным. +Необходимо предусмотреть условие его завершения. +Например, в первом задании выводим целые числа, начиная с 3, а при достижении числа 10 завершаем цикл. +Во втором также необходимо предусмотреть условие, при котором повторение элементов списка будет прекращено. +""" +from itertools import cycle + + +def cyclone(c_list, n): + """ + итератор на основе cycle с контролем общего количества в финальном списке + :param c_list: список для повторений + :param n: количество элементов + :return: + """ + + def wrap(in_l, in_n): + # счетчик элементов + i = 1 + gen = cycle(in_l) + while i <= in_n: + yield next(gen) + i += 1 + + return wrap(c_list, n) + + +c = cyclone([1, 2, 3], 10) +print('Список с повторениями :', list(c)) diff --git a/homeworks/les04/task07.py b/homeworks/les04/task07.py new file mode 100644 index 0000000..acae5ce --- /dev/null +++ b/homeworks/les04/task07.py @@ -0,0 +1,31 @@ +""" +7. Реализовать генератор с помощью функции с ключевым словом yield, создающим очередное значение. +При вызове функции должен создаваться объект-генератор. +Функция должна вызываться следующим образом: for el in fact(n). +Функция отвечает за получение факториала числа, а в цикле необходимо выводить только первые n чисел, +начиная с 1! и до n!. +Подсказка: факториал числа n — произведение чисел от 1 до n. +Например, факториал четырёх 4! = 1 * 2 * 3 * 4 = 24. +""" + + +def seq_fact(n): + """ + итератор вычесления последжовательных n! + :param n: + :return: итератор + """ + + def wrap(in_n): + i = 1 + f = 1 + while i <= in_n: + f *= i + i += 1 + yield f + + return wrap(n) + + +for el in seq_fact(5): + print('Значение :', el)