diff --git a/lesson02.py b/lesson02.py new file mode 100644 index 0000000..26988e0 --- /dev/null +++ b/lesson02.py @@ -0,0 +1,337 @@ +# Lesson 1 +from datetime import date + +current_date = date.today() +# 1. Создать список и заполнить его элементами различных типов данных. Реализовать скрипт проверки типа данных каждого элемента. +# Использовать функцию type() для проверки типа. Элементы списка можно не запрашивать у пользователя, а указать явно, в программе. +print("==================== 1 ====================") +print( + "Задача: Создать список и заполнить его элементами различных типов данных. " + "Реализовать скрипт проверки типа данных каждого элемента. " + "Использовать функцию type() для проверки типа. " + "Элементы списка можно не запрашивать у пользователя, а указать явно, в программе.") +print("===========================================") + +l = [1, 2.34, "test", '123', [1, 3, 4], (1, 3, 4, True), {"str", '123', 123, (2, "3", 4.23)}, None, False, + frozenset({1, '2', 3.4}), {'q': 1, 'w': '2', 'e': 3.33}] + + +def show_type_of_elements(li, addstr=''): + if isinstance(li, dict): + for el, v in li.items(): + print(f"{addstr}{el}={v} is {type(v)}") + if isinstance(v, list) or isinstance(v, tuple) or isinstance(v, set) or isinstance(v, frozenset) \ + or isinstance(v, dict): + show_type_of_elements(v, addstr + "|--> ") + else: + for el in li: + print(f"{addstr}{el} is {type(el)}") + if isinstance(el, list) or isinstance(el, tuple) or isinstance(el, set) or isinstance(el, frozenset) \ + or isinstance(el, dict): + show_type_of_elements(el, addstr + "|--> ") + + +show_type_of_elements(l) +input('Нажмите Enter для продолжения...') + +# 2. Для списка реализовать обмен значений соседних элементов, т.е. Значениями обмениваются элементы с индексами 0 и 1, 2 и 3 и т.д. +# При нечетном количестве элементов последний сохранить на своем месте. Для заполнения списка элементов необходимо использовать функцию input(). +print("==================== 2 ====================") +print("Задача: Для списка реализовать обмен значений соседних элементов, т.е. " + "Значениями обмениваются элементы с индексами 0 и 1, 2 и 3 и т.д. " + "При нечетном количестве элементов последний сохранить на своем месте. " + "Для заполнения списка элементов необходимо использовать функцию input()") +print("===========================================") + +li = [] +# n = 0 +# while True: +# try: +# n = abs(int(input('Введите количество элементов в списке: '))) +# break +# except Exception as e: +# print('Вы ввели неверное число! Попробуйте снова.') +# +# for i in range(0, n): +# while True: +# try: +# el = input(f'Введите {i+1} элемент списка: ') +# break +# except Exception as e: +# print('Вы ввели неверное значение! Попробуйте снова.') +# li.append(el) + +while True: + try: + li = [item for item in input("Введите элементы списка разделенные пробелами: ").split()] + break + except Exception as e: + print('Вы ввели неверные значение! Попробуйте снова.') + +print(f'Введенный Вами список: {li}') + + +def replace_list_elements_12(l): + for i in range(len(l) // 2): + l[2 * i], l[2 * i + 1] = l[2 * i + 1], l[2 * i] + return l + + +print(f'Результирующий список: {replace_list_elements_12(li)}') +input('Нажмите Enter для продолжения...') + +# 3. Пользователь вводит месяц в виде целого числа от 1 до 12. +# Сообщить к какому времени года относится месяц (зима, весна, лето, осень). +# Напишите решения через list и через dict. +print("==================== 3 ====================") +print("Задача: Пользователь вводит месяц в виде целого числа от 1 до 12. " + "Сообщить к какому времени года относится месяц (зима, весна, лето, осень). " + "Напишите решения через list и через dict.") +print("===========================================") + +n = 0 +while True: + try: + n = abs(int(input('Введите номер месяца: '))) + if n < 1 or n > 12: + raise Exception("Неврный номер месяца!") + break + except Exception as e: + print('Вы ввели неверный номер месяца! Попробуйте снова.') + + +def get_month_info_with_list(d: int): + m = '' + s = '' + seasons = ['Зима', 'Весна', 'Лето', 'Осень'] + smnths = [[1, 2, 12], [3, 4, 5], [6, 7, 8], [9, 10, 11]] + months = 'Январь Февраль Март Апрель Май Июнь Июль Август Сентябрь Октябрь Ноябрь Декабрь'.split() + for mgr in smnths: + if d in mgr: + m = months[d - 1] + s = seasons[smnths.index(mgr)] + print(f"Введенный Вами месяц: {d} - это {months[d - 1]} сезон: {seasons[smnths.index(mgr)]}") + break + return m, s + + +def get_month_info_with_dict(d: int): + m = '' + s = '' + seasons = {'Зима': [1, 2, 12], 'Весна': [3, 4, 5], 'Лето': [6, 7, 8], 'Осень': [9, 10, 11]} + months = {1: 'Январь', 2: 'Февраль', 3: 'Март', 4: 'Апрель', 5: 'Май', 6: 'Июнь', 7: 'Июль', 8: 'Август', + 9: 'Сентябрь', 10: 'Октябрь', 11: 'Ноябрь', 12: 'Декабрь'} + m = months.get(d) + for key, val in seasons.items(): + if d in val: + s = key + print(f"Введенный Вами месяц: {d} - это {months.get(d)} сезон: {key}") + break + return m, s + + +get_month_info_with_list(n) +get_month_info_with_dict(n) + +input('Нажмите Enter для продолжения...') + +# 4. Пользователь вводит строку из нескольких слов, разделённых пробелами. Вывести каждое слово с новой строки. +# Строки необходимо пронумеровать. Если в слово длинное, выводить только первые 10 букв в слове. +print("==================== 4 ====================") +print("Задача: Пользователь вводит строку из нескольких слов, разделённых пробелами. " + "Вывести каждое слово с новой строки. Строки необходимо пронумеровать. " + "Если в слово длинное, выводить только первые 10 букв в слове.") +print("===========================================") +s = input('Введите строку из нескольких слов, разделённых пробелами: ') +l = s.split() +for v in l: + print(f"{l.index(v)+1}) {(v, v[0:10]+'...')[len(v) > 10]}") + +input('Нажмите Enter для продолжения...') + +# 5. Реализовать структуру «Рейтинг», представляющую собой не возрастающий набор натуральных чисел. +# У пользователя необходимо запрашивать новый элемент рейтинга. +# Если в рейтинге существуют элементы с одинаковыми значениями, то новый элемент с тем же значением должен разместиться после них. +# Подсказка. Например, набор натуральных чисел: 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]. +print("==================== 5 ====================") +print("Задача: Реализовать структуру «Рейтинг», представляющую собой не возрастающий набор натуральных чисел. " + "У пользователя необходимо запрашивать новый элемент рейтинга. " + "Если в рейтинге существуют элементы с одинаковыми значениями, " + "то новый элемент с тем же значением должен разместиться после них.") +print("===========================================") + + +def set_last_index_in_list(lst, nmb, pos=0): + index = -1 + el_is_appended = False + for nm in lst: + if nm < nmb: + index = lst.index(nm) + lst.insert(index, nmb) + el_is_appended = True + break + if not el_is_appended: + lst.append(nmb) + index = len(lst) - 1 + return index, lst + + +li = [7, 4, 4, 3, 2] +print(f'Текущий реитинг {li}') +num_entered = True +while num_entered: + n = 0 + while True: + try: + s = input('Введите значение для рейтинга или exit для выхода: ') + if s.lower() == 'exit': + num_entered = False + break + n = abs(int(s)) + break + except Exception as e: + print('Вы ввели неверное число! Попробуйте снова.') + if num_entered: + # приравнивание li к lst не обязательно, т.к. они ссылаются на один и тот же участок памяти (li is lst) + inx, li = set_last_index_in_list(li, n) + print(f"Вы ввели число {n}, добавлено в рейтинг под индексом {inx}. Результат: {li}") + +input('Нажмите Enter для продолжения...') + +# 6. * Реализовать структуру данных «Товары». Она должна представлять собой список кортежей. Каждый кортеж хранит информацию об отдельном товаре. +# В кортеже должно быть два элемента — номер товара и словарь с параметрами (характеристиками товара: название, цена, количество, единица измерения). +# Структуру нужно сформировать программно, т.е. запрашивать все данные у пользователя. +# Пример готовой структуры: +# [ +# +# (1, {“название”: “компьютер”, “цена”: 20000, “количество”: 5, “eд”: “шт.”}), +# (2, {“название”: “принтер”, “цена”: 6000, “количество”: 2, “eд”: “шт.”}), +# (3, {“название”: “сканер”, “цена”: 2000, “количество”: 7, “eд”: “шт.”}) +# +# ] +# Необходимо собрать аналитику о товарах. Реализовать словарь, в котором каждый ключ — характеристика товара, например название, +# а значение — список значений-характеристик, например список названий товаров. +# Пример: +# { +# +# “название”: [“компьютер”, “принтер”, “сканер”], +# “цена”: [20000, 6000, 2000], +# “количество”: [5, 2, 7], +# “ед”: [“шт.”] +# +# } +print("==================== 6 ====================") +print("Задача: Реализовать структуру данных «Товары». Она должна представлять собой список кортежей. " + "Каждый кортеж хранит информацию об отдельном товаре. В кортеже должно быть два элемента — номер товара " + "и словарь с параметрами (характеристиками товара: название, цена, количество, единица измерения). " + "Структуру нужно сформировать программно, т.е. запрашивать все данные у пользователя.") +print("===========================================") +goods_list = [ + (1, {'Наменование': 'Картошка', 'Цена': 13.13, 'Количество': 100.0, 'Еденица измерения': 'кг'}), + (2, {'Наменование': 'Морковь', 'Цена': 12.1, 'Количество': 4.7, 'Еденица измерения': 'кг'}), + (3, {'Наменование': 'Лук', 'Цена': 45.32, 'Количество': 2.45, 'Еденица измерения': 'кг'}) +] +goods_analitics = {} + +def add_new_goods(): + name = '' + while True: + try: + name = input('Введите наименование товара: ') + if name is None or len(name.strip()) < 3: + raise Exception("Неверное наименование!") + break + except Exception as e: + print('Вы ввели неверное наименование! Наименование не может быть пустым и должно содержать минимум 3 символа, не считая пробелов. Попробуйте снова.') + price = 0.00 + while True: + try: + price = abs(float(input('Введите цену товара: '))) + break + except Exception as e: + print('Вы ввели неверную сумму! Попробуйте снова.') + cnt = 0.00 + while True: + try: + cnt = abs(float(input('Введите количество товара: '))) + break + except Exception as e: + print('Вы ввели неверное количество! Попробуйте снова.') + measure = '' + while True: + try: + measure = input('Введите еденицу измерения: ') + if measure is None or len(name.strip()) < 1: + raise Exception("Неверная еденица измерения!") + break + except Exception as e: + print( + 'Вы ввели неверную еденицу измерения! Еденица измерения не может быть пустой и должна содержать минимум 1 символ, не считая пробелов. Попробуйте снова.') + print(f"Вы ввели товар: Наменование - {name}; Цена - {price}; Количество - {cnt}; Еденица измерения - {measure}. ") + add_act = '' + while True: + try: + add_act = input( + 'Добавить указанный товар в каталог (Y/N): ') + if add_act is None or add_act.lower() not in ['y', 'n']: + raise Exception("Неверное действие!") + elif add_act.lower() == 'y': + goods_item = (len(goods_list)+1, {"Наменование": name, "Цена": price, "Количество": cnt, "Еденица измерения": measure}) + goods_list.append(goods_item) + print('Товар успешно добавлен в каталог.') + break + except Exception as e: + print('Вы ввели неверное действие! Попробуйте снова.') + + +def print_goods(goods_list_): + print() + print("Список товаров") + for v in goods_list_: + print(f"{v[0]} - {v[1]}") + print() + + +def get_goods_analitics(goods_list_): + goods_analitics_ = {} + for v in goods_list_: + for key, val in v[1].items(): + if key not in goods_analitics_.keys(): + goods_analitics_[key] = [] + if val not in goods_analitics_[key]: + goods_analitics_[key].append(val) + return goods_analitics_ + + +def print_analitics(goods_analitics_): + print() + print("Аналитика по товарам") + for key, val in goods_analitics_.items(): + print(f"{key}: {val}") + print() + + +action = '' +while True: + try: + action = input('Выберите действие (1/add - добавить товар; 2/list - показать список товаров; 3/analitics - показать aналитику по товарам; 4/exit - выход): ') + if action.lower() in ['1', 'add']: + add_new_goods() + elif action.lower() in ['2', 'list']: + print_goods(goods_list) + elif action.lower() in ['3', 'analitics']: + goods_analitics = get_goods_analitics(goods_list) + print_analitics(goods_analitics) + elif action.lower() in ['4', 'exit']: + break + else: + raise Exception("Неверное действие!") + except Exception as e: + print(e) + print('Вы ввели неверное действие! Попробуйте снова.') + +input('Нажмите Enter для продолжения...')