From fc1aa39fdbfd872fe46dc7bbbacf2587ae578dba Mon Sep 17 00:00:00 2001 From: Dmitrii Uzunov Date: Fri, 24 Nov 2023 00:07:04 +0300 Subject: [PATCH 1/2] homework1 --- 1_if1.py | 24 +++++++++++++++++++---- 2_if2.py | 25 ++++++++++++++++++++---- 3_for.py | 28 +++++++++++++++++++++++--- 4_while1.py | 13 ++++++++----- 5_while2.py | 16 +++++++++++---- 6_exception1.py | 21 ++++++++++++++------ 7_exception2.py | 33 ++++++++++++++++++++++++------- 8_ephem_bot.py | 52 +++++++++++++++++++++++++++---------------------- 8 files changed, 156 insertions(+), 56 deletions(-) diff --git a/1_if1.py b/1_if1.py index be736084..fb44a55b 100644 --- a/1_if1.py +++ b/1_if1.py @@ -4,22 +4,38 @@ Условный оператор: Возраст -* Попросить пользователя ввести возраст при помощи input и положить +* Попросить пользователя ввести возраст при помощи input и положить результат в переменную -* Написать функцию, которая по возрасту определит, чем должен заниматься пользователь: +* Написать функцию, которая по возрасту определит, чем должен заниматься пользователь: учиться в детском саду, школе, ВУЗе или работать -* Вызвать функцию, передав ей возраст пользователя и положить результат +* Вызвать функцию, передав ей возраст пользователя и положить результат работы функции в переменную * Вывести содержимое переменной на экран """ + def main(): """ Эта функция вызывается автоматически при запуске скрипта в консоли В ней надо заменить pass на ваш код """ - pass + age = int(input('Введите ваш возраст пожалуйста: ').strip()) + what_to_do = choice_of_occupation(age) + print(what_to_do) + + +def choice_of_occupation(age: int) -> str: + if age <= 6: + occupation = 'учиться в детском саду' + elif 6 < age <= 17: + occupation = 'учиться в школе' + elif 17 < age <= 22: + occupation = 'учиться в ВУЗе' + else: + occupation = 'работать' + return occupation + if __name__ == "__main__": main() diff --git a/2_if2.py b/2_if2.py index 0f1644f3..b21bf302 100644 --- a/2_if2.py +++ b/2_if2.py @@ -5,22 +5,39 @@ Условный оператор: Сравнение строк * Написать функцию, которая принимает на вход две строки -* Проверить, является ли то, что передано функции, строками. +* Проверить, является ли то, что передано функции, строками. Если нет - вернуть 0 * Если строки одинаковые, вернуть 1 * Если строки разные и первая длиннее, вернуть 2 * Если строки разные и вторая строка 'learn', возвращает 3 -* Вызвать функцию несколько раз, передавая ей разные праметры +* Вызвать функцию несколько раз, передавая ей разные праметры и выводя на экран результаты """ + def main(): """ Эта функция вызывается автоматически при запуске скрипта в консоли В ней надо заменить pass на ваш код """ - pass - + print(func(1,'1')) + print(func('1','1')) + print(func('11','1')) + print(func('11','learn')) + print(func('111111','learn')) + + +def func(first: str, second: str) -> int: + if not all((isinstance(first, str), isinstance(second, str))): + return 0 + elif first == second: + return 1 + elif second == 'learn': + return 3 + elif len(first) > len(second): + return 2 + + if __name__ == "__main__": main() diff --git a/3_for.py b/3_for.py index 5ca9f504..db4e3ccc 100644 --- a/3_for.py +++ b/3_for.py @@ -6,7 +6,7 @@ * Дан список словарей с данными по колличеству проданных телефонов [ - {'product': 'iPhone 12', 'items_sold': [363, 500, 224, 358, 480, 476, 470, 216, 270, 388, 312, 186]}, + {'product': 'iPhone 12', 'items_sold': [363, 500, 224, 358, 480, 476, 470, 216, 270, 388, 312, 186]}, {'product': 'Xiaomi Mi11', 'items_sold': [317, 267, 290, 431, 211, 354, 276, 526, 141, 453, 510, 316]}, {'product': 'Samsung Galaxy 21', 'items_sold': [343, 390, 238, 437, 214, 494, 441, 518, 212, 288, 272, 247]}, ] @@ -16,12 +16,34 @@ * Посчитать и вывести среднее количество продаж всех товаров """ + def main(): """ Эта функция вызывается автоматически при запуске скрипта в консоли В ней надо заменить pass на ваш код """ - pass - + data = [ + {'product': 'iPhone 12', 'items_sold': [363, 500, 224, 358, 480, 476, 470, 216, 270, 388, 312, 186]}, + {'product': 'Xiaomi Mi11', 'items_sold': [317, 267, 290, 431, 211, 354, 276, 526, 141, 453, 510, 316]}, + {'product': 'Samsung Galaxy 21', 'items_sold': [343, 390, 238, 437, 214, 494, 441, 518, 212, 288, 272, 247]}, + ] + data_by_product = { + 'sum': {}, + 'average': {}, + } + sum_count_sales_all_products = 0 + for sales in data: + data_by_product['sum'][sales['product']] = sum(sales['items_sold']) + data_by_product['average'][sales['product']] = data_by_product['sum'][sales['product']]/len(sales['items_sold']) + sum_count_sales_all_products += data_by_product['sum'][sales['product']] + + average_count_sales_all_products = sum_count_sales_all_products / len(data_by_product['sum']) + + print(f'Суммарное количество продаж для каждого товара:\n{data_by_product["sum"]}') + print(f'Среднее количество продаж для каждого товара:\n{data_by_product['average']}') + print(f'Суммарное количество продаж для всех товаров: {sum_count_sales_all_products}') + print(f'Среднее количество продаж для всех товаров: {average_count_sales_all_products}') + + if __name__ == "__main__": main() diff --git a/4_while1.py b/4_while1.py index b5791517..7c2efe32 100644 --- a/4_while1.py +++ b/4_while1.py @@ -4,18 +4,21 @@ Цикл while: hello_user -* Напишите функцию hello_user(), которая с помощью функции input() спрашивает +* Напишите функцию hello_user(), которая с помощью функции input() спрашивает пользователя “Как дела?”, пока он не ответит “Хорошо” - + """ -def hello_user(): +def hello_user() -> None: """ Замените pass на ваш код """ - pass + answer = None + while answer != 'Хорошо': + answer = input('Как дела?\n').strip() + return + - if __name__ == "__main__": hello_user() diff --git a/5_while2.py b/5_while2.py index 49012dfd..da556a19 100644 --- a/5_while2.py +++ b/5_while2.py @@ -12,16 +12,24 @@ Пользователь: Что делаешь? Программа: Программирую - + """ -questions_and_answers = {} +questions_and_answers = {"как дела?": "Хорошо!", "что делаешь?": "Программирую"} + def ask_user(answers_dict): """ Замените pass на ваш код """ - pass - + num_questions = len(answers_dict) + print(f'У вас есть {num_questions} попыток задать вопрос') + while num_questions: + question = input('Задайте вопрос роботу:\n').strip().lower() + answer = answers_dict.get(question, '') + print(answer) + num_questions -= 1 + + if __name__ == "__main__": ask_user(questions_and_answers) diff --git a/6_exception1.py b/6_exception1.py index 3ea9d054..aba1c107 100644 --- a/6_exception1.py +++ b/6_exception1.py @@ -4,17 +4,26 @@ Исключения: KeyboardInterrupt -* Перепишите функцию hello_user() из задания while1, чтобы она - перехватывала KeyboardInterrupt, писала пользователю "Пока!" +* Перепишите функцию hello_user() из задания while1, чтобы она + перехватывала KeyboardInterrupt, писала пользователю "Пока!" и завершала работу при помощи оператора break - + """ -def hello_user(): + +def hello_user() -> None: """ Замените pass на ваш код """ - pass - + answer = None + while answer != 'Хорошо': + try: + answer = input('Как дела?\n').strip() + except KeyboardInterrupt: + print('\nПока!') + break + return + + if __name__ == "__main__": hello_user() diff --git a/7_exception2.py b/7_exception2.py index d4bd8a39..7dcff13f 100644 --- a/7_exception2.py +++ b/7_exception2.py @@ -10,15 +10,34 @@ * Первые два нужно приводить к вещественному числу при помощи float(), а третий - к целому при помощи int() и перехватывать исключения ValueError и TypeError, если приведение типов не сработало. - + """ -def discounted(price, discount, max_discount=20) - """ - Замените pass на ваш код - """ - pass - + +def discounted(price, discount, max_discount=20): + try: + price = abs(float(price)) + except (ValueError, TypeError): + print(f'Для параметра "price" передан некорректный тип данных {price}') + return + try: + discount = abs(float(discount)) + except (ValueError, TypeError): + print(f'Для параметра "discount" передан некорректный тип данных {discount}') + return + try: + max_discount = abs(float(max_discount)) + except (ValueError, TypeError): + print(f'Для параметра "max_discount" передан некорректный тип данных {max_discount}') + return + if max_discount >= 100: + raise ValueError('Слишком большая максимальная скидка') + if discount >= max_discount: + return price + else: + return price - (price * discount / 100) + + if __name__ == "__main__": print(discounted(100, 2)) print(discounted(100, "3")) diff --git a/8_ephem_bot.py b/8_ephem_bot.py index 1cf9ea19..c344c2ac 100644 --- a/8_ephem_bot.py +++ b/8_ephem_bot.py @@ -12,46 +12,52 @@ бота отвечать, в каком созвездии сегодня находится планета. """ +import datetime import logging +import sys +import ephem from telegram.ext import Updater, CommandHandler, MessageHandler, Filters -logging.basicConfig(format='%(name)s - %(levelname)s - %(message)s', - level=logging.INFO, - filename='bot.log') - +from secret import TOKEN -PROXY = { - 'proxy_url': 'socks5://t1.learn.python.ru:1080', - 'urllib3_proxy_kwargs': { - 'username': 'learn', - 'password': 'python' - } -} +logging.basicConfig(format='%(asctime)s - %(levelname)s - %(name)s - %(message)s', + level=logging.INFO, + stream=sys.stdout) +logger = logging.getLogger(__name__) def greet_user(update, context): - text = 'Вызван /start' - print(text) - update.message.reply_text(text) + logger.info('Вызван /start') + update.message.reply_text(f'Привет, {update.message.from_user.first_name}') def talk_to_me(update, context): - user_text = update.message.text - print(user_text) - update.message.reply_text(text) + update.message.reply_text(update.message.text) + + +def where_is_planet(update, context): + planet_names = [p[2] for p in ephem._libastro.builtin_planets() if p[1] == 'Planet' and p[2] not in ('Sun', 'Moon')] + planet_name = update.message.text.split()[1].title() + if planet_name not in planet_names: + update.message.reply_text(f'Not find planet {planet_name}. ' + f'Select one from the options {", ".join(planet_names)}') + planet = ephem.__dict__[planet_name](datetime.date.today()) + update.message.reply_text(', '.join(ephem.constellation(planet))) def main(): - mybot = Updater("КЛЮЧ, КОТОРЫЙ НАМ ВЫДАЛ BotFather", request_kwargs=PROXY, use_context=True) + logger.info('The bot has started') + my_bot = Updater(TOKEN) - dp = mybot.dispatcher - dp.add_handler(CommandHandler("start", greet_user)) + dp = my_bot.dispatcher + dp.add_handler(CommandHandler('start', greet_user)) + dp.add_handler(CommandHandler('planet', where_is_planet)) dp.add_handler(MessageHandler(Filters.text, talk_to_me)) - mybot.start_polling() - mybot.idle() + my_bot.start_polling() + my_bot.idle() # зацикливает бота -if __name__ == "__main__": +if __name__ == '__main__': main() From f8b3dde50cbb7162574995d6d2cd15d4a017f458 Mon Sep 17 00:00:00 2001 From: Dmitrii Uzunov Date: Fri, 24 Nov 2023 00:19:03 +0300 Subject: [PATCH 2/2] refactoring --- 1_if1.py | 10 +++++----- 2_if2.py | 12 ++++++------ 3_for.py | 43 +++++++++++++++++++++++++++++++------------ 4_while1.py | 4 ++-- 5_while2.py | 6 +++--- 6_exception1.py | 6 +++--- 7_exception2.py | 6 ++++-- 8_ephem_bot.py | 36 ++++++++++++++++++++++-------------- 8 files changed, 76 insertions(+), 47 deletions(-) diff --git a/1_if1.py b/1_if1.py index fb44a55b..6e1f3d73 100644 --- a/1_if1.py +++ b/1_if1.py @@ -20,20 +20,20 @@ def main(): Эта функция вызывается автоматически при запуске скрипта в консоли В ней надо заменить pass на ваш код """ - age = int(input('Введите ваш возраст пожалуйста: ').strip()) + age = int(input("Введите ваш возраст пожалуйста: ").strip()) what_to_do = choice_of_occupation(age) print(what_to_do) def choice_of_occupation(age: int) -> str: if age <= 6: - occupation = 'учиться в детском саду' + occupation = "учиться в детском саду" elif 6 < age <= 17: - occupation = 'учиться в школе' + occupation = "учиться в школе" elif 17 < age <= 22: - occupation = 'учиться в ВУЗе' + occupation = "учиться в ВУЗе" else: - occupation = 'работать' + occupation = "работать" return occupation diff --git a/2_if2.py b/2_if2.py index b21bf302..b03c099e 100644 --- a/2_if2.py +++ b/2_if2.py @@ -21,11 +21,11 @@ def main(): Эта функция вызывается автоматически при запуске скрипта в консоли В ней надо заменить pass на ваш код """ - print(func(1,'1')) - print(func('1','1')) - print(func('11','1')) - print(func('11','learn')) - print(func('111111','learn')) + print(func(1, "1")) + print(func("1", "1")) + print(func("11", "1")) + print(func("11", "learn")) + print(func("111111", "learn")) def func(first: str, second: str) -> int: @@ -33,7 +33,7 @@ def func(first: str, second: str) -> int: return 0 elif first == second: return 1 - elif second == 'learn': + elif second == "learn": return 3 elif len(first) > len(second): return 2 diff --git a/3_for.py b/3_for.py index db4e3ccc..fef27867 100644 --- a/3_for.py +++ b/3_for.py @@ -23,26 +23,45 @@ def main(): В ней надо заменить pass на ваш код """ data = [ - {'product': 'iPhone 12', 'items_sold': [363, 500, 224, 358, 480, 476, 470, 216, 270, 388, 312, 186]}, - {'product': 'Xiaomi Mi11', 'items_sold': [317, 267, 290, 431, 211, 354, 276, 526, 141, 453, 510, 316]}, - {'product': 'Samsung Galaxy 21', 'items_sold': [343, 390, 238, 437, 214, 494, 441, 518, 212, 288, 272, 247]}, + { + "product": "iPhone 12", + "items_sold": [363, 500, 224, 358, 480, 476, 470, 216, 270, 388, 312, 186], + }, + { + "product": "Xiaomi Mi11", + "items_sold": [317, 267, 290, 431, 211, 354, 276, 526, 141, 453, 510, 316], + }, + { + "product": "Samsung Galaxy 21", + "items_sold": [343, 390, 238, 437, 214, 494, 441, 518, 212, 288, 272, 247], + }, ] data_by_product = { - 'sum': {}, - 'average': {}, + "sum": {}, + "average": {}, } sum_count_sales_all_products = 0 for sales in data: - data_by_product['sum'][sales['product']] = sum(sales['items_sold']) - data_by_product['average'][sales['product']] = data_by_product['sum'][sales['product']]/len(sales['items_sold']) - sum_count_sales_all_products += data_by_product['sum'][sales['product']] + data_by_product["sum"][sales["product"]] = sum(sales["items_sold"]) + data_by_product["average"][sales["product"]] = data_by_product["sum"][ + sales["product"] + ] / len(sales["items_sold"]) + sum_count_sales_all_products += data_by_product["sum"][sales["product"]] - average_count_sales_all_products = sum_count_sales_all_products / len(data_by_product['sum']) + average_count_sales_all_products = sum_count_sales_all_products / len( + data_by_product["sum"] + ) print(f'Суммарное количество продаж для каждого товара:\n{data_by_product["sum"]}') - print(f'Среднее количество продаж для каждого товара:\n{data_by_product['average']}') - print(f'Суммарное количество продаж для всех товаров: {sum_count_sales_all_products}') - print(f'Среднее количество продаж для всех товаров: {average_count_sales_all_products}') + print( + f'Среднее количество продаж для каждого товара:\n{data_by_product["average"]}' + ) + print( + f"Суммарное количество продаж для всех товаров: {sum_count_sales_all_products}" + ) + print( + f"Среднее количество продаж для всех товаров: {average_count_sales_all_products}" + ) if __name__ == "__main__": diff --git a/4_while1.py b/4_while1.py index 7c2efe32..3c60e21a 100644 --- a/4_while1.py +++ b/4_while1.py @@ -15,8 +15,8 @@ def hello_user() -> None: Замените pass на ваш код """ answer = None - while answer != 'Хорошо': - answer = input('Как дела?\n').strip() + while answer != "Хорошо": + answer = input("Как дела?\n").strip() return diff --git a/5_while2.py b/5_while2.py index da556a19..a5d5c4a6 100644 --- a/5_while2.py +++ b/5_while2.py @@ -23,10 +23,10 @@ def ask_user(answers_dict): Замените pass на ваш код """ num_questions = len(answers_dict) - print(f'У вас есть {num_questions} попыток задать вопрос') + print(f"У вас есть {num_questions} попыток задать вопрос") while num_questions: - question = input('Задайте вопрос роботу:\n').strip().lower() - answer = answers_dict.get(question, '') + question = input("Задайте вопрос роботу:\n").strip().lower() + answer = answers_dict.get(question, "") print(answer) num_questions -= 1 diff --git a/6_exception1.py b/6_exception1.py index aba1c107..d5ceaf6b 100644 --- a/6_exception1.py +++ b/6_exception1.py @@ -16,11 +16,11 @@ def hello_user() -> None: Замените pass на ваш код """ answer = None - while answer != 'Хорошо': + while answer != "Хорошо": try: - answer = input('Как дела?\n').strip() + answer = input("Как дела?\n").strip() except KeyboardInterrupt: - print('\nПока!') + print("\nПока!") break return diff --git a/7_exception2.py b/7_exception2.py index 7dcff13f..bb4e30c2 100644 --- a/7_exception2.py +++ b/7_exception2.py @@ -28,10 +28,12 @@ def discounted(price, discount, max_discount=20): try: max_discount = abs(float(max_discount)) except (ValueError, TypeError): - print(f'Для параметра "max_discount" передан некорректный тип данных {max_discount}') + print( + f'Для параметра "max_discount" передан некорректный тип данных {max_discount}' + ) return if max_discount >= 100: - raise ValueError('Слишком большая максимальная скидка') + raise ValueError("Слишком большая максимальная скидка") if discount >= max_discount: return price else: diff --git a/8_ephem_bot.py b/8_ephem_bot.py index c344c2ac..35fe46db 100644 --- a/8_ephem_bot.py +++ b/8_ephem_bot.py @@ -17,19 +17,21 @@ import sys import ephem -from telegram.ext import Updater, CommandHandler, MessageHandler, Filters +from telegram.ext import CommandHandler, Filters, MessageHandler, Updater from secret import TOKEN -logging.basicConfig(format='%(asctime)s - %(levelname)s - %(name)s - %(message)s', - level=logging.INFO, - stream=sys.stdout) +logging.basicConfig( + format="%(asctime)s - %(levelname)s - %(name)s - %(message)s", + level=logging.INFO, + stream=sys.stdout, +) logger = logging.getLogger(__name__) def greet_user(update, context): - logger.info('Вызван /start') - update.message.reply_text(f'Привет, {update.message.from_user.first_name}') + logger.info("Вызван /start") + update.message.reply_text(f"Привет, {update.message.from_user.first_name}") def talk_to_me(update, context): @@ -37,27 +39,33 @@ def talk_to_me(update, context): def where_is_planet(update, context): - planet_names = [p[2] for p in ephem._libastro.builtin_planets() if p[1] == 'Planet' and p[2] not in ('Sun', 'Moon')] + planet_names = [ + p[2] + for p in ephem._libastro.builtin_planets() + if p[1] == "Planet" and p[2] not in ("Sun", "Moon") + ] planet_name = update.message.text.split()[1].title() if planet_name not in planet_names: - update.message.reply_text(f'Not find planet {planet_name}. ' - f'Select one from the options {", ".join(planet_names)}') + update.message.reply_text( + f"Not find planet {planet_name}. " + f'Select one from the options {", ".join(planet_names)}' + ) planet = ephem.__dict__[planet_name](datetime.date.today()) - update.message.reply_text(', '.join(ephem.constellation(planet))) + update.message.reply_text(", ".join(ephem.constellation(planet))) def main(): - logger.info('The bot has started') + logger.info("The bot has started") my_bot = Updater(TOKEN) dp = my_bot.dispatcher - dp.add_handler(CommandHandler('start', greet_user)) - dp.add_handler(CommandHandler('planet', where_is_planet)) + dp.add_handler(CommandHandler("start", greet_user)) + dp.add_handler(CommandHandler("planet", where_is_planet)) dp.add_handler(MessageHandler(Filters.text, talk_to_me)) my_bot.start_polling() my_bot.idle() # зацикливает бота -if __name__ == '__main__': +if __name__ == "__main__": main()