From acf6c1a593994f83a0ab05e52e367dfd0c238f92 Mon Sep 17 00:00:00 2001 From: Mikhalev V Date: Fri, 22 Apr 2022 08:26:51 +0300 Subject: [PATCH 1/4] hometask 2 tasks complete --- lesson_2/hometask/task_1.py | 23 ++++++++++++ lesson_2/hometask/task_2.py | 20 +++++++++++ lesson_2/hometask/task_3.py | 30 ++++++++++++++++ lesson_2/hometask/task_4.py | 9 +++++ lesson_2/hometask/task_5.py | 35 +++++++++++++++++++ lesson_2/hometask/task_6.py | 70 +++++++++++++++++++++++++++++++++++++ 6 files changed, 187 insertions(+) create mode 100644 lesson_2/hometask/task_1.py create mode 100644 lesson_2/hometask/task_2.py create mode 100644 lesson_2/hometask/task_3.py create mode 100644 lesson_2/hometask/task_4.py create mode 100644 lesson_2/hometask/task_5.py create mode 100644 lesson_2/hometask/task_6.py diff --git a/lesson_2/hometask/task_1.py b/lesson_2/hometask/task_1.py new file mode 100644 index 0000000..18df34f --- /dev/null +++ b/lesson_2/hometask/task_1.py @@ -0,0 +1,23 @@ +import datetime + +# Создать список и заполнить его элементами различных типов данных. +# Реализовать скрипт проверки типа данных каждого элемента. +# !!!(Что значит "проверки типов данных"? У нас разве есть ограничения??) +# Использовать функцию type() для проверки типа. +# Элементы списка можно не запрашивать у пользователя, а указать явно, в программе. + +# задам априори, так как типов данных куча, писать ifы лень)) +mylist = ["iron maiden", 666, "the number of the beast", 4.85, datetime.date(1982, 3, 22)] + +for element in mylist: + print(f"{element} has a type {type(element)}") + +# !!!(Что значит "проверки типов данных"? У нас разве есть ограничения??) +# пусть есть +# множество с допустимыми значениями +allow_types_set = frozenset((type(int()), type(str()), type(float()))) +for element in mylist: + element_type = type(element) + if element_type not in allow_types_set: + mylist.remove(element) + print(f"element {element} has a not allowed type {element_type}") \ No newline at end of file diff --git a/lesson_2/hometask/task_2.py b/lesson_2/hometask/task_2.py new file mode 100644 index 0000000..2fb9246 --- /dev/null +++ b/lesson_2/hometask/task_2.py @@ -0,0 +1,20 @@ +import datetime + +# Для списка реализовать обмен значений соседних элементов, +# т.е. Значениями обмениваются элементы с индексами 0 и 1, 2 и 3 и т.д. +# При нечетном количестве элементов последний сохранить на своем месте. +# Для заполнения списка элементов необходимо использовать функцию input() + +my_list = [] +while True: + x = input("Enter list value. If no value entered, list ends >>>") + if x == "": + break + my_list.append(x) + +print(f"entered list is {my_list}") +# нас интересующие индексы чётных элементов +for indx in range(0, (len(my_list)//2)*2, 2): + my_list[indx], my_list[indx + 1] = my_list[indx + 1], my_list[indx] + +print(f"result list is {my_list}") diff --git a/lesson_2/hometask/task_3.py b/lesson_2/hometask/task_3.py new file mode 100644 index 0000000..10ea97c --- /dev/null +++ b/lesson_2/hometask/task_3.py @@ -0,0 +1,30 @@ +# Пользователь вводит месяц в виде целого числа от 1 до 12. +# Сообщить к какому времени года относится месяц (зима, весна, лето, осень). +# Напишите решениЯ через list и через dict. + +number = None + +while True: + try: + number = int(input("Enter number in range from 1 to 12 >>>")) + if number in range(1, 12): + break + except ValueError: + continue +# решение через dict +# кортежи - хэшируемый тип данных +seasons_dict = {(12, 1, 2): "winter", (3, 4, 5): "spring", (6, 7, 8): "summer", (9, 10, 11): "autumn/fall"} +for month_numbers, name in seasons_dict.items(): + if number in month_numbers: + print(f"month with number {number} is {name}") + # больше исследовать нечего + break + +# решение через list +seasons_name_list = ["winter", "spring", "summer", "autumn/fall"] +seasons_month_list = [(12, 1, 2), (3, 4, 5), (6, 7, 8), (9, 10, 11)] +for month_numbers, name in zip(seasons_month_list, seasons_name_list): + if number in month_numbers: + print(f"month with number {number} is {name}") + # больше исследовать нечего + break diff --git a/lesson_2/hometask/task_4.py b/lesson_2/hometask/task_4.py new file mode 100644 index 0000000..4913797 --- /dev/null +++ b/lesson_2/hometask/task_4.py @@ -0,0 +1,9 @@ +# Пользователь вводит строку из нескольких слов, разделённых пробелами. +# Вывести каждое слово с новой строки. +# Строки необходимо пронумеровать. +# Если в слово длинное, выводить только первые 10 букв в слове. + +# Пользователь может ввести что угодно +word_list = input("Enter an ordinary string >>>").split() +for number, word in enumerate(word_list, 1): + print(f"{number} {word:.10}") diff --git a/lesson_2/hometask/task_5.py b/lesson_2/hometask/task_5.py new file mode 100644 index 0000000..79ae720 --- /dev/null +++ b/lesson_2/hometask/task_5.py @@ -0,0 +1,35 @@ +# Реализовать структуру «Рейтинг», представляющую собой +# не возрастающий набор натуральных чисел. +# У пользователя необходимо запрашивать новый элемент рейтинга. +# Если в рейтинге существуют элементы с одинаковыми значениями, +# то новый элемент с тем же значением должен разместиться после них. +# +# **Подсказка.** Например, набор натуральных чисел: 7, 5, 3, 3, 2. +# Пользователь ввел число 3. Результат: 7, 5, 3, 3, 3, 2. +# Пользователь ввел число 8. Результат: 8, 7, 5, 3, 3, 2. +# Пользователь ввел число 1. Результат: 7, 5, 3, 3, 2, 1. +# +# Набор натуральных чисел можно задать непосредственно в коде, например, my_list = [7, 5, 3, 3, 2]. + +# "...новый элемент...должен разместиться после них..." - значит, +# просто добавить элемент и сортировать список - не то, что требуется. + +my_list = [7, 5, 3, 3, 2] +number = None + +while True: + try: + number = int(input("Enter natural number >>>")) + if number >= 0: + break + except ValueError: + continue + +if number > my_list[0]: + my_list.insert(0, number) +else: + for indx in range(len(my_list) - 1, -1, -1): + if number <= my_list[indx]: + my_list.insert(indx + 1, number) + break +print(my_list) diff --git a/lesson_2/hometask/task_6.py b/lesson_2/hometask/task_6.py new file mode 100644 index 0000000..f3dd2aa --- /dev/null +++ b/lesson_2/hometask/task_6.py @@ -0,0 +1,70 @@ +# *Реализовать структуру данных «Товары». +# Она должна представлять собой список кортежей. +# Каждый кортеж хранит информацию об отдельном товаре. +# В кортеже должно быть два элемента — номер товара и словарь с параметрами +# (характеристиками товара: название, цена, количество, единица измерения). +# Структуру нужно сформировать программно, т.е. запрашивать все данные у пользователя. +# **Пример готовой структуры:** +# [ +# (1, {“название”: “компьютер”, “цена”: 20000, “количество”: 5, “eд”: “шт.”}), +# (2, {“название”: “принтер”, “цена”: 6000, “количество”: 2, “eд”: “шт.”}), +# (3, {“название”: “сканер”, “цена”: 2000, “количество”: 7, “eд”: “шт.”}) +# ] +# Необходимо собрать аналитику о товарах. +# Реализовать словарь, в котором каждый ключ — характеристика товара, +# например название, а значение — список значений-характеристик, например список названий товаров. +# **Пример:** +# { +# “название”: [“компьютер”, “принтер”, “сканер”], +# “цена”: [20000, 6000, 2000], +# “количество”: [5, 2, 7], +# “ед”: [“шт.”] +# } + +product_list = list() +# Запрашиваем данные у пользователя +while True: + try: + number = int(input("Enter the product number >>>")) + double_mark = False + # стоило бы добавить проверку дубляжей... + for item in product_list: + if item[0] == number: + double_mark = True + break + if double_mark: + print(f"Number {number} already in list") + continue + name = input("Enter the product name >>>") + price = float(input("Enter the product price >>>")) + count = int(input("Enter the product count >>>")) + value_measure = input("Enter the product measure >>>") + except ValueError as verror: + print(f"{verror}, uncorrect value") + continue + except EOFError as eof_error: + print(f"{eof_error}, now quit") + quit() + if name == "" or value_measure == "" or price < 0 or count < 0 or number < 0: + print(f"uncorrect values detected, reenter please") + continue + product_list.append((number, {'name': name, 'price': price, 'count': count, 'measure': value_measure})) + if input("Press Enter to continue or something else to break >>>") == "": + break +print(product_list) + +# Теперь парсим словарь в другой словарь +unique_dict = dict() +for values in product_list: + if len(values) < 2: + continue + product_dict = values[1] + if type(product_dict) is not dict: + continue + for key, value in product_dict.items(): + unique_list = unique_dict.setdefault(key, list()) + # судя по примеру, в массиве должны быть только уникальные значения + if value not in unique_list: + unique_list.append(value) + +print(unique_dict) From 986610525b547c4f075152dfe351b88043e8792f Mon Sep 17 00:00:00 2001 From: Mikhalev V Date: Sat, 23 Apr 2022 11:23:57 +0300 Subject: [PATCH 2/4] Empty list case fix --- lesson_2/hometask/task_5.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/lesson_2/hometask/task_5.py b/lesson_2/hometask/task_5.py index 79ae720..ad3c56d 100644 --- a/lesson_2/hometask/task_5.py +++ b/lesson_2/hometask/task_5.py @@ -24,8 +24,9 @@ break except ValueError: continue - -if number > my_list[0]: +if len(my_list) == 0: + my_list.append(number) +elif number > my_list[0]: my_list.insert(0, number) else: for indx in range(len(my_list) - 1, -1, -1): From a32f0200edb3b3ad4a14cdf8a3eabbf3ac451f07 Mon Sep 17 00:00:00 2001 From: Mikhalev V Date: Wed, 27 Apr 2022 22:03:24 +0300 Subject: [PATCH 3/4] Hometask 3 complete --- lesson_3/hometask/hometask_1.py | 33 ++++++++ lesson_3/hometask/hometask_2.py | 36 +++++++++ lesson_3/hometask/hometask_3.py | 48 ++++++++++++ lesson_3/hometask/hometask_4.py | 133 ++++++++++++++++++++++++++++++++ lesson_3/hometask/hometask_5.py | 41 ++++++++++ lesson_3/hometask/hometask_6.py | 23 ++++++ 6 files changed, 314 insertions(+) create mode 100644 lesson_3/hometask/hometask_1.py create mode 100644 lesson_3/hometask/hometask_2.py create mode 100644 lesson_3/hometask/hometask_3.py create mode 100644 lesson_3/hometask/hometask_4.py create mode 100644 lesson_3/hometask/hometask_5.py create mode 100644 lesson_3/hometask/hometask_6.py diff --git a/lesson_3/hometask/hometask_1.py b/lesson_3/hometask/hometask_1.py new file mode 100644 index 0000000..e8a436a --- /dev/null +++ b/lesson_3/hometask/hometask_1.py @@ -0,0 +1,33 @@ +# Реализовать функцию, принимающую два числа (позиционные аргументы) +# и выполняющую их деление. Числа запрашивать у пользователя, +# предусмотреть обработку ситуации деления на ноль. + +# нас интересуют только позиционные аргументы +# ни о каких именованных и позиционных аргументах речь не идёт! +def divide_numbers(num_1, num_2, /): + """ + Функция вычисления частного от деления одного числа на другое + + :param num_1: делимое + :param num_2: делитель + :return: результат деления делимого на делитель или None + """ + try: + return num_1 / num_2 + except ZeroDivisionError: + return None + + +divident = float() +denominator = float() +while True: + try: + divident = float(input("Введите числитель дроби:")) + denominator = float(input("Введите знаменатель дроби:")) + break + except ValueError: + continue + +print(f"{divident}/{denominator}={divide_numbers(divident, denominator)}") +# Тут будет ошибка! Так как аргументы строго позиционные +# print(f"{divident}/{denominator}={divide_numbers(num1 = divident, num2 = denominator)}") diff --git a/lesson_3/hometask/hometask_2.py b/lesson_3/hometask/hometask_2.py new file mode 100644 index 0000000..ca09521 --- /dev/null +++ b/lesson_3/hometask/hometask_2.py @@ -0,0 +1,36 @@ +# Реализовать функцию, принимающую несколько параметров, описывающих данные пользователя: +# имя, фамилия, год рождения, город проживания, email, телефон. +# Функция должна принимать параметры как именованные аргументы. +# Реализовать вывод данных о пользователе одной строкой. + +import datetime + + +# Только именованные аргументы! +# значения по умолчанию не придумал) +def get_user_data(*, name, surname, birthdate, location, email=None, phone=None): + """ + Возвращает информацию о пользователе на основе задаваемых данных. + + :param name: имя пользователя + :param surname: фамилия пользователя + :param birthdate: дата рождения пользователя + :param location: местоположение пользователя + :param email: электронная почта пользователя + :param phone: телефон пользователя + :return: информация о пользователе в одной строке + """ + return f"Oh that obnoxious user {name} {surname}! " \ + f"He was born in {birthdate}. " \ + f"Now {name} located on {location}. " \ + f"You may reach {name} by phone {phone} or email {email}" + + +print(get_user_data(name="Louis", birthdate=datetime.date(year=1973, month=2, day=11), + surname="Cachet", location="Demont", + phone="+33-61-666-14-88", email="christian@jw.fr")) + +# ошибка! +# print(get_user_data("Louis", birthdate=datetime.date(year=1973, month=2, day=11), +# surname="Cachet", location="Demont", +# phone="+33-61-666-14-88", email="christian@jw.fr")) diff --git a/lesson_3/hometask/hometask_3.py b/lesson_3/hometask/hometask_3.py new file mode 100644 index 0000000..3ee1651 --- /dev/null +++ b/lesson_3/hometask/hometask_3.py @@ -0,0 +1,48 @@ +# Реализовать функцию my_func(), которая +# принимает три позиционных аргумента, и +# возвращает сумму наибольших двух аргументов. +import math + + +# вспомогательная функция +def calc_sum(*args): + """ + Вычисляет сумму задаваемых чисел. + При некорректном типе аргументов возвращает минус бесконечность + + :param args: задаваемые числа + :return: сумму задаваемых чисел или -math.inf + """ + try: + return sum(args) + except TypeError: + return -math.inf + + +# нас интересуют только позиционные аргументы, +# ни о каких именованных и позиционных аргументах речь не идёт! +def my_func(arg_1, arg_2, arg_3, /): + """ + Вычисляет сумму наибольших двух аргументов. + При некорректном типе двух задаваемых аргументов возвращает минус бесконечность + + :param arg_1: некое целое или дробное число + :param arg_2: некое целое или дробное число + :param arg_3: некое целое или дробное число + :return: сумму наибольших двух аргументов или -math.inf + """ + return max(calc_sum(arg_1, arg_2), + calc_sum(arg_1, arg_3), + calc_sum(arg_2, arg_3)) + + +def lazy_print(arg_1, arg_2, arg_3): + print(f"Max sum of two elements " + f" between {arg_1}, {arg_2}, {arg_3} is " + f"{my_func(arg_1, arg_2, arg_3)}") + + +lazy_print('ahh', 2, 3) +lazy_print(3, 1, 4) +lazy_print(3.13, 5, 9.11) +lazy_print('ahh', 'fggh', 3) diff --git a/lesson_3/hometask/hometask_4.py b/lesson_3/hometask/hometask_4.py new file mode 100644 index 0000000..5c40be7 --- /dev/null +++ b/lesson_3/hometask/hometask_4.py @@ -0,0 +1,133 @@ +# Программа принимает действительное положительное число x и целое отрицательное число y. +# Необходимо выполнить возведение числа x в степень y. +# Задание необходимо реализовать в виде функции my_func(x, y). +# При решении задания необходимо обойтись без встроенной функции возведения числа в степень. +# ** Подсказка:** попробуйте решить задачу двумя способами. +# Первый — возведение в степень с помощью оператора **. +# Второй — более сложная реализация без оператора **, предусматривающая использование цикла. +import math + + +def my_func_var_1(base, exp): + """ + Алгоритм возведения числа в степень. + + :param base: Число, которое требуется возвести в степень + :param exp: степень, в которую требуется возвести число + :return: число, возведенное в степень + """ + return base ** exp + + +# a^x == exp(x*ln(a)) +# универсальна, расчёт дробных корней прост +# если нет претензий к math.log и math.exp +def my_func_var_2(base, exp): + """ + Алгоритм возведения числа в степень. + Базируеся на формуле a**x == exp(x*ln(a)) + + :param base: Положительное число, которое требуется возвести в степень + :param exp: степень, в которую требуется возвести число + :return: число, возведенное в степень + """ + if base < 0: + raise ValueError("base cannot be negative!") + return math.exp(exp * math.log(base)) + + +def my_func_var_3(base, exp): + """ + Иттерационный алгоритм возведения числа в целую степень. + + :param base: Число, которое требуется возвести в степень + :param exp: степень, в которую требуется возвести число + :return: число, возведенное в степень + """ + if type(exp) != int: + raise TypeError("Uncorrect exponent type") + sign = -1 if (exp < 0) else 1 + res = 1 + for step in range(exp * sign): + res *= base + return res if sign == 1 else 1 / res + + +def my_func_var_4(base, exp): + """ + Быстрый алгоритм возведения числа в целую степень. + Базируется на предствалении числа в бинарном виде + и формулах: + -> a**(x*y) = (a**x)**y; + -> a**(x+y) = (a**x)*(a**y). + Выполнен в соответствие с: + https://ru.wikipedia.org/wiki/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC%D1%8B_%D0%B1%D1%8B%D1%81%D1%82%D1%80%D0%BE%D0%B3%D0%BE_%D0%B2%D0%BE%D0%B7%D0%B2%D0%B5%D0%B4%D0%B5%D0%BD%D0%B8%D1%8F_%D0%B2_%D1%81%D1%82%D0%B5%D0%BF%D0%B5%D0%BD%D1%8C + + :param base: Число, которое требуется возвести в степень + :param exp: целая степень, в которую требуется возвести число + :return: число, возведенное в степень + """ + if type(exp) != int: + raise TypeError("Uncorrect exponent type") + sign = -1 if (exp < 0) else 1 + bin_repr = bin(exp * sign) + res = 1 + for bit in bin_repr[2:len(bin_repr)]: + res *= res * base if bit == '1' else res + return res if sign == 1 else 1 / res + + +# BONUS: +def my_math_root(base, exp, max_error=1e-10): + """ + Алгоритм оценки корня целой степени из числа. + Выполнен в соответствие с: + https://ru.wikipedia.org/wiki/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%BD%D0%B0%D1%85%D0%BE%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D1%8F_%D0%BA%D0%BE%D1%80%D0%BD%D1%8F_n-%D0%BD%D0%BE%D0%B9_%D1%81%D1%82%D0%B5%D0%BF%D0%B5%D0%BD%D0%B8 + + :param base: Число, из которого требуется извлечь корень + :param exp: целая степень корня + :param max_error: требуемая точность оценки корня + :return: оценка корня заданной степени из числа или + None, если корень с требуемой точностью оценить не удалось + """ + if type(exp) != int: + raise TypeError("Uncorrect exponent type") + if exp % 2 == 0 and base < 0: + raise ValueError("Cannot estimate negative base root by even exp") + if exp == 0: + return 1 + new_exp = exp if exp > 0 else -exp + xk = x0 = base + # ограничитель цикла + max_cycle_number = 3000 + for i in range(max_cycle_number): + xk = (1 / new_exp) * ((new_exp - 1) * xk + base / my_func_var_4(xk, new_exp - 1)) + if math.fabs(xk - x0) < max_error: + # сходимость достигнута + return xk if exp > 0 else 1 / xk + x0 = xk + # Если количество итераций превыщено, результат не гарантирован! + return None + + +def test_my_funcs(x, y): + var_1 = my_func_var_1(x, y) +# var_2 = my_func_var_2(x, y) + var_3 = my_func_var_3(x, y) + var_4 = my_func_var_4(x, y) + root = my_math_root(x, y) + nominal = pow(x, y) + root_nominal = pow(x, 1 / y) + print(f"Results of power {x} to {y}:\n" + f"variant 1 is {var_1}, error to pow is {math.fabs(var_1 - nominal)}\n" +# f"variant 2 is {var_2}, error to pow is {math.fabs(var_2 - nominal)}\n" + f"variant 3 is {var_3}, error to pow is {math.fabs(var_3 - nominal)}\n" + f"variant 4 is {var_4}, error to pow is {math.fabs(var_4 - nominal)}") + print(f"Special test: my_math_root {x} by {y} of power {x} to {1 / y} (same as root {x} by {y}):") + print(f"my_math_root is {root}") + print(f"error to pow is {math.fabs(root - root_nominal)}") + + +test_my_funcs(50.4564654546, -31) + +print(my_math_root(5.11568, -2, 1e-30) - pow(5.11568, -1 / 2)) diff --git a/lesson_3/hometask/hometask_5.py b/lesson_3/hometask/hometask_5.py new file mode 100644 index 0000000..abb47c0 --- /dev/null +++ b/lesson_3/hometask/hometask_5.py @@ -0,0 +1,41 @@ +# Программа запрашивает у пользователя строку чисел, разделенных пробелом. +# При нажатии Enter должна выводиться сумма чисел. +# Пользователь может продолжить ввод чисел, разделенных пробелом и снова нажать Enter. +# Сумма вновь введенных чисел будет добавляться к уже подсчитанной сумме. +# Но если вместо числа вводится специальный символ, выполнение программы завершается. +# Если специальный символ введен после нескольких чисел, то +# вначале нужно добавить сумму этих чисел к полученной ранее сумме и после этого завершить программу. + +def get_number_by_string(string_number): + """ + Функция преобразования строки к какому-либо числовому формату + + :param string_number: число в строковом виде + :return: число в числовом формате + """ + try: + return int(string_number) + except ValueError: + # если и тут ошибка, пробрасываем + # во внешний код + return float(string_number) + +# если введен нечисловой символ (но и не специальный) после нескольких чисел, то +# - вначале нужно добавить сумму этих чисел к полученной ранее сумме; +# - пользователь может продолжить ввод чисел, разделенных пробелом и снова нажать Enter. +final_sum = 0 +while True: + input_string = input("Enter the numbers string with ' ' as delimiter; in '$' in string, nothing to be more >>>") + input_array = input_string.split() + try: + # Подсчёт суммы ведётся до первого нечислового символа ('4d' - тоже не числовой символ) + for element in input_array: + # возможно, пользователя будет интересовать + # именно сумма целых чисел, а плавающая запятая - раздражать + final_sum += get_number_by_string(element) + except ValueError: + # считаем, что, например, '3.12$' - уже не число + if '$' in input_string: + break + finally: + print("Current sum is ", final_sum) \ No newline at end of file diff --git a/lesson_3/hometask/hometask_6.py b/lesson_3/hometask/hometask_6.py new file mode 100644 index 0000000..c6028cf --- /dev/null +++ b/lesson_3/hometask/hometask_6.py @@ -0,0 +1,23 @@ +# Реализовать функцию int_func(), принимающую слово из маленьких латинских букв и возвращающую его же, +# но с прописной первой буквой. +# Например, print(int_func(‘text’)) -> Text. +# Продолжить работу над заданием. +# В программу должна попадать строка из слов, разделенных пробелом. +# Каждое слово состоит из латинских букв в нижнем регистре. +# Сделать вывод исходной строки, но каждое слово должно начинаться с заглавной буквы. +# Необходимо использовать написанную ранее функцию int_func(). + +def int_func(string): + return string.capitalize() + + +# строки разделены пробелом +string_array = input("Input a string >>>").split(" ") + +for element_index in range(len(string_array)): + string_element = string_array[element_index] + if " " in string_element or string_element.isdigit(): + continue + string_array[element_index] = int_func(string_element) + +print(' '.join(string_array)) From 61d150ca10b8329b7e0bfac3e8d192e94ca89a07 Mon Sep 17 00:00:00 2001 From: Mikhalev V Date: Sun, 1 May 2022 19:35:56 +0300 Subject: [PATCH 4/4] 4th hometask complete --- lesson_4/hometask/task_1.py | 31 +++++++++++++++++++ lesson_4/hometask/task_2.py | 32 ++++++++++++++++++++ lesson_4/hometask/task_3.py | 6 ++++ lesson_4/hometask/task_4.py | 20 +++++++++++++ lesson_4/hometask/task_5.py | 13 ++++++++ lesson_4/hometask/task_6_part_a.py | 48 ++++++++++++++++++++++++++++++ lesson_4/hometask/task_6_part_b.py | 37 +++++++++++++++++++++++ lesson_4/hometask/task_7.py | 37 +++++++++++++++++++++++ 8 files changed, 224 insertions(+) create mode 100644 lesson_4/hometask/task_1.py create mode 100644 lesson_4/hometask/task_2.py create mode 100644 lesson_4/hometask/task_3.py create mode 100644 lesson_4/hometask/task_4.py create mode 100644 lesson_4/hometask/task_5.py create mode 100644 lesson_4/hometask/task_6_part_a.py create mode 100644 lesson_4/hometask/task_6_part_b.py create mode 100644 lesson_4/hometask/task_7.py diff --git a/lesson_4/hometask/task_1.py b/lesson_4/hometask/task_1.py new file mode 100644 index 0000000..932d36e --- /dev/null +++ b/lesson_4/hometask/task_1.py @@ -0,0 +1,31 @@ +# Реализовать скрипт, в котором должна быть предусмотрена +# функция расчета заработной платы сотрудника. +# В расчете необходимо использовать формулу: +# (выработка в часах*ставка в час) + премия. +# Для выполнения расчета для конкретных значений необходимо запускать скрипт с параметрами. +from sys import argv + + +# calculate_salary = lambda work_hours, rate_per_hour, bonus: work_hours * rate_per_hour + bonus +def calculate_salary(work_hours: float, rate_per_hour: float, bonus: float): + """ + Расчёт ЗП сотрудника + + :param work_hours: отработанные за месяц часы, [ч] + :param rate_per_hour: ставка сотрудника за час, [денег/ч] + :param bonus: премия, [деньги] + :return: ЗП сотрудника за месяц, [деньги] + """ + return work_hours * rate_per_hour + bonus + + +try: + filepath, work_hours, rate_per_hour, bonus, *others = argv + work_hours = float(work_hours) + rate_per_hour = float(rate_per_hour) + bonus = float(bonus) +except ValueError: + print("Sorry, it's need a 3 float parameters for calculations!") + exit() + +print(f"Сотрудник заработал {calculate_salary(work_hours, rate_per_hour, bonus)} за месяц") diff --git a/lesson_4/hometask/task_2.py b/lesson_4/hometask/task_2.py new file mode 100644 index 0000000..a0a1f24 --- /dev/null +++ b/lesson_4/hometask/task_2.py @@ -0,0 +1,32 @@ +# Представлен список чисел. +# Необходимо вывести элементы исходного списка, значения которых больше предыдущего элемента. +# +# **Подсказка:** элементы, удовлетворяющие условию, оформить в виде списка. +# Для формирования списка использовать генератор. +# **Пример исходного списка:** [300, 2, 12, 44, 1, 1, 4, 10, 7, 1, 78, 123, 55]. +# **Результат:** [12, 44, 4, 10, 78, 123]. +# origin_list = [300, 2, 12, 44, 44.5, 1, 1, 4, 10, 7, 1, 78, 123, 55] + +def get_number_by_string(string_number: str): + """ + Функция преобразования строки к какому-либо числовому формату + + :param string_number: число в строковом виде + :return: число в числовом формате + """ + try: + return int(string_number) + except ValueError: + # если и тут ошибка, пробрасываем во внешний код + return float(string_number) + + +# не хочу, чтобы это запускалось в других модулях +# https://docs.python.org/3/library/__main__.html +if __name__ == "__main__": + input_string_array = input("Enter the numbers string with ' ' as delimiter>>>").split() + origin_list = [get_number_by_string(num) for num in input_string_array] + # Выглядит красивее + # print([element for i, element in enumerate(origin_list) if element > origin_list[i - 1 if i > 0 else 0]]) + # Зато тут на один шаг меньше + print([origin_list[i] for i in range(1, len(origin_list)) if origin_list[i] > origin_list[i - 1]]) diff --git a/lesson_4/hometask/task_3.py b/lesson_4/hometask/task_3.py new file mode 100644 index 0000000..f46d1ed --- /dev/null +++ b/lesson_4/hometask/task_3.py @@ -0,0 +1,6 @@ +# Для чисел в пределах от 20 до 240 найти числа, кратные 20 или 21. +# Необходимо решить задание в одну строку. +# **Подсказка:** использовать функцию range() и генератор. + +# Полагаю, что 240 включено в интервал +print([x for x in range(20, 241) if x % 20 == 0 or x % 21 == 0]) diff --git a/lesson_4/hometask/task_4.py b/lesson_4/hometask/task_4.py new file mode 100644 index 0000000..174abf8 --- /dev/null +++ b/lesson_4/hometask/task_4.py @@ -0,0 +1,20 @@ +# Представлен список чисел. +# Определить элементы списка, не имеющие повторений. +# Сформировать итоговый массив чисел, соответствующих требованию. +# Элементы вывести в порядке их следования в исходном списке. +# Для выполнения задания обязательно использовать генератор. +# +# **Пример исходного списка:** +# [2, 2, 2, 7, 23, 1, 44, 44, 3, 2, 10, 7, 4, 11]. +# **Результат:** +# [23, 1, 3, 10, 4, 11] + +import task_2 + +input_string_array = input("Enter the numbers string with ' ' as delimiter>>>").split() +origin_list = [task_2.get_number_by_string(num) for num in input_string_array] +print(origin_list) + +# origin_list = [2, 2, 2, 7, 23, 1, 44, 44, 3, 2, 10, 7, 4, 11] + +print([x for x in origin_list if origin_list.count(x) == 1]) diff --git a/lesson_4/hometask/task_5.py b/lesson_4/hometask/task_5.py new file mode 100644 index 0000000..30abe6c --- /dev/null +++ b/lesson_4/hometask/task_5.py @@ -0,0 +1,13 @@ +# Реализовать формирование списка, используя функцию range() и возможности генератора. +# В список должны войти четные числа от 100 до 1000 (включая границы). +# Необходимо получить результат вычисления произведения всех элементов списка. +# +# **Подсказка:** использовать функцию reduce(). +import functools as f_tools + +# even_numbers = [num for num in range(100, 1001) if num % 2 == 0] +# так быстрее +even_numbers = [num for num in range(100, 1001, 2)] + +print(f"Multiplication of all even number" + f"in range 100 to 1000 is {f_tools.reduce(lambda x, y: x * y, even_numbers)}") diff --git a/lesson_4/hometask/task_6_part_a.py b/lesson_4/hometask/task_6_part_a.py new file mode 100644 index 0000000..4429373 --- /dev/null +++ b/lesson_4/hometask/task_6_part_a.py @@ -0,0 +1,48 @@ +# Реализовать два небольших скрипта: +# а) итератор, генерирующий целые числа, начиная с указанного. +# +# !!!Note: так скрипт или всё-таки итератор? Итератор - это, разве, не объект?) ) +# +# **Подсказка:** использовать функцию count() и cycle() модуля itertools. +# Обратите внимание, что создаваемый цикл не должен быть бесконечным. +# Необходимо предусмотреть условие его завершения (Условие на пользователе или на создателе скрипта?). +# +# Например, в первом задании выводим целые числа, начиная с 3, +# а при достижении числа 10 завершаем цикл. + +# Как я понял эту часть задания: +# Пишем скрипт, использующий itertools.count +# Используем эту функцию в цикле в скрипте. +# Цикл прерывает пользователь. Или моё какое-то условие. +import itertools as itools + + +def my_count(start_number: int, step: int = 1): + """Одно из представлений itertools.count""" + current_number = start_number + while True: + yield current_number + current_number += step + + +# не хочу, чтобы это запускалось в других модулях +# https://docs.python.org/3/library/__main__.html +if __name__ == "__main__": + origin_number = 0 + # Запрашиваем + while True: + try: + origin_number = int(input("Enter origin integer number for generating a sequence >>>")) + max_cycle_number = int(input("Enter max cycle count >>>")) + except ValueError: + print("That's not integer number! Try again.") + continue + break + count = 0 + for num in itools.count(origin_number): +# for num in my_count(origin_number): + count += 1 + if count > max_cycle_number: + break + print(num) + print("That's all, folks!") diff --git a/lesson_4/hometask/task_6_part_b.py b/lesson_4/hometask/task_6_part_b.py new file mode 100644 index 0000000..cef6dfe --- /dev/null +++ b/lesson_4/hometask/task_6_part_b.py @@ -0,0 +1,37 @@ +# Реализовать два небольших скрипта: +# б) итератор, повторяющий элементы некоторого списка, определенного заранее. +# +# !!!Note: так скрипт или всё-таки итератор? Итератор - это, разве, не объект?) ) +# +# **Подсказка:** использовать функцию count() и cycle() модуля itertools. +# Обратите внимание, что создаваемый цикл не должен быть бесконечным. +# Необходимо предусмотреть условие его завершения.(Условие на пользователе или на создателе скрипта?). +# +# Например, во втором также необходимо предусмотреть условие, +# при котором повторение элементов списка будет прекращено. +import itertools as itools + +def my_cycle(iterate): + while iterate: + for element in iterate: + yield element + + +# https://docs.python.org/3/library/__main__.html +if __name__ == "__main__": + input_string_array = input("Enter the strings with ' ' as delimiter>>>").split() + while True: + try: + max_cycle_number = int(input("Enter max cycle count >>>")) + except ValueError: + print("That's not integer number! Try again.") + continue + break + count = 0 + for element in itools.cycle(input_string_array): +# for element in my_cycle(input_string_array): + count += 1 + if count > max_cycle_number: + break + print(element) + print("That's all, folks!") \ No newline at end of file diff --git a/lesson_4/hometask/task_7.py b/lesson_4/hometask/task_7.py new file mode 100644 index 0000000..a1ec248 --- /dev/null +++ b/lesson_4/hometask/task_7.py @@ -0,0 +1,37 @@ +# Реализовать генератор с помощью функции с ключевым словом yield, создающим очередное значение. +# При вызове функции должен создаваться объект-генератор. +# Функция должна вызываться следующим образом: for el in fact(n). +# Функция отвечает за получение факториала числа, а в цикле необходимо выводить только первые n чисел, +# начиная с 1! и до n!. +# +# **Подсказка:** факториал числа n — произведение чисел от 1 до n. +# Например, факториал четырёх 4! = 1 * 2 * 3 * 4 = 24. + +def fact(n: int): + if n < 0: + raise ValueError("Factorial not defined for a negative value!") + if n == 0: + yield 1 + current_value = 1 + for number in range(1, n + 1): + current_value *= number + yield current_value + + +origin_number = 0 +while True: + try: + origin_number = int(input("Enter non-negative integer number for generating a factorial sequence >>>")) + except ValueError: + print("That's not integer number! Try again.") + continue + break + +# creates generator object for checks +gen_obj = fact(origin_number) +print(f"fact({origin_number}) type is {type(gen_obj)}") +count = 0 +# for el in gen_obj: # то же самое, но не по заданию +for el in fact(origin_number): + count += 1 + print(f"{count}! : {el}")