From efd8bbb8b92dc151413bfa463f081ed7aad6d948 Mon Sep 17 00:00:00 2001 From: Alexonys1 <107358560+Alexonys1@users.noreply.github.com> Date: Tue, 14 Mar 2023 23:13:38 +0300 Subject: [PATCH 01/31] =?UTF-8?q?=D0=92=D0=BF=D0=B5=D1=80=D0=B2=D1=8B?= =?UTF-8?q?=D0=B5=20=D0=B7=D0=B0=D0=B3=D1=80=D1=83=D0=B7=D0=B8=D0=BB=20?= =?UTF-8?q?=D0=BC=D0=BE=D0=B9=20=D0=B7=D0=B0=D0=B3=D0=BE=D1=82=D0=BE=D0=B2?= =?UTF-8?q?=D0=BE=D1=87=D0=BD=D1=8B=D0=B9=20=D0=BA=D0=BE=D0=B4.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Не забывайте, что работает он в Яндекс Облаке! --- json_manager.py | 9 +++++++ main.py | 60 ++++++++++++++++++++++++++++++++++++++++++++ texts_for_users.json | 3 +++ 3 files changed, 72 insertions(+) create mode 100644 json_manager.py create mode 100644 main.py create mode 100644 texts_for_users.json diff --git a/json_manager.py b/json_manager.py new file mode 100644 index 0000000..e602d13 --- /dev/null +++ b/json_manager.py @@ -0,0 +1,9 @@ +import json + + +with open ("texts_for_users.json", "r") as file: + texts_for_users = json.load (file) + + +def get_text_for_new_user ( ) -> str: + return texts_for_users["for_new_user"] \ No newline at end of file diff --git a/main.py b/main.py new file mode 100644 index 0000000..20f86a9 --- /dev/null +++ b/main.py @@ -0,0 +1,60 @@ +from json_manager import * + + +class HandlerOfAlisa: + def __init__ (self, request: dict): + self._VERSION: str = request["version"] + self._TEXT_IN_LOWER: str = request["request"]["command"] + self._ORIGINAL_TEXT: str = request["request"]["original_utterance"] + self._WORDS_OF_TEXT_IN_LOWER: list = request["request"]["nlu"]["tokens"] + self._IS_FIRST_MESSAGE: bool = request["session"]["new"] + self._IS_END_SESSION: bool = False + self._SESSION_DATA: dict = request["state"]["session"] + self._USER_DATA: dict = request["state"]["user"] # Межсессионные данные + self._find_out_new_user ( ) + self._make_new_variables ( ) + + def _find_out_new_user (self) -> None: + try: + self._IS_NEW_USER: bool = self._USER_DATA["new_user"] + except KeyError: + self._IS_NEW_USER = True + + def _make_new_variables (self) -> None: + if self._IS_NEW_USER: + self._NEW_TEXT = get_text_for_new_user ( ) + self._IS_NEW_USER = False + self._USER_DATA["new_user"] = False + + elif self._has_words_in_text_in_lower ("сбрось", "настройки"): + self._IS_NEW_USER = True + self._USER_DATA["new_user"] = True + self._NEW_TEXT = "Настройки сброшены." + + else: + self._NEW_TEXT = self._ORIGINAL_TEXT + + self._NEW_SESSION_DATA = self._SESSION_DATA + self._NEW_USER_DATA = self._USER_DATA + + def _has_words_in_text_in_lower (self, *words) -> bool: + for word in words: + if not word in self._WORDS_OF_TEXT_IN_LOWER: + return False + return True + + + def get_response (self) -> dict: + return { + "version": self._VERSION, + "response": {"text": self._NEW_TEXT, "end_session": self._IS_END_SESSION}, + "session_state": self._NEW_SESSION_DATA, + "user_state_update": self._NEW_USER_DATA + } + + + +# Функция, вызываемая Яндексом для запуска скрипта Алисы (в коде вызывать её не нужно). +def main (request_from_alisa: dict, context) -> dict: + handler_of_alisa = HandlerOfAlisa (request_from_alisa) + return handler_of_alisa.get_response ( ) \ No newline at end of file diff --git a/texts_for_users.json b/texts_for_users.json new file mode 100644 index 0000000..cc86a54 --- /dev/null +++ b/texts_for_users.json @@ -0,0 +1,3 @@ +{ + "for_new_user": "Приветствую вас в навыке \"Учим Python\"! Здесь вы сможете глубже погрузиться в удивительный мир программирования на языке Python. Чтобы продолжить изучение курса, скажите \"курс\". Хотите проверить свои знания? Просто скажите: \"квест\" или \"задачки\". Если вы потеряны, просто скажите \"помощь\"." +} \ No newline at end of file From 6e166cff20271496d042706ecc9f50931b769d60 Mon Sep 17 00:00:00 2001 From: Alexonys1 <107358560+Alexonys1@users.noreply.github.com> Date: Wed, 15 Mar 2023 19:34:34 +0300 Subject: [PATCH 02/31] =?UTF-8?q?=D0=94=D0=BE=D0=BF=D0=BE=D0=BB=D0=BD?= =?UTF-8?q?=D0=B5=D0=BD=D0=B8=D0=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- main.py | 38 ++++++++++++++++++++++++++++---------- 1 file changed, 28 insertions(+), 10 deletions(-) diff --git a/main.py b/main.py index 20f86a9..8a88900 100644 --- a/main.py +++ b/main.py @@ -10,38 +10,56 @@ def __init__ (self, request: dict): self._IS_FIRST_MESSAGE: bool = request["session"]["new"] self._IS_END_SESSION: bool = False self._SESSION_DATA: dict = request["state"]["session"] - self._USER_DATA: dict = request["state"]["user"] # Межсессионные данные - self._find_out_new_user ( ) + self._INTERSESSIONAL_DATA: dict = request["state"]["user"] # Межсессионные данные + self._create_intersessional_data_if_necessary ( ) self._make_new_variables ( ) - def _find_out_new_user (self) -> None: + def _create_intersessional_data_if_necessary (self) -> None: + # Я думаю, что у нового пользователя межсессионные данные пусты, + # поэтому делаю создателя этих данных, если это необходимо try: - self._IS_NEW_USER: bool = self._USER_DATA["new_user"] + self._IS_NEW_USER: bool = self._INTERSESSIONAL_DATA["new_user"] except KeyError: self._IS_NEW_USER = True + self._INTERSESSIONAL_DATA["last_lesson"] = 0 + self._INTERSESSIONAL_DATA["last_task"] = 0 def _make_new_variables (self) -> None: if self._IS_NEW_USER: self._NEW_TEXT = get_text_for_new_user ( ) self._IS_NEW_USER = False - self._USER_DATA["new_user"] = False + self._INTERSESSIONAL_DATA["new_user"] = False - elif self._has_words_in_text_in_lower ("сбрось", "настройки"): + elif self._has_all_words_in_text_in_lower ("сбрось", "настройки"): self._IS_NEW_USER = True - self._USER_DATA["new_user"] = True + self._INTERSESSIONAL_DATA["new_user"] = True self._NEW_TEXT = "Настройки сброшены." + + elif self._has_all_words_in_text_in_lower ("извинись"): + self._NEW_TEXT = get_apology_text ( ) + + elif self._has_one_word_in_text_in_lower ( + "пока", "пака", "прощай", "свидания", "пора", "чао"): + self._NEW_TEXT = get_farewell_text ( ) + self._IS_END_SESSION = True else: self._NEW_TEXT = self._ORIGINAL_TEXT self._NEW_SESSION_DATA = self._SESSION_DATA - self._NEW_USER_DATA = self._USER_DATA + self._NEW_INTERSESSIONAL_DATA = self._INTERSESSIONAL_DATA - def _has_words_in_text_in_lower (self, *words) -> bool: + def _has_all_words_in_text_in_lower (self, *words) -> bool: for word in words: if not word in self._WORDS_OF_TEXT_IN_LOWER: return False return True + + def _has_one_word_in_text_in_lower (self, *words) -> bool: + for word in words: + if word in self._WORDS_OF_TEXT_IN_LOWER: + return True + return False def get_response (self) -> dict: @@ -49,7 +67,7 @@ def get_response (self) -> dict: "version": self._VERSION, "response": {"text": self._NEW_TEXT, "end_session": self._IS_END_SESSION}, "session_state": self._NEW_SESSION_DATA, - "user_state_update": self._NEW_USER_DATA + "user_state_update": self._NEW_INTERSESSIONAL_DATA } From d4c8bfd54954681147b0a8f3ff176d291ccc01b0 Mon Sep 17 00:00:00 2001 From: Alexonys1 <107358560+Alexonys1@users.noreply.github.com> Date: Wed, 15 Mar 2023 22:41:13 +0300 Subject: [PATCH 03/31] =?UTF-8?q?=D0=9E=D1=82=D0=BF=D1=80=D0=B0=D0=B2?= =?UTF-8?q?=D0=BB=D1=8F=D1=8E=20=D1=84=D0=B0=D0=B9=D0=BB=D1=8B=20=D0=BF?= =?UTF-8?q?=D0=B5=D1=80=D0=B5=D0=B4=20=D1=81=D0=BD=D0=BE=D0=BC.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Код работает в Яндекс Диалогах. Закиньте эти три файлика и проверьте изменения (ага, легко сказать: "Закинь"). --- json_manager.py | 31 +++++++++++++++++++++-- main.py | 37 +++++++++++++++++---------- texts_for_users.json | 60 +++++++++++++++++++++++++++++++++++++++++++- 3 files changed, 112 insertions(+), 16 deletions(-) diff --git a/json_manager.py b/json_manager.py index e602d13..15086d1 100644 --- a/json_manager.py +++ b/json_manager.py @@ -1,9 +1,36 @@ import json +import random with open ("texts_for_users.json", "r") as file: texts_for_users = json.load (file) - def get_text_for_new_user ( ) -> str: - return texts_for_users["for_new_user"] \ No newline at end of file + return texts_for_users["for_new_user"] + +def get_hello_text ( ) -> str: + return random.choice (texts_for_users["hello_text"]) + +def get_text_asking_if_user_has_forgotten_commands ( ) -> str: + return random.choice (texts_for_users["if_user_has_forgotten_commands"]) + +def get_main_commands_of_skill ( ) -> str: + return texts_for_users["main_commands_of_skill"] + +def get_text_that_says_which_lesson_user_stopped (lesson_number: int) -> str: + return random.choice (texts_for_users["you_stopped_at_lesson"]) + str (lesson_number) + +def get_theme_of_lesson (lesson_number: int) -> str: + return "ЗАТЫЧКА" + #return lessons[str(lesson_number)]["theme"] + +def get_apology_text ( ) -> str: + return random.choice (texts_for_users["something_is_unclear"]) + # Выбирается одно случайное извинение от Алисы, если она что-то не поняла. + +def get_farewell_text ( ) -> str: + head_of_farewell: str = random.choice (texts_for_users["head_of_farewell"]) + body_of_farewell: str = random.choice (texts_for_users["body_of_farewell"]) + return head_of_farewell + body_of_farewell + # Достаётся начало прощания, например: "До свидания"; + # а потом тело прощания, например: ", хорошего дня!" \ No newline at end of file diff --git a/main.py b/main.py index 8a88900..df14936 100644 --- a/main.py +++ b/main.py @@ -12,31 +12,45 @@ def __init__ (self, request: dict): self._SESSION_DATA: dict = request["state"]["session"] self._INTERSESSIONAL_DATA: dict = request["state"]["user"] # Межсессионные данные self._create_intersessional_data_if_necessary ( ) - self._make_new_variables ( ) + self._prepare_correct_answer ( ) def _create_intersessional_data_if_necessary (self) -> None: # Я думаю, что у нового пользователя межсессионные данные пусты, - # поэтому делаю создателя этих данных, если это необходимо - try: + # поэтому создаю их, если это необходимо + if "new_user" in self._INTERSESSIONAL_DATA.keys ( ): self._IS_NEW_USER: bool = self._INTERSESSIONAL_DATA["new_user"] - except KeyError: + else: self._IS_NEW_USER = True + self._INTERSESSIONAL_DATA["new_user"] = True self._INTERSESSIONAL_DATA["last_lesson"] = 0 self._INTERSESSIONAL_DATA["last_task"] = 0 - def _make_new_variables (self) -> None: + def _prepare_correct_answer (self) -> None: if self._IS_NEW_USER: self._NEW_TEXT = get_text_for_new_user ( ) self._IS_NEW_USER = False self._INTERSESSIONAL_DATA["new_user"] = False + + elif self._IS_FIRST_MESSAGE: + self._NEW_TEXT = get_hello_text ( ) + "\n" + self._NEW_TEXT += get_text_asking_if_user_has_forgotten_commands ( ) + "\n" + self._NEW_TEXT += get_main_commands_of_skill ( ) + # Пока навык разрабатывается elif self._has_all_words_in_text_in_lower ("сбрось", "настройки"): self._IS_NEW_USER = True self._INTERSESSIONAL_DATA["new_user"] = True + self._INTERSESSIONAL_DATA["last_lesson"] = 0 + self._INTERSESSIONAL_DATA["last_task"] = 0 self._NEW_TEXT = "Настройки сброшены." - elif self._has_all_words_in_text_in_lower ("извинись"): - self._NEW_TEXT = get_apology_text ( ) + elif self._has_one_word_in_text_in_lower ( + "курс", "курса", "курсу", "курсе", "курсом"): + last_lesson: int = self._INTERSESSIONAL_DATA["last_lesson"] + self._NEW_TEXT = get_text_that_says_which_lesson_user_stopped (last_lesson) + "\n" + self._NEW_TEXT += "Его тема: " + get_theme_of_lesson (last_lesson) + "\n" + self._NEW_TEXT += "Хотите перейти к следующему уроку?" + # FIXME elif self._has_one_word_in_text_in_lower ( "пока", "пака", "прощай", "свидания", "пора", "чао"): @@ -44,10 +58,7 @@ def _make_new_variables (self) -> None: self._IS_END_SESSION = True else: - self._NEW_TEXT = self._ORIGINAL_TEXT - - self._NEW_SESSION_DATA = self._SESSION_DATA - self._NEW_INTERSESSIONAL_DATA = self._INTERSESSIONAL_DATA + self._NEW_TEXT = get_apology_text ( ) def _has_all_words_in_text_in_lower (self, *words) -> bool: for word in words: @@ -66,8 +77,8 @@ def get_response (self) -> dict: return { "version": self._VERSION, "response": {"text": self._NEW_TEXT, "end_session": self._IS_END_SESSION}, - "session_state": self._NEW_SESSION_DATA, - "user_state_update": self._NEW_INTERSESSIONAL_DATA + "session_state": self._SESSION_DATA, + "user_state_update": self._INTERSESSIONAL_DATA } diff --git a/texts_for_users.json b/texts_for_users.json index cc86a54..70b5014 100644 --- a/texts_for_users.json +++ b/texts_for_users.json @@ -1,3 +1,61 @@ { - "for_new_user": "Приветствую вас в навыке \"Учим Python\"! Здесь вы сможете глубже погрузиться в удивительный мир программирования на языке Python. Чтобы продолжить изучение курса, скажите \"курс\". Хотите проверить свои знания? Просто скажите: \"квест\" или \"задачки\". Если вы потеряны, просто скажите \"помощь\"." + "for_new_user": "Приветствую вас в навыке \"Учим Python\"! Здесь вы сможете глубже погрузиться в удивительный мир программирования на языке Python. Чтобы продолжить изучение курса, скажите \"курс\". Хотите проверить свои знания? Просто скажите: \"квест\" или \"задачки\". Если вы потеряны, просто скажите \"помощь\".", + "hello_text": [ + "Привет!", + "Приветик!", + "Приветствую!", + "Приветствую вас!", + "Здравствуйте!", + "Доброго дня!", + "С добрым временем суток!", + "Hello!" + ], + "if_user_has_forgotten_commands": [ + "Надеюсь, вы не забыли мои основные команды. Давайте, я напомню их вам:", + "Надеюсь, вы помните как продолжить курс? Давайте я напомню мои команды:", + "Помните как общаться со мной? Давайте напомню вам мои команды:", + "Не забыли мои команды? Вот они:", + "Не забыли мои команды? Давайте, я вам напомню:", + "Вы же помните мои команды? Давайте, я вам их продиктую:", + "Вот мои команды, если вы их забыли:", + "Вот мои основные команды:" + ], + "main_commands_of_skill": "курс,\nперейди на N урок,\nзадачка,\nквест,\nоцени мои знания.", + "you_stopped_at_lesson": [ + "Что ж, вы остановились на уроке №", + "Итак, вы остановились на уроке №", + "Урок, на котором вы остановились - №", + "Ваш последний урок - №" + ], + "something_is_unclear": [ + "Извините, я вас не поняла.", + "Простите, я вас не поняла.", + "Извините, не поняла вас.", + "Простите, не поняла вас.", + "Извините, не могу разобрать.", + "Простите, не могу разобрать.", + "Извините, я не могу разобрать.", + "Простите, я не могу разобрать.", + "Извините, не разобрала.", + "Простите, не разобрала.", + "Извините, не поняла, что вы имеете в виду.", + "Простите, не поняла, что вы имеете в виду.", + "Извините, я не поняла, что вы имеете в виду.", + "Простите, я не поняла, что вы имеете в виду." + ], + "head_of_farewell": [ + "До свидания", + "Прощайте", + "Чао", + "Goodbye", + "Bye" + ], + "body_of_farewell": [ + "!", + ", приятного дня!", + ", успехов вам!", + ", вы многому научились!", + ", вы большой молодец!", + ", вы просто молодец!" + ] } \ No newline at end of file From 062837e290918f45691a3f8640a1f696500b65e4 Mon Sep 17 00:00:00 2001 From: Alexonys1 <107358560+Alexonys1@users.noreply.github.com> Date: Mon, 20 Mar 2023 20:20:58 +0300 Subject: [PATCH 04/31] =?UTF-8?q?=D0=92=D1=82=D0=BE=D1=80=D0=B0=D1=8F=20?= =?UTF-8?q?=D0=B2=D0=B5=D1=80=D1=81=D0=B8=D1=8F=20=D0=BD=D0=B0=D0=B2=D1=8B?= =?UTF-8?q?=D0=BA=D0=B0!?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Всё стало намного проще и лучше. Претерпела изменения сама структура. Всё круто! --- enums.py | 18 ++ json_manager.py | 41 +++- main2.py | 363 +++++++++++++++++++++++++++++++++++ quest_getter.py | 98 ++++++++++ quests.json | 441 +++++++++++++++++++++++++++++++++++++++++++ texts_for_users.json | 18 +- useful_functions.py | 39 ++++ 7 files changed, 1016 insertions(+), 2 deletions(-) create mode 100644 enums.py create mode 100644 main2.py create mode 100644 quest_getter.py create mode 100644 quests.json create mode 100644 useful_functions.py diff --git a/enums.py b/enums.py new file mode 100644 index 0000000..efe4a7b --- /dev/null +++ b/enums.py @@ -0,0 +1,18 @@ +import enum +import random + + +@enum.unique +class DifficultyLevelsOfQuest (enum.IntEnum): + EASY = 0 + MEDIUM = 1 + HARD = 2 + + def get_random_difficulty_level ( ) -> int: + return random.randint (0, 2) + + +if __name__ == '__main__': + print ("DifficultyLevelsOfQuest.get_random_difficulty_level: ", + DifficultyLevelsOfQuest.get_random_difficulty_level ( ), + sep = "") \ No newline at end of file diff --git a/json_manager.py b/json_manager.py index 15086d1..f1665f3 100644 --- a/json_manager.py +++ b/json_manager.py @@ -5,29 +5,68 @@ with open ("texts_for_users.json", "r") as file: texts_for_users = json.load (file) + + def get_text_for_new_user ( ) -> str: return texts_for_users["for_new_user"] + def get_hello_text ( ) -> str: return random.choice (texts_for_users["hello_text"]) + +def get_introduction_to_course ( ) -> str: + return texts_for_users["introduction_to_course"] + + def get_text_asking_if_user_has_forgotten_commands ( ) -> str: return random.choice (texts_for_users["if_user_has_forgotten_commands"]) -def get_main_commands_of_skill ( ) -> str: + +def get_main_commands_of_skill_as_list ( ) -> list[str]: return texts_for_users["main_commands_of_skill"] + +def get_main_commands_of_skill ( ) -> str: + commands_of_skill = "" + for command in texts_for_users["main_commands_of_skill"]: + commands_of_skill += command + "\n" + return commands_of_skill + + def get_text_that_says_which_lesson_user_stopped (lesson_number: int) -> str: return random.choice (texts_for_users["you_stopped_at_lesson"]) + str (lesson_number) + def get_theme_of_lesson (lesson_number: int) -> str: return "ЗАТЫЧКА" #return lessons[str(lesson_number)]["theme"] + +def get_lesson_text (lesson_number: int) -> str: + return "Затычка..." + + +def get_text_that_says_which_task_user_stopped (task_number: int) -> str: + return random.choice (texts_for_users["you_stopped_at_task"]) + str (task_number) + + +def create_buttons (*button_texts: str) -> list: + ready_buttons = [ ] + for text_of_button in button_texts: + ready_buttons.append ({"title": text_of_button, "hide": True}) + return ready_buttons + + +def create_buttons_of_main_menu ( ) -> list: + return create_buttons (*get_main_commands_of_skill_as_list ( )) + + def get_apology_text ( ) -> str: return random.choice (texts_for_users["something_is_unclear"]) # Выбирается одно случайное извинение от Алисы, если она что-то не поняла. + def get_farewell_text ( ) -> str: head_of_farewell: str = random.choice (texts_for_users["head_of_farewell"]) body_of_farewell: str = random.choice (texts_for_users["body_of_farewell"]) diff --git a/main2.py b/main2.py new file mode 100644 index 0000000..f1dc53c --- /dev/null +++ b/main2.py @@ -0,0 +1,363 @@ +from json_manager import * +from useful_functions import * +from quest_getter import QuestGetter +from enums import * + + +class HandlerOfAlisa: + def __init__ (self, request: dict): + self._VERSION: str = request["version"] + self._TEXT_IN_LOWER: str = request["request"]["command"] + self._ORIGINAL_TEXT: str = request["request"]["original_utterance"] + self._WORDS_OF_TEXT_IN_LOWER: list = request["request"]["nlu"]["tokens"] + self._IS_FIRST_MESSAGE: bool = request["session"]["new"] + self._IS_END_SESSION: bool = False + self._SESSIONAL_DATA: dict = create_sessional_data (request["state"]["session"]) + self._INTERSESSIONAL_DATA: dict = create_intersessional_data (request["state"]["user"]) + self._BUTTONS = [ ] + self._working_with_user ( ) + + + def _working_with_user (self) -> None: + # Абсолютно новый пользователь + if self._INTERSESSIONAL_DATA["new_user"]: + self._OUTPUT_TEXT = get_text_for_new_user ( ) + self._INTERSESSIONAL_DATA["new_user"] = False + self._BUTTONS = create_buttons_of_main_menu ( ) + + # Пользователь в главном меню впервые + elif self._user_is_in_main_menu and self._IS_FIRST_MESSAGE: + self._OUTPUT_TEXT = get_user_greeting ( ) + self._BUTTONS = create_buttons_of_main_menu ( ) + + # Пользователь просто в главном меню + elif self._user_is_in_main_menu: + self._OUTPUT_TEXT = get_text_that_says_user_is_just_in_main_menu ( ) + self._BUTTONS = create_buttons_of_main_menu ( ) + self._working_with_user_in_main_menu ( ) + + # Пользователь не в главном меню + else: + self._working_with_user_outside_main_menu ( ) + + @property + def _user_is_in_main_menu (self) -> bool: + # Если в _SESSIONAL_DATA есть хоть одно True-значение, + # то это значит, что пользователь не в главном меню + sessional_data = self._SESSIONAL_DATA + for key in sessional_data.keys(): + if sessional_data[key]: + return False + return True + + + def _working_with_user_in_main_menu (self) -> None: + # Пока навык в разработке + if self._has_all_words_in_text_in_lower ("сбрось", "настройки") or \ + self._has_all_words_in_text_in_lower ("сбросить", "настройки"): + self._INTERSESSIONAL_DATA["new_user"] = True + self._INTERSESSIONAL_DATA["last_lesson"] = 0 + self._INTERSESSIONAL_DATA["last_task"] = 0 + self._OUTPUT_TEXT = "Настройки сброшены." + + elif self._has_one_word_in_text_in_lower ( + "курс", "курса", "курсу", "курсом", "курсе"): + """Последняя тема, на которой вы остановились: (ТЕМА) / + (если пользователь ещё не проходил темы то Алиса пишет: + "Вы ещё не прошли ни одной темы"). + Продолжим? + """ + # FIXME + self._SESSIONAL_DATA["working_with_course"] = True + self._OUTPUT_TEXT = "Пока \"Курс\" ничего не умеет...\n" + self._OUTPUT_TEXT += "Может, на главное меню?" + self._BUTTONS = create_buttons ("На главное меню", "Пока!") + + elif self._has_one_word_in_text_in_lower ( + "задачка", "задачки", "задачку", "задачке", "задачкой", + "задача", "задачи", "задачу", "задаче", "задачей"): + """Чем отличаются задачки от квеста?""" + # FIXME + self._SESSIONAL_DATA["working_with_tasks"] = True + self._OUTPUT_TEXT = "Пока \"Задачка\" ничего не умеет...\n" + self._OUTPUT_TEXT += "Может, на главное меню?" + self._BUTTONS = create_buttons ("На главное меню", "Пока!") + + elif self._has_one_word_in_text_in_lower ( + "квест", "квеста", "квесту", "квестом", "квесте"): + # Просто доделать + # FIXME + self._SESSIONAL_DATA["working_with_quest"] = True + self._OUTPUT_TEXT = "Какой уровень сложности вы предпочитаете?\n" + self._OUTPUT_TEXT += "Лёгкий.\n" + self._OUTPUT_TEXT += "Средний.\n" + self._OUTPUT_TEXT += "Высокий.\n" + self._OUTPUT_TEXT += "Случайный." + self._BUTTONS = self._buttons_for_choosing_difficutly_level + + elif self._user_wants_to_go_to_main_menu: + self._OUTPUT_TEXT = "Вы уже на главном меню!" + + elif self._user_wants_to_end_session: + self._end_the_session ( ) + + else: + self._OUTPUT_TEXT = get_apology_text ( ) + + @property + def _buttons_for_choosing_difficutly_level (self) -> dict: + return create_buttons ("Лёгкий", "Средний", "Высокий", "Рандом", + "На главное меню", "Пока!") + + + def _working_with_user_outside_main_menu (self) -> None: + # Само собой нужно доработать working-методы + if self._SESSIONAL_DATA["working_with_course"]: + self._working_with_course ( ) + elif self._SESSIONAL_DATA["working_with_tasks"]: + self._working_with_tasks ( ) + elif self._SESSIONAL_DATA["working_with_quest"]: + self._working_with_quest ( ) + elif self._SESSIONAL_DATA["choosing_right_answer_for_quest"]: + self._choosing_right_answer_for_quest ( ) + elif self._SESSIONAL_DATA["choosing_between_repeating_and_changing_difficulty_level"]: + self._choosing_between_repeating_and_changing_difficulty_level ( ) + + def _working_with_course (self) -> None: + if self._user_wants_to_go_to_main_menu: + self._go_to_main_menu ( ) + + elif self._user_wants_to_end_session: + self._end_the_session ( ) + + else: + self._OUTPUT_TEXT = get_apology_text ( ) + self._BUTTONS = create_buttons ("На главное меню", "Пока!") + + @property + def _user_wants_to_go_to_main_menu (self) -> bool: + if self._has_all_words_in_text_in_lower ("на", "главное", "меню"): + return True + else: + return False + + @property + def _user_wants_to_end_session (self) -> bool: + if self._has_one_word_in_text_in_lower ("выход", "выйти", "пока", "прощай"): + return True + else: + return False + + def _working_with_tasks (self) -> None: + if self._user_wants_to_go_to_main_menu: + self._go_to_main_menu ( ) + + elif self._user_wants_to_end_session: + self._end_the_session ( ) + + else: + self._OUTPUT_TEXT = get_apology_text ( ) + self._BUTTONS = create_buttons ("На главное меню", "Пока!") + + def _working_with_quest (self) -> None: + if self._user_wants_to_go_to_main_menu: + self._go_to_main_menu ( ) + + elif self._user_wants_to_end_session: + self._end_the_session ( ) + + elif self._has_one_word_in_text_in_lower ( + "лёгкий", "лёгкого", "лёгкому", "лёгким", "лёгком", + "легкий", "легкого", "легкому", "легким", "легком"): + self._SESSIONAL_DATA["difficulty_level"] = DifficultyLevelsOfQuest.EASY.value + self._SESSIONAL_DATA["working_with_quest"] = False + self._SESSIONAL_DATA["choosing_right_answer_for_quest"] = True + self._save_text_and_correct_answer_of_easy_quest_in_session_data ( ) + self._OUTPUT_TEXT = "Хорошо.\n" + self._OUTPUT_TEXT += self._get_text_of_current_quest ( ) + self._BUTTONS = self._buttons_for_choosing_correct_answer + + # FIXME + elif self._has_one_word_in_text_in_lower ("средний"): + self._OUTPUT_TEXT = "Пока не настроен файлик, доступен только лёгкий уровень сложности.\n" + self._OUTPUT_TEXT += "Выберите другой уровень сложности." + self._BUTTONS = self._buttons_for_choosing_difficutly_level + + # FIXME + elif self._has_one_word_in_text_in_lower ("высокий"): + self._OUTPUT_TEXT = "Пока не настроен файлик, доступен только лёгкий уровень сложности.\n" + self._OUTPUT_TEXT += "Выберите другой уровень сложности." + self._BUTTONS = self._buttons_for_choosing_difficutly_level + + # FIXME + elif self._has_one_word_in_text_in_lower ("рандом"): + self._OUTPUT_TEXT = "Пока не настроен файлик, доступен только лёгкий уровень сложности.\n" + self._OUTPUT_TEXT += "Выберите другой уровень сложности." + self._BUTTONS = self._buttons_for_choosing_difficutly_level + + else: + self._OUTPUT_TEXT = get_apology_text ( ) + self._BUTTONS = self._buttons_for_choosing_difficutly_level + + def _save_text_and_correct_answer_of_easy_quest_in_session_data (self) -> None: + quest_getter = QuestGetter ( ) + quest_getter.save_random_easy_quest ( ) + self._SESSIONAL_DATA["text_of_quest"] = quest_getter.prepared_text_of_random_easy_quest + self._SESSIONAL_DATA["correct_answer_of_quest"] = quest_getter.correct_answer_of_random_easy_quest + + def _save_text_and_correct_answer_of_medium_quest_in_session_data (self) -> None: + quest_getter = QuestGetter ( ) + quest_getter.save_random_medium_quest ( ) + self._SESSIONAL_DATA["text_of_quest"] = quest_getter.prepared_text_of_random_medium_quest + self._SESSIONAL_DATA["correct_answer_of_quest"] = quest_getter.correct_answer_of_random_medium_quest + + def _save_text_and_correct_answer_of_hard_quest_in_session_data (self) -> None: + quest_getter = QuestGetter ( ) + quest_getter.save_random_hard_quest ( ) + self._SESSIONAL_DATA["text_of_quest"] = quest_getter.prepared_text_of_random_hard_quest + self._SESSIONAL_DATA["correct_answer_of_quest"] = quest_getter.correct_answer_of_random_hard_quest + + def _get_text_of_current_quest (self) -> str: + return self._SESSIONAL_DATA["text_of_quest"] + + @property + def _buttons_for_choosing_correct_answer (self) -> dict: + return create_buttons ("Первое", "Второе", "Третье", "На главное меню", "Пока!") + + + def _choosing_right_answer_for_quest (self) -> None: + if self._has_one_word_in_text_in_lower ("1", "один", "первый", "первое"): + if self._SESSIONAL_DATA["correct_answer_of_quest"] == 1: + self._correct_answer_of_quest_is_selected ( ) + else: + self._wrong_answer_of_quest_is_selected ( ) + + elif self._has_one_word_in_text_in_lower ("2", "два", "второй", "второе"): + if self._SESSIONAL_DATA["correct_answer_of_quest"] == 2: + self._correct_answer_of_quest_is_selected ( ) + else: + self._wrong_answer_of_quest_is_selected ( ) + + elif self._has_one_word_in_text_in_lower ("3", "три", "третий", "третье"): + if self._SESSIONAL_DATA["correct_answer_of_quest"] == 3: + self._correct_answer_of_quest_is_selected ( ) + else: + self._wrong_answer_of_quest_is_selected ( ) + + elif self._has_all_words_in_text_in_lower ("на", "главное", "меню"): + self._go_to_main_menu ( ) + + elif self._user_wants_to_end_session: + self._end_the_session ( ) + + else: + self._OUTPUT_TEXT = "Извините, такого ответа нет." + self._BUTTONS = self._buttons_for_choosing_correct_answer + + def _correct_answer_of_quest_is_selected (self) -> None: + self._OUTPUT_TEXT = "Ура! Ты ответил правильно!\n" + self._OUTPUT_TEXT += "Показать следующий квест или сменить уровень сложности?" + self._SESSIONAL_DATA["choosing_right_answer_for_quest"] = False + self._SESSIONAL_DATA["choosing_between_repeating_and_changing_difficulty_level"] = True + self._BUTTONS = self._buttons_for_next_quest_or_changing_difficulty_level + + @property + def _buttons_for_next_quest_or_changing_difficulty_level (self) -> dict: + return create_buttons ("Следующий квест", "Сменить уровень сложности", + "На главное меню", "Пока!") + + def _wrong_answer_of_quest_is_selected (self) -> None: + self._OUTPUT_TEXT = "К сожалению, это неверный ответ." + self._BUTTONS = self._buttons_for_choosing_correct_answer + + + def _choosing_between_repeating_and_changing_difficulty_level (self) -> None: + if self._has_one_word_in_text_in_lower ("дальше", "далее", "следующий"): + self._SESSIONAL_DATA["choosing_between_repeating_and_changing_difficulty_level"] = False + self._SESSIONAL_DATA["choosing_right_answer_for_quest"] = True + self._save_text_and_correct_answer_of_quest_with_any_difficulty_level_in_session_data ( ) + self._OUTPUT_TEXT = "Хорошо.\n" + self._OUTPUT_TEXT += self._get_text_of_current_quest ( ) + self._BUTTONS = self._buttons_for_choosing_correct_answer + + elif self._has_one_word_in_text_in_lower ("сменить", "изменить"): + self._SESSIONAL_DATA["working_with_quest"] = True + self._OUTPUT_TEXT = "Отлично.\nТеперь просто скажите нужный уровень сложности:\n" + self._OUTPUT_TEXT += "Лёгкий.\n" + self._OUTPUT_TEXT += "Средний.\n" + self._OUTPUT_TEXT += "Высокий.\n" + self._OUTPUT_TEXT += "Рандом." + self._BUTTONS = self._buttons_for_choosing_difficutly_level + + elif self._user_wants_to_go_to_main_menu: + self._go_to_main_menu ( ) + + elif self._user_wants_to_end_session: + self._end_the_session ( ) + + else: + self._OUTPUT_TEXT = get_apology_text ( ) + self._BUTTONS = self._buttons_for_next_quest_or_changing_difficulty_level + + def _save_text_and_correct_answer_of_quest_with_any_difficulty_level_in_session_data (self) -> None: + match self._SESSIONAL_DATA["difficulty_level"]: + case DifficultyLevelsOfQuest.EASY.value: + self._save_text_and_correct_answer_of_easy_quest_in_session_data ( ) + case DifficultyLevelsOfQuest.MEDIUM.value: + self._save_text_and_correct_answer_of_medium_quest_in_session_data ( ) + case DifficultyLevelsOfQuest.HARD.value: + self._save_text_and_correct_answer_of_hard_quest_in_session_data ( ) + #case _: + # raise ValueError ("В self._SESSIONAL_DATA[\"difficulty_level\"]" + + # f"класса {__class__.__name__} записано значение "+ + # "{self._SESSIONAL_DATA["difficulty_level"]},\n" + + # "хотя должно быть записано 0, 1 или 2!") + + + def _has_all_words_in_text_in_lower (self, *words) -> bool: + for word in words: + if not word in self._WORDS_OF_TEXT_IN_LOWER: + return False + return True + + def _has_one_word_in_text_in_lower (self, *words) -> bool: + for word in words: + if word in self._WORDS_OF_TEXT_IN_LOWER: + return True + return False + + + def _go_to_main_menu (self) -> None: + self._OUTPUT_TEXT = get_text_that_says_user_is_just_in_main_menu ( ) + self._BUTTONS = create_buttons_of_main_menu ( ) + self._make_all_sessional_data_false ( ) + + def _make_all_sessional_data_false (self) -> None: + """Если всё в _SESSIONAL_DATA будет False, + значит пользователь на главном меню""" + for key in self._SESSIONAL_DATA.keys(): + self._SESSIONAL_DATA[key] = False + + + def _end_the_session (self) -> None: + self._OUTPUT_TEXT = get_farewell_text ( ) + self._IS_END_SESSION = True + + + def get_response (self) -> dict: + return { + "version": self._VERSION, + "response": { + "text": self._OUTPUT_TEXT, + "end_session": self._IS_END_SESSION, + "buttons": self._BUTTONS}, + "session_state": self._SESSIONAL_DATA, + "user_state_update": self._INTERSESSIONAL_DATA + } + + + +# Функция, вызываемая Яндексом для запуска скрипта Алисы (в коде вызывать её не нужно). +def main (request_from_alisa: dict, context) -> dict: + handler_of_alisa = HandlerOfAlisa (request_from_alisa) + return handler_of_alisa.get_response ( ) \ No newline at end of file diff --git a/quest_getter.py b/quest_getter.py new file mode 100644 index 0000000..12317ee --- /dev/null +++ b/quest_getter.py @@ -0,0 +1,98 @@ +import json +import random + +from typing import Literal +from enums import DifficultyLevelsOfQuest + + +class QuestGetter: + """Создаётся экземпляр класса, затем вызывается метод, + сохраняющий один случайный квест указанной сложности. + Затем можно получить подготовленный текст сохраннённого + квеста и правильный ответ на него.""" + def __init__ (self): + self._load_all_quests_from_file ( ) + self._group_quests ( ) + + def _load_all_quests_from_file (self) -> None: + with open (self._name_of_file_with_quests, "r") as file: + self.all_quests: dict = json.load (file) + + @property + def _name_of_file_with_quests (self) -> str: + return "quests.json" + + def _group_quests (self) -> None: + self._create_empty_grouped_quests ( ) + for key in self.all_quests.keys(): + if self.all_quests[key]["difficulty_level"] == DifficultyLevelsOfQuest.EASY.value: + self.easy_quests.append (self.all_quests[key]) + elif self.all_quests[key]["difficulty_level"] == DifficultyLevelsOfQuest.MEDIUM.value: + self.medium_quests.append (self.all_quests[key]) + elif self.all_quests[key]["difficulty_level"] == DifficultyLevelsOfQuest.HARD.value: + self.hard_quests.append (self.all_quests[key]) + else: + raise ValueError ("Указан неверный уровень сложности " + + f"в файле {self._name_of_file_with_quests}\n." + + f"Номер неправильного квеста: {key}.") + + def _create_empty_grouped_quests (self) -> None: + self.easy_quests = [ ] + self.medium_quests = [ ] + self.hard_quests = [ ] + + + def save_random_easy_quest (self) -> None: + self.saved_random_easy_quest = random.choice (self.easy_quests) + + def save_random_medium_quest (self) -> None: + self.saved_random_medium_quest = random.choice (self.medium_quests) + + def save_random_hard_quest (self) -> None: + self.saved_random_hard_quest = random.choice (self.hard_quests) + + + @property + def text_of_random_easy_quest (self) -> str: + return self.saved_random_easy_quest["quest_text"] + + @property + def prepared_text_of_random_easy_quest (self) -> str: + return self._get_prepared_quest_text_for_user (self.saved_random_easy_quest) + + @property + def correct_answer_of_random_easy_quest (self) -> Literal[1, 2, 3]: + return self.saved_random_easy_quest["correct_answer"] + 1 # В файле первый ответ 0, а не 1 + + @property + def text_of_random_medium_quest (self) -> str: + return self.saved_random_medium_quest["quest_text"] + + @property + def prepared_text_of_random_medium_quest (self) -> str: + return self._get_prepared_quest_text_for_user (self.saved_random_medium_quest) + + @property + def correct_answer_of_random_medium_quest (self) -> Literal[1, 2, 3]: + return self.saved_random_medium_quest["correct_answer"] + 1 # В файле первый ответ 0, а не 1 + + @property + def text_of_random_hard_quest (self) -> str: + return self.saved_random_hard_quest["quest_text"] + + @property + def prepared_text_of_random_hard_quest (self) -> str: + return self._get_prepared_quest_text_for_user (self.saved_random_hard_quest) + + @property + def correct_answer_of_random_hard_quest (self) -> Literal[1, 2, 3]: + return self.saved_random_hard_quest["correct_answer"] + 1 # В файле первый ответ 0, а не 1 + + + def _get_prepared_quest_text_for_user (self, quest: dict) -> str: + prepared_quest_text = quest["quest_text"] + "\n" + answer_number = 1 + for answer in quest["answers"]: + prepared_quest_text += f"{answer_number}) {answer}\n" + answer_number += 1 + return prepared_quest_text \ No newline at end of file diff --git a/quests.json b/quests.json new file mode 100644 index 0000000..7b57c24 --- /dev/null +++ b/quests.json @@ -0,0 +1,441 @@ +{ + "1": { + "quest_text": "Какая команда в Python используется для вывода текста на экран?", + "answers": [ + "input()", + "print()", + "int()" + ], + "difficulty_level": 1, + "correct_answer": 1 + }, + + "2": { + "quest_text": "Какая функция Python используется для чтения пользовательского ввода с клавиатуры?", + "answers": [ + "input()", + "read()", + "get_input()" + ], + "difficulty_level": 0, + "correct_answer": 0 + }, + + "3": { + "quest_text": "Какая из этих операций увеличивает значение переменной на 1?", + "answers": [ + "x = x - 1", + "x = x * 2", + "x = x + 1" + ], + "difficulty_level": 0, + "correct_answer": 2 + }, + + "4": { + "quest_text": " Какой оператор используется для присвоения значения переменной в Python?", + "answers": [ + ":=", + "=", + "==" + ], + "difficulty_level": 0, + "correct_answer": 1 + }, + + "5": { + "quest_text": "Какой оператор в Python используется для проверки равенства значений?", + "answers": [ + ":=", + "!=", + "==" + ], + "difficulty_level": 0, + "correct_answer": 2 + }, + + "6": { + "quest_text": "Какой оператор используется для осуществления логического НЕ в Python?", + "answers": [ + "!", + "%", + "not" + ], + "difficulty_level": 0, + "correct_answer": 2 + }, + + "7": { + "quest_text": "Какие ключевые слова в Python используются для определения условных операторов?", + "answers": [ + "if и else", + "while и for", + "try и except" + ], + "difficulty_level": 0, + "correct_answer": 0 + }, + + "8": { + "quest_text": "Как создать цикл for, который будет выполняться 10 раз?", + "answers": [ + "for i in range(1, 10):", + "for i in range(10):", + "for i in range(1, 11):" + ], + "difficulty_level": 0, + "correct_answer": 1 + }, + + "9": { + "quest_text": "Как создать пустой словарь в Python?", + "answers": [ + "dict()", + "{}", + "[]" + ], + "difficulty_level": 0, + "correct_answer": 1 + }, + + "10": { + "quest_text": "Какой тип данных используется для хранения списка элементов?", + "answers": [ + "list", + "bool", + "int" + ], + "difficulty_level": 0, + "correct_answer": 0 + }, + + "11": { + "quest_text": "Каким будет результат выполнения данного кода: items = [1, 2, 3, 4, 5] print(items[2])", + "answers": [ + "1", + "2", + "3" + ], + "difficulty_level": 0, + "correct_answer": 2 + }, + + "12": { + "quest_text": "Какая функция в Python используется для создания пустого списка?", + "answers": [ + "list()", + "dict()", + "set()" + ], + "difficulty_level": 0, + "correct_answer": 0 + }, + + "13": { + "quest_text": "От какого родительского класса нужно наследовать дочерний, чтобы создать перечисление?", + "answers": [ + "ABC", + "Exception", + "enum" + ], + "difficulty_level": 2, + "correct_answer": 2 + }, + + "14": { + "quest_text": "Что такое генераторы в Python?", + "answers": [ + "Это функции, которые создают последовательность значений", + "Это объекты, которые создают последовательность значений", + "Это операторы, которые создают последовательность значений" + ], + "difficulty_level": 1, + "correct_answer": 1 + }, + + "15": { + "quest_text": "С помощью какой функции можно узнать длину строки в Python?", + "answers": [ + "length()", + "len()", + "size()" + ], + "difficulty_level": 0, + "correct_answer": 1 + }, + + "16": { + "quest_text": "Какая функция используется для генерации случайного числа в Python?", + "answers": [ + "random()", + "randint()", + "choice()" + ], + "difficulty_level": 0, + "correct_answer": 1 + }, + + "17": { + "quest_text": "Какую библиотеку нужно использовать, чтобы работать с датами и временем?", + "answers": [ + "datetime", + "time", + "calendar" + ], + "difficulty_level": 1, + "correct_answer": 0 + }, + + "18": { + "quest_text": "Какую библиотеку нужно использовать, чтобы работать с базами данных?", + "answers": [ + "sqlite", + "reportlab", + "scipy" + ], + "difficulty_level": 1, + "correct_answer": 0 + }, + + "19": { + "quest_text": "Какую библиотеку нужно использовать, чтобы работать с графиками и диаграммами?", + "answers": [ + "pandas", + "matplotlib", + "numpy" + ], + "difficulty_level": 1, + "correct_answer": 1 + }, + + "20": { + "quest_text": "Какую библиотеку нужно использовать, чтобы работать с научными расчетами и численными методами?", + "answers": [ + "sympy", + "tensorflow", + "scipy" + ], + "difficulty_level": 1, + "correct_answer": 2 + }, + + "21": { + "quest_text": "Какую библиотеку нужно использовать, чтобы работать с обработкой естественного языка?", + "answers": [ + "Theano", + "PyTorch", + "gensim" + ], + "difficulty_level": 1, + "correct_answer": 2 + }, + + "22": { + "quest_text": "Какую библиотеку нужно использовать, чтобы работать с созданием PDF-файлов?", + "answers": [ + "Keras", + "pdfkit", + "PyWin32" + ], + "difficulty_level": 1, + "correct_answer": 1 + }, + + "23": { + "quest_text": "Какую библиотеку нужно использовать, чтобы работать со статистическим анализом данных?", + "answers": [ + "Bokeh", + "numpy", + "statsmodels" + ], + "difficulty_level": 1, + "correct_answer": 2 + }, + + "24": { + "quest_text": "Какую библиотеку нужно использовать, чтобы работать с машинным обучением и глубоким обучением?", + "answers": [ + "tensorflow", + "Flask ", + "Plotly " + ], + "difficulty_level": 1, + "correct_answer": 0 + }, + + "25": { + "quest_text": "Какую библиотеку нужно использовать, чтобы работать с RESTful API?", + "answers": [ + "django", + "requests ", + "Scrapy" + ], + "difficulty_level": 1, + "correct_answer": 1 + }, + + "26": { + "quest_text": "Какую библиотеку нужно использовать, чтобы работать с веб-скрапингом?", + "answers": [ + "PyOpenGL", + "OpenCV", + "BeautifulSoup" + ], + "difficulty_level": 1, + "correct_answer": 2 + }, + + "27": { + "quest_text": "Какое ключевое слово используется для создания функции в Python?", + "answers": [ + "func", + "def", + "define" + ], + "difficulty_level": 1, + "correct_answer": 1 + }, + + "28": { + "quest_text": "Какое ключевое слово используется для создания класса в Python?", + "answers": [ + "class", + "def", + "define" + ], + "difficulty_level": 1, + "correct_answer": 0 + }, + + "29": { + "quest_text": "Какое ключевое слово используется для создания класса в Python?", + "answers": [ + "continue", + "exit", + "break" + ], + "difficulty_level": 1, + "correct_answer": 2 + }, + + "30": { + "quest_text": "Что такое списковое включение (list comprehension)?", + "answers": [ + "Функция, возвращающая случайный элемент списка", + "Способ создания нового списка на основе старого с использованием условий и циклов", + "Метод для добавления элемента в список" + ], + "difficulty_level": 1, + "correct_answer": 1 + }, + + "31": { + "quest_text": "Что такое лямбда-функция?", + "answers": [ + "Инструмент для чтения файлов", + "Функция без имени, которая может быть передана в другую функцию", + "Инструмент для работы с базами данных" + ], + "difficulty_level": 1, + "correct_answer": 1 + }, + + "32": { + "quest_text": "Что означает ключевое слово global?", + "answers": [ + "Объявление переменной в глобальной области видимости", + "Объявление переменной в локальной области видимости", + "Объявление функции" + ], + "difficulty_level": 1, + "correct_answer": 0 + }, + + "33": { + "quest_text": "Какой метод используется для перевода строки в нижний регистр?", + "answers": [ + "to_lower()", + "lower()", + "casefold()" + ], + "difficulty_level": 1, + "correct_answer": 1 + }, + + "34": { + "quest_text": "Что такое рекурсия?", + "answers": [ + "Способ создания списка на основе другого списка", + "Цикл, повторяющийся до тех пор, пока не будет выполнено определенное условие", + "Функция, вызывающая саму себя" + ], + "difficulty_level": 1, + "correct_answer": 2 + }, + + "35": { + "quest_text": "Что такое словарь (dict) в Python?", + "answers": [ + "Список, содержащий элементы разных типов данных", + "Массив фиксированной длины", + "Коллекция, содержащая пары ключ-значение" + ], + "difficulty_level": 1, + "correct_answer": 2 + }, + + "36": { + "quest_text": "Что такое генератор (generator) в Python?", + "answers": [ + "Функция, которая возвращает последовательность значений без генерации списка целиком", + "Функция, которая может быть вызвана с любым количеством аргументов", + "Функция, которая принимает список и возвращает новый список, содержащий только уникальные значения" + ], + "difficulty_level": 1, + "correct_answer": 0 + }, + + "37": { + "quest_text": "Какой модуль используется для работы с регулярными выражениями?", + "answers": [ + "regex", + "re", + "reg" + ], + "difficulty_level": 1, + "correct_answer": 1 + }, + + "38": { + "quest_text": "Что означает ключевое слово pass?", + "answers": [ + "Оператор, который не делает ничего", + "Оператор, который прерывает выполнение программы", + "Оператор, который возвращает значение из функции" + ], + "difficulty_level": 1, + "correct_answer": 0 + }, + + "39": { + "quest_text": "Какой метод используется для разделения строки на список по заданному разделителю?", + "answers": [ + "join()", + "split()", + "separate()" + ], + "difficulty_level": 1, + "correct_answer": 1 + }, + + "40": { + "quest_text": "Какое ключевое слово используется для импорта модуля в Python?", + "answers": [ + "include", + "require", + "import" + ], + "difficulty_level": 1, + "correct_answer": 2 + } +} \ No newline at end of file diff --git a/texts_for_users.json b/texts_for_users.json index 70b5014..a105818 100644 --- a/texts_for_users.json +++ b/texts_for_users.json @@ -10,6 +10,7 @@ "С добрым временем суток!", "Hello!" ], + "introduction_to_course": "Что ж, вы решили начать изучение языка Python.\nПройдя этот курс вы познакомитесь с основами программирования, научитесь писать простые программы и понимать код!\nЗдесь и дальше просто скажите: \"Далее\".\nЕсли хотите попасть на главное меню скажите: \"На главное меню\".", "if_user_has_forgotten_commands": [ "Надеюсь, вы не забыли мои основные команды. Давайте, я напомню их вам:", "Надеюсь, вы помните как продолжить курс? Давайте я напомню мои команды:", @@ -20,13 +21,28 @@ "Вот мои команды, если вы их забыли:", "Вот мои основные команды:" ], - "main_commands_of_skill": "курс,\nперейди на N урок,\nзадачка,\nквест,\nоцени мои знания.", + "main_commands_of_skill": [ + "Курс", + "Перейди на N урок", + "Задачка", + "Квест", + "Продолжить квест", + "Оцени мои знания", + "Выход" + ], "you_stopped_at_lesson": [ "Что ж, вы остановились на уроке №", "Итак, вы остановились на уроке №", "Урок, на котором вы остановились - №", "Ваш последний урок - №" ], + "you_stopped_at_task": [ + "Что ж, ваша последняя задачка - №", + "Итак, вы остановились на задачке №", + "Задачка, на которой вы остановились - №", + "Вы остановились на задачке №", + "Ваша последняя задачка - №" + ], "something_is_unclear": [ "Извините, я вас не поняла.", "Простите, я вас не поняла.", diff --git a/useful_functions.py b/useful_functions.py new file mode 100644 index 0000000..6342bbc --- /dev/null +++ b/useful_functions.py @@ -0,0 +1,39 @@ +from json_manager import * + + +def create_sessional_data (sessional_data: dict) -> dict: + if sessional_data == { }: # То есть это первое сообщение + return {"working_with_course": False, + "working_with_quest": False, + "choosing_right_answer_for_quest": False, + "choosing_between_repeating_and_changing_difficulty_level": False, + "text_of_quest": "", + "correct_answer_of_quest": 0, + "difficulty_level": 0, + "working_with_tasks": False, + "working_with_report": False + } + else: # Значит, сообщение уже не первое + return sessional_data + + +def create_intersessional_data (intersessional_data: dict) -> dict: + if not "new_user" in intersessional_data.keys() or intersessional_data["new_user"]: + return { + "new_user": True, + "last_lesson": 0, + "last_task": 0 + } + else: + return intersessional_data + + +def get_user_greeting ( ) -> str: + hello_text = get_hello_text ( ) + "\n" + hello_text += get_text_asking_if_user_has_forgotten_commands ( ) + "\n" + hello_text += get_main_commands_of_skill ( ) + return hello_text + + +def get_text_that_says_user_is_just_in_main_menu ( ) -> str: + return "Вы на главном меню!\nМои основные команды:\n" + get_main_commands_of_skill ( ) From ed1768567c47aff8d47f1c90e8c1a38fef7539be Mon Sep 17 00:00:00 2001 From: Alexonys1 <107358560+Alexonys1@users.noreply.github.com> Date: Wed, 22 Mar 2023 11:44:41 +0300 Subject: [PATCH 05/31] =?UTF-8?q?=D0=92=D1=82=D0=BE=D1=80=D0=B0=D1=8F=20?= =?UTF-8?q?=D0=B2=D0=B5=D1=80=D1=81=D0=B8=D1=8F=20=D0=BD=D0=B0=D0=B2=D1=8B?= =?UTF-8?q?=D0=BA=D0=B0.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Просто решил закинуть обновление, чтоб все видели, что с кодом происходит. --- alisa's response.json | 53 +++ json_manager.py | 16 + main.py | 209 +++++++- main2.py | 244 +++++++--- quest_getter.py | 55 ++- quests.json | 1058 ++++++++++++++++++++++++----------------- texts_for_users.json | 56 ++- useful_functions.py | 7 +- 8 files changed, 1159 insertions(+), 539 deletions(-) create mode 100644 alisa's response.json diff --git a/alisa's response.json b/alisa's response.json new file mode 100644 index 0000000..149808e --- /dev/null +++ b/alisa's response.json @@ -0,0 +1,53 @@ +{ + "meta": { + "client_id": "ru.yandex.searchplugin/7.16 (none none; android 4.4.2)", + "interfaces": { + "account_linking": {}, + "payments": {}, + "screen": {} + }, + "locale": "ru-RU", + "timezone": "UTC" + }, + "request": { + "original_utterance": "user text", + "command": "user text", + "nlu": { + "entities": [], + "tokens": [ + "да" + ], + "intents": {} + }, + "markup": { + "dangerous_context": false + }, + "type": "SimpleUtterance" + }, + "session": { + "message_id": 0, + "new": false, + "session_id": "ea6be08d-9794-4ae2-89e2-e94f6734cc65", + "skill_id": "a8f78148-8184-4010-b508-ec70badddf82", + "user_id": "94748746704CDF263F766BC5E1F0F9D68CD6DB739F2E7CCEF975EC7FCF2A9666", + "user": { + "user_id": "86507D953A1790E1F26F46ED4874098F7BC2658CFC9588F9CCC3E1DD9C061A95" + }, + "application": { + "application_id": "94748746704CDF263F766BC5E1F0F9D68CD6DB739F2E7CCEF975EC7FCF2A9666" + } + }, + "state": { + "session": { + "lesson_choice": true, + "user_choice": true + }, + "user": { + "new_user": false, + "last_lesson": 0, + "last_task": 0 + }, + "application": {} + }, + "version": "1.0" +} \ No newline at end of file diff --git a/json_manager.py b/json_manager.py index f1665f3..85fb784 100644 --- a/json_manager.py +++ b/json_manager.py @@ -51,6 +51,22 @@ def get_text_that_says_which_task_user_stopped (task_number: int) -> str: return random.choice (texts_for_users["you_stopped_at_task"]) + str (task_number) +def get_text_that_says_answer_is_correct ( ) -> str: + return random.choice (texts_for_users["correct_answer"]) + + +def get_text_that_says_answer_is_wrong ( ) -> str: + return random.choice (texts_for_users["wrong_answer"]) + + +def get_text_that_says_there_is_no_answer_like_that ( ) -> str: + return random.choice (texts_for_users["there_is_no_answer_like_that"]) + + +def get_text_that_suggests_to_continue_or_change_difficulty_level ( ) -> str: + return random.choice (texts_for_users["continue_or_change_difficulty_level"]) + + def create_buttons (*button_texts: str) -> list: ready_buttons = [ ] for text_of_button in button_texts: diff --git a/main.py b/main.py index df14936..421bcd5 100644 --- a/main.py +++ b/main.py @@ -1,4 +1,6 @@ from json_manager import * +from useful_functions import * +from enums import * class HandlerOfAlisa: @@ -7,12 +9,15 @@ def __init__ (self, request: dict): self._TEXT_IN_LOWER: str = request["request"]["command"] self._ORIGINAL_TEXT: str = request["request"]["original_utterance"] self._WORDS_OF_TEXT_IN_LOWER: list = request["request"]["nlu"]["tokens"] + self._OUTPUT_TEXT = "" self._IS_FIRST_MESSAGE: bool = request["session"]["new"] self._IS_END_SESSION: bool = False - self._SESSION_DATA: dict = request["state"]["session"] + self._SESSIONAL_DATA: dict = request["state"]["session"] self._INTERSESSIONAL_DATA: dict = request["state"]["user"] # Межсессионные данные + self._BUTTONS = [ ] + self._buttons_of_main_menu = create_buttons (*get_main_commands_of_skill_as_list ( )) self._create_intersessional_data_if_necessary ( ) - self._prepare_correct_answer ( ) + self._working_with_user ( ) def _create_intersessional_data_if_necessary (self) -> None: # Я думаю, что у нового пользователя межсессионные данные пусты, @@ -25,47 +30,210 @@ def _create_intersessional_data_if_necessary (self) -> None: self._INTERSESSIONAL_DATA["last_lesson"] = 0 self._INTERSESSIONAL_DATA["last_task"] = 0 - def _prepare_correct_answer (self) -> None: + def _working_with_user (self) -> None: + if "user_should_choose_something" in self._SESSIONAL_DATA.keys(): + if self._SESSIONAL_DATA["user_should_choose_something"]: + self._interception_of_attention ( ) + else: + self._choosing_function_in_main_menu ( ) + else: + self._choosing_function_in_main_menu ( ) + + def _interception_of_attention (self) -> None: + if "choosing_lesson" in self._SESSIONAL_DATA.keys(): + self._do_something_if_choosing_lesson_is_true ( ) + + if "choosing_task" in self._SESSIONAL_DATA.keys(): + pass # FIXME + + if "choosing_right_answer_for_quest" in self._SESSIONAL_DATA.keys(): + self._do_something_if_choosing_right_answer_for_quest ( ) + + if "quest_difficulty_selection" in self._SESSIONAL_DATA.keys(): + self._do_something_if_quest_difficulty_selection_is_true ( ) + + def _do_something_if_choosing_lesson_is_true (self) -> None: + if self._SESSIONAL_DATA["choosing_lesson"]: + if self._has_one_word_in_text_in_lower ("далее", "дальше", "следующий", "продолжи"): + self._INTERSESSIONAL_DATA["last_lesson"] += 1 + lesson_number = self._INTERSESSIONAL_DATA["last_lesson"] + self._OUTPUT_TEXT = "Тема урока: " + get_theme_of_lesson (lesson_number) + "\n" + self._OUTPUT_TEXT += get_lesson_text (lesson_number) + self._BUTTONS = create_buttons ("Далее.", "Повтор.", "На главное меню.", "Выйти.") + + elif self._has_one_word_in_text_in_lower ("повтор", "повтори"): + self._OUTPUT_TEXT = "Хорошо.\n" + get_lesson_text ( + self._INTERSESSIONAL_DATA["last_lesson"]) + self._BUTTONS = create_buttons ("Далее.", "Повтор.", "На главное меню.", "Выйти.") + + elif self._has_all_words_in_text_in_lower ("на", "главное", "меню"): + self._user_is_in_main_menu ( ) + + elif self._has_one_word_in_text_in_lower ("выключись", "выход", "выйти"): + self._OUTPUT_TEXT = get_farewell_text ( ) + self._IS_END_SESSION = True + + else: + self._OUTPUT_TEXT = get_apology_text ( ) + + def _do_something_if_quest_difficulty_selection_is_true (self) -> None: + if self._SESSIONAL_DATA["quest_difficulty_selection"]: + # Переделать все уровни сложности в квестах!!! + if self._has_one_word_in_text_in_lower ("лёгкий", "лёгкого", "лёгкому", "лёгким", "лёгком"): + difficulty_level = DifficultyLevelsOfCourse.EASY.value + is_difficulty_level = True + + elif self._has_one_word_in_text_in_lower ("средний", "среднего", "среднему", "среднем", "средним"): + difficulty_level = DifficultyLevelsOfCourse.MEDIUM.value + is_difficulty_level = True + + elif self._has_one_word_in_text_in_lower ("сложный", "сложного", "сложному", "сложным", "сложном"): + difficulty_level = DifficultyLevelsOfCourse.HARD.value + is_difficulty_level = True + + elif self._has_one_word_in_text_in_lower ("рандом", "рандома", "рандому", "рандомом", "рандоме"): + difficulty_level = DifficultyLevelsOfCourse.RANDOM.value + is_difficulty_level = True + + elif self._has_all_words_in_text_in_lower ("на", "главное", "меню"): + self._user_is_in_main_menu ( ) + + elif self._has_one_word_in_text_in_lower ("выключись", "выход", "выйти"): + self._OUTPUT_TEXT = get_farewell_text ( ) + self._IS_END_SESSION = True + + else: + self._OUTPUT_TEXT = get_apology_text ( ) + + if is_difficulty_level: + self._SESSIONAL_DATA["choosing_right_answer_for_quest"] = True + self._BUTTONS = create_buttons ("а", "б", "в") + self._SESSIONAL_DATA["difficulty_level_of_quest"] = difficulty_level + self._SESSIONAL_DATA["quest_difficulty_selection"] = False + self._SESSIONAL_DATA["random_text_and_correct_answer_of_quest"] = get_random_quest_text_and_currect_answer_of_correct_level (difficulty_level) + self._OUTPUT_TEXT = self._SESSIONAL_DATA["random_text_and_correct_answer_of_quest"][0] + + def _do_something_if_choosing_right_answer_for_quest (self) -> None: + if self._SESSIONAL_DATA["choosing_right_answer_for_quest"]: + if self._has_one_word_in_text_in_lower ("а"): + self._BUTTONS = create_buttons ("а", "б", "в") + if self._SESSIONAL_DATA["random_text_and_correct_answer_of_quest"][1] == 0: + self._OUTPUT_TEXT = "Верно!" + self._user_is_in_main_menu ( ) # FIXME + else: + self._OUTPUT_TEXT = "К сожалению, это неправильный ответ.\n" + + elif self._has_one_word_in_text_in_lower ("б"): + self._BUTTONS = create_buttons ("а", "б", "в") + if self._SESSIONAL_DATA["random_text_and_correct_answer_of_quest"][1] == 1: + self._OUTPUT_TEXT = "Верно!" + self._user_is_in_main_menu ( ) # FIXME + else: + self._OUTPUT_TEXT = "К сожалению, это неправильный ответ.\n" + + elif self._has_one_word_in_text_in_lower ("в"): + self._BUTTONS = create_buttons ("а", "б", "в") + if self._SESSIONAL_DATA["random_text_and_correct_answer_of_quest"][1] == 2: + self._OUTPUT_TEXT = "Верно!" + self._user_is_in_main_menu ( ) # FIXME + else: + self._OUTPUT_TEXT = "К сожалению, это неправильный ответ.\n" + + elif self._has_all_words_in_text_in_lower ("на", "главное", "меню"): + self._user_is_in_main_menu ( ) + + elif self._has_one_word_in_text_in_lower ("выключись", "выход", "выйти"): + self._OUTPUT_TEXT = get_farewell_text ( ) + self._IS_END_SESSION = True + + else: + self._OUTPUT_TEXT = "Такого варианта ответа нет!" + + def _user_is_in_main_menu (self) -> None: + self._OUTPUT_TEXT = "Вы на главном меню!\nМои основные команды:\n" + self._OUTPUT_TEXT += get_main_commands_of_skill ( ) + self._SESSIONAL_DATA["user_should_choose_something"] = False + self._SESSIONAL_DATA["quest_difficulty_selection"] = False + self._SESSIONAL_DATA["choosing_lesson"] = False + self._SESSIONAL_DATA["choosing_task"] = False + self._BUTTONS = self._buttons_of_main_menu + + + def _choosing_function_in_main_menu (self) -> None: if self._IS_NEW_USER: - self._NEW_TEXT = get_text_for_new_user ( ) + self._OUTPUT_TEXT = get_text_for_new_user ( ) self._IS_NEW_USER = False self._INTERSESSIONAL_DATA["new_user"] = False + self._BUTTONS = self._buttons_of_main_menu elif self._IS_FIRST_MESSAGE: - self._NEW_TEXT = get_hello_text ( ) + "\n" - self._NEW_TEXT += get_text_asking_if_user_has_forgotten_commands ( ) + "\n" - self._NEW_TEXT += get_main_commands_of_skill ( ) + self._OUTPUT_TEXT = get_hello_text ( ) + "\n" + self._OUTPUT_TEXT += get_text_asking_if_user_has_forgotten_commands ( ) + "\n" + self._OUTPUT_TEXT += get_main_commands_of_skill ( ) + self._BUTTONS = self._buttons_of_main_menu + self._SESSIONAL_DATA["user_should_choose_something"] = False + self._SESSIONAL_DATA["quest_difficulty_selection"] = False + self._SESSIONAL_DATA["choosing_answer_of_quest"] = False + self._SESSIONAL_DATA["choosing_lesson"] = False + self._SESSIONAL_DATA["choosing_taskho"] = False # Пока навык разрабатывается - elif self._has_all_words_in_text_in_lower ("сбрось", "настройки"): + elif self._has_all_words_in_text_in_lower ("сбрось", "настройки") or\ + self._has_all_words_in_text_in_lower ("сбросить", "настройки"): self._IS_NEW_USER = True self._INTERSESSIONAL_DATA["new_user"] = True self._INTERSESSIONAL_DATA["last_lesson"] = 0 self._INTERSESSIONAL_DATA["last_task"] = 0 - self._NEW_TEXT = "Настройки сброшены." + self._OUTPUT_TEXT = "Настройки сброшены." elif self._has_one_word_in_text_in_lower ( "курс", "курса", "курсу", "курсе", "курсом"): last_lesson: int = self._INTERSESSIONAL_DATA["last_lesson"] - self._NEW_TEXT = get_text_that_says_which_lesson_user_stopped (last_lesson) + "\n" - self._NEW_TEXT += "Его тема: " + get_theme_of_lesson (last_lesson) + "\n" - self._NEW_TEXT += "Хотите перейти к следующему уроку?" + if last_lesson != 0: + self._OUTPUT_TEXT = get_text_that_says_which_lesson_user_stopped (last_lesson) + "\n" + self._OUTPUT_TEXT += "Его тема: " + get_theme_of_lesson (last_lesson) + "\n" + self._OUTPUT_TEXT += "Если хотите перейти к следующему уроку, то скажите: \"Далее\".\n" + self._OUTPUT_TEXT += "Если хотите выйти на главное меню, скажите: \"На главное меню\".\n" + self._OUTPUT_TEXT += "Также вы можете прослушать урок ещё раз, сказав: \"Повтор\"." + else: + self._OUTPUT_TEXT = get_introduction_to_course ( ) + + self._BUTTONS = create_buttons ("Далее.", "На главное меню.", "Повтор.") + self._SESSIONAL_DATA["user_should_choose_something"] = True + self._SESSIONAL_DATA["choosing_lesson"] = True # FIXME - + + elif self._has_all_words_in_text_in_lower ("продолжи", "курс"): + self._OUTPUT_TEXT = "Хорошо!\n" + last_lesson: int = self._INTERSESSIONAL_DATA["last_lesson"] + next_lesson = last_lesson + 1 + self._OUTPUT_TEXT += "Тема урока: " + get_theme_of_lesson (next_lesson) + "\n" + self._OUTPUT_TEXT += "ЗАТЫЧКА: показан текст следующего урока." + elif self._has_one_word_in_text_in_lower ( - "пока", "пака", "прощай", "свидания", "пора", "чао"): - self._NEW_TEXT = get_farewell_text ( ) + "квест", "квеста", "квесту", "квесте", "квесту"): + self._OUTPUT_TEXT = "Отличный выбор!\nЗдесь вы можете потренироваться в коротких вопросах.\n" + self._OUTPUT_TEXT += "Есть 3 уровня сложности: лёгкий, средний и сложный\n." + self._OUTPUT_TEXT += "Также есть \"Рандом\"." + self._BUTTONS = create_buttons ("Лёгкий.", "Средний.", "Сложный.", "Рандом", "На главное меню.", "Выйти.") + self._SESSIONAL_DATA["user_should_choose_something"] = True + self._SESSIONAL_DATA["quest_difficulty_selection"] = True + + elif self._has_one_word_in_text_in_lower ( + "пока", "пака", "прощай", "свидания", "пора", "чао", "выход", "выйти", "отбой"): + self._OUTPUT_TEXT = get_farewell_text ( ) self._IS_END_SESSION = True else: - self._NEW_TEXT = get_apology_text ( ) + self._OUTPUT_TEXT = get_apology_text ( ) + def _has_all_words_in_text_in_lower (self, *words) -> bool: for word in words: if not word in self._WORDS_OF_TEXT_IN_LOWER: return False return True - + def _has_one_word_in_text_in_lower (self, *words) -> bool: for word in words: if word in self._WORDS_OF_TEXT_IN_LOWER: @@ -76,8 +244,11 @@ def _has_one_word_in_text_in_lower (self, *words) -> bool: def get_response (self) -> dict: return { "version": self._VERSION, - "response": {"text": self._NEW_TEXT, "end_session": self._IS_END_SESSION}, - "session_state": self._SESSION_DATA, + "response": { + "text": self._OUTPUT_TEXT, + "end_session": self._IS_END_SESSION, + "buttons": self._BUTTONS}, + "session_state": self._SESSIONAL_DATA, "user_state_update": self._INTERSESSIONAL_DATA } diff --git a/main2.py b/main2.py index f1dc53c..de978a5 100644 --- a/main2.py +++ b/main2.py @@ -1,3 +1,5 @@ +import random + from json_manager import * from useful_functions import * from quest_getter import QuestGetter @@ -14,6 +16,7 @@ def __init__ (self, request: dict): self._IS_END_SESSION: bool = False self._SESSIONAL_DATA: dict = create_sessional_data (request["state"]["session"]) self._INTERSESSIONAL_DATA: dict = create_intersessional_data (request["state"]["user"]) + self._TEXT_TO_SPEECH = "" self._BUTTONS = [ ] self._working_with_user ( ) @@ -86,15 +89,41 @@ def _working_with_user_in_main_menu (self) -> None: elif self._has_one_word_in_text_in_lower ( "квест", "квеста", "квесту", "квестом", "квесте"): # Просто доделать - # FIXME self._SESSIONAL_DATA["working_with_quest"] = True self._OUTPUT_TEXT = "Какой уровень сложности вы предпочитаете?\n" self._OUTPUT_TEXT += "Лёгкий.\n" self._OUTPUT_TEXT += "Средний.\n" self._OUTPUT_TEXT += "Высокий.\n" - self._OUTPUT_TEXT += "Случайный." + self._OUTPUT_TEXT += "Случайный.\n" self._BUTTONS = self._buttons_for_choosing_difficutly_level + elif self._has_all_words_in_text_in_lower ("на", "урок"): + self._SESSIONAL_DATA["working_with_course"] = True + self._OUTPUT_TEXT = "Пока \"Перейти на N урок\" ничего не умеет...\n" + self._OUTPUT_TEXT += "Может, на главное меню?" + self._BUTTONS = create_buttons ("На главное меню", "Пока!") + + elif self._has_one_word_in_text_in_lower ("пожаловаться", "жалоба") or \ + self._has_all_words_in_text_in_lower ("отправить", "отчёт") or \ + self._has_all_words_in_text_in_lower ("отправить", "жалобу"): + self._SESSIONAL_DATA["sending_report"] = True + self._OUTPUT_TEXT = "Я не знаю, на какую почту отправлять жалобу...\n" + self._OUTPUT_TEXT += "Может, на главное меню?" + self._BUTTONS = create_buttons ("На главное меню", "Пока!") + + elif self._has_one_word_in_text_in_lower ( + "консультант", "консультанта", "консультанту", "консультантом", "консультанте" + "консультация", "консультации", "консультацию", "консультацией", "проконсультируй"): + self._SESSIONAL_DATA["consulting"] = True + self._OUTPUT_TEXT = "Пока я не могу вас проконсультировать, извините...\n" + self._OUTPUT_TEXT += "Может, на главное меню?" + self._BUTTONS = create_buttons ("На главное меню", "Пока!") + + elif self._has_all_words_in_text_in_lower ("оцени", "знания"): + self._OUTPUT_TEXT = "Зачем \"Оцени мои знания\", когда есть \"Квест\"?\n" + self._OUTPUT_TEXT += "Скажи \"Квест\", чтобы его попробовать." + self._BUTTONS = create_buttons_of_main_menu ( ) + elif self._user_wants_to_go_to_main_menu: self._OUTPUT_TEXT = "Вы уже на главном меню!" @@ -106,8 +135,8 @@ def _working_with_user_in_main_menu (self) -> None: @property def _buttons_for_choosing_difficutly_level (self) -> dict: - return create_buttons ("Лёгкий", "Средний", "Высокий", "Рандом", - "На главное меню", "Пока!") + return create_buttons ("Лёгкий", "Средний", "Высокий", "Случайный", + "Узнать мои результаты", "На главное меню", "Пока!") def _working_with_user_outside_main_menu (self) -> None: @@ -120,8 +149,12 @@ def _working_with_user_outside_main_menu (self) -> None: self._working_with_quest ( ) elif self._SESSIONAL_DATA["choosing_right_answer_for_quest"]: self._choosing_right_answer_for_quest ( ) - elif self._SESSIONAL_DATA["choosing_between_repeating_and_changing_difficulty_level"]: - self._choosing_between_repeating_and_changing_difficulty_level ( ) + elif self._SESSIONAL_DATA["viewing_quest_results"]: + self._viewing_quest_results ( ) + elif self._SESSIONAL_DATA["sending_report"]: + self._sending_report ( ) + elif self._SESSIONAL_DATA["consulting"]: + self._consulting ( ) def _working_with_course (self) -> None: if self._user_wants_to_go_to_main_menu: @@ -160,40 +193,66 @@ def _working_with_tasks (self) -> None: self._BUTTONS = create_buttons ("На главное меню", "Пока!") def _working_with_quest (self) -> None: - if self._user_wants_to_go_to_main_menu: - self._go_to_main_menu ( ) - - elif self._user_wants_to_end_session: - self._end_the_session ( ) - - elif self._has_one_word_in_text_in_lower ( + if self._has_one_word_in_text_in_lower ( "лёгкий", "лёгкого", "лёгкому", "лёгким", "лёгком", "легкий", "легкого", "легкому", "легким", "легком"): self._SESSIONAL_DATA["difficulty_level"] = DifficultyLevelsOfQuest.EASY.value self._SESSIONAL_DATA["working_with_quest"] = False self._SESSIONAL_DATA["choosing_right_answer_for_quest"] = True self._save_text_and_correct_answer_of_easy_quest_in_session_data ( ) - self._OUTPUT_TEXT = "Хорошо.\n" + self._OUTPUT_TEXT = random.choice (("Хорошо.", "Отлично.", "Прекрасно.")) + "\n\n" + self._say_that_user_can_change_their_difficulty_level_if_it_is_not_said_yet ( ) self._OUTPUT_TEXT += self._get_text_of_current_quest ( ) self._BUTTONS = self._buttons_for_choosing_correct_answer - # FIXME - elif self._has_one_word_in_text_in_lower ("средний"): - self._OUTPUT_TEXT = "Пока не настроен файлик, доступен только лёгкий уровень сложности.\n" - self._OUTPUT_TEXT += "Выберите другой уровень сложности." - self._BUTTONS = self._buttons_for_choosing_difficutly_level + elif self._has_one_word_in_text_in_lower ( + "средний", "среднего", "среднему", "среднем", + "средняя", "средней", "среднюю"): + self._SESSIONAL_DATA["difficulty_level"] = DifficultyLevelsOfQuest.MEDIUM.value + self._SESSIONAL_DATA["working_with_quest"] = False + self._SESSIONAL_DATA["choosing_right_answer_for_quest"] = True + self._save_text_and_correct_answer_of_medium_quest_in_session_data ( ) + self._OUTPUT_TEXT = random.choice (("Хорошо.", "Отлично.", "Прекрасно.")) + "\n\n" + self._say_that_user_can_change_their_difficulty_level_if_it_is_not_said_yet ( ) + self._OUTPUT_TEXT += self._get_text_of_current_quest ( ) + self._BUTTONS = self._buttons_for_choosing_correct_answer - # FIXME - elif self._has_one_word_in_text_in_lower ("высокий"): - self._OUTPUT_TEXT = "Пока не настроен файлик, доступен только лёгкий уровень сложности.\n" - self._OUTPUT_TEXT += "Выберите другой уровень сложности." - self._BUTTONS = self._buttons_for_choosing_difficutly_level + elif self._has_one_word_in_text_in_lower ( + "высокий", "высокого", "высокому", "высоким", "высоком", + "сложный", "сложного", "сложному", "сложным", "сложном"): + self._SESSIONAL_DATA["difficulty_level"] = DifficultyLevelsOfQuest.HARD.value + self._SESSIONAL_DATA["working_with_quest"] = False + self._SESSIONAL_DATA["choosing_right_answer_for_quest"] = True + self._save_text_and_correct_answer_of_hard_quest_in_session_data ( ) + self._OUTPUT_TEXT = random.choice (("Хорошо.", "Отлично.", "Прекрасно.")) + "\n\n" + self._say_that_user_can_change_their_difficulty_level_if_it_is_not_said_yet ( ) + self._OUTPUT_TEXT += self._get_text_of_current_quest ( ) + self._BUTTONS = self._buttons_for_choosing_correct_answer - # FIXME - elif self._has_one_word_in_text_in_lower ("рандом"): - self._OUTPUT_TEXT = "Пока не настроен файлик, доступен только лёгкий уровень сложности.\n" - self._OUTPUT_TEXT += "Выберите другой уровень сложности." - self._BUTTONS = self._buttons_for_choosing_difficutly_level + elif self._has_one_word_in_text_in_lower ( + "случайный", "случайного", "случайному", "случайным", "случайном", + "случайная", "случайной", "случайную", + "рандом", "рандома", "рандому", "рандомом", "рандоме", + "рандомный", "рандомного", "рандомному", "рандомном", + "рандомная", "рандомной", "рандомную"): + difficulty_level = DifficultyLevelsOfQuest.get_random_difficulty_level ( ) + self._SESSIONAL_DATA["difficulty_level"] = difficulty_level + self._SESSIONAL_DATA["working_with_quest"] = False + self._SESSIONAL_DATA["choosing_right_answer_for_quest"] = True + self._save_text_and_correct_answer_of_quest_in_session_data (difficulty_level) + self._OUTPUT_TEXT = random.choice (("Хорошо.", "Отлично.", "Прекрасно.")) + "\n\n" + self._say_that_user_can_change_their_difficulty_level_if_it_is_not_said_yet ( ) + self._OUTPUT_TEXT += self._get_text_of_current_quest ( ) + self._BUTTONS = self._buttons_for_choosing_correct_answer + + elif self._has_one_word_in_text_in_lower ("результат", "результаты"): + self._show_results_of_quest_and_next_quest ( ) + + elif self._user_wants_to_go_to_main_menu: + self._go_to_main_menu ( ) + + elif self._user_wants_to_end_session: + self._end_the_session ( ) else: self._OUTPUT_TEXT = get_apology_text ( ) @@ -204,25 +263,47 @@ def _save_text_and_correct_answer_of_easy_quest_in_session_data (self) -> None: quest_getter.save_random_easy_quest ( ) self._SESSIONAL_DATA["text_of_quest"] = quest_getter.prepared_text_of_random_easy_quest self._SESSIONAL_DATA["correct_answer_of_quest"] = quest_getter.correct_answer_of_random_easy_quest + self._TEXT_TO_SPEECH = quest_getter.answers_to_speech_of_random_easy_quest_as_str def _save_text_and_correct_answer_of_medium_quest_in_session_data (self) -> None: quest_getter = QuestGetter ( ) quest_getter.save_random_medium_quest ( ) self._SESSIONAL_DATA["text_of_quest"] = quest_getter.prepared_text_of_random_medium_quest self._SESSIONAL_DATA["correct_answer_of_quest"] = quest_getter.correct_answer_of_random_medium_quest + self._TEXT_TO_SPEECH = quest_getter.answers_to_speech_of_random_medium_quest_as_str def _save_text_and_correct_answer_of_hard_quest_in_session_data (self) -> None: quest_getter = QuestGetter ( ) quest_getter.save_random_hard_quest ( ) self._SESSIONAL_DATA["text_of_quest"] = quest_getter.prepared_text_of_random_hard_quest self._SESSIONAL_DATA["correct_answer_of_quest"] = quest_getter.correct_answer_of_random_hard_quest + self._TEXT_TO_SPEECH = quest_getter.answers_to_speech_of_random_hard_quest_as_str + + def _save_text_and_correct_answer_of_quest_in_session_data (self, difficulty_level: int) -> None: + match difficulty_level: + case DifficultyLevelsOfQuest.EASY.value: + self._save_text_and_correct_answer_of_easy_quest_in_session_data ( ) + case DifficultyLevelsOfQuest.MEDIUM.value: + self._save_text_and_correct_answer_of_medium_quest_in_session_data ( ) + case DifficultyLevelsOfQuest.HARD.value: + self._save_text_and_correct_answer_of_hard_quest_in_session_data ( ) + case _: + raise ValueError ("Указан неправильный уровень сложности!") + + def _say_that_user_can_change_their_difficulty_level_if_it_is_not_said_yet (self) -> None: + if not self._SESSIONAL_DATA["was_said_that_user_can_change_difficulty_level"]: + self._OUTPUT_TEXT += "В любой момент вы можете сменить уровень сложности, сказав: \"Хочу сменить сложность\";\n" + self._OUTPUT_TEXT += "или выйти на главное меню, сказав: \"На главное меню\".\n" + self._OUTPUT_TEXT += "Так же вы можете узнать количество правильно отвеченных вопросов, сказав: \"Покажи результаты\".\n" + self._OUTPUT_TEXT += "Вот квест.\n\n" + self._SESSIONAL_DATA["was_said_that_user_can_change_difficulty_level"] = True def _get_text_of_current_quest (self) -> str: return self._SESSIONAL_DATA["text_of_quest"] @property def _buttons_for_choosing_correct_answer (self) -> dict: - return create_buttons ("Первое", "Второе", "Третье", "На главное меню", "Пока!") + return create_buttons ("Первое", "Второе", "Третье", "Изменить уровень сложности", "Узнать мои результаты", "На главное меню", "Пока!") def _choosing_right_answer_for_quest (self) -> None: @@ -244,22 +325,48 @@ def _choosing_right_answer_for_quest (self) -> None: else: self._wrong_answer_of_quest_is_selected ( ) - elif self._has_all_words_in_text_in_lower ("на", "главное", "меню"): + elif self._has_all_words_in_text_in_lower ("уровень", "сложности") or \ + self._has_one_word_in_text_in_lower ("сложность"): + self._SESSIONAL_DATA["choosing_right_answer_for_quest"] = False + self._SESSIONAL_DATA["working_with_quest"] = True + self._OUTPUT_TEXT = random.choice (("Хорошо.", "Отлично.")) + "\n" + self._OUTPUT_TEXT += "Теперь просто скажите нужный уровень сложности." + self._BUTTONS = self._buttons_for_choosing_difficutly_level + + elif self._has_one_word_in_text_in_lower ("результат", "результаты"): + self._show_results_of_quest_and_next_quest ( ) + + elif self._user_wants_to_go_to_main_menu: self._go_to_main_menu ( ) elif self._user_wants_to_end_session: self._end_the_session ( ) else: - self._OUTPUT_TEXT = "Извините, такого ответа нет." + self._OUTPUT_TEXT = get_text_that_says_there_is_no_answer_like_that ( ) self._BUTTONS = self._buttons_for_choosing_correct_answer def _correct_answer_of_quest_is_selected (self) -> None: - self._OUTPUT_TEXT = "Ура! Ты ответил правильно!\n" - self._OUTPUT_TEXT += "Показать следующий квест или сменить уровень сложности?" - self._SESSIONAL_DATA["choosing_right_answer_for_quest"] = False - self._SESSIONAL_DATA["choosing_between_repeating_and_changing_difficulty_level"] = True - self._BUTTONS = self._buttons_for_next_quest_or_changing_difficulty_level + self._OUTPUT_TEXT = get_text_that_says_answer_is_correct ( ) + "\n\n" + current_difficulty_level = self._SESSIONAL_DATA["difficulty_level"] + self._save_text_and_correct_answer_of_quest_in_session_data (current_difficulty_level) + self._OUTPUT_TEXT += self._get_text_of_current_quest ( ) + self._SESSIONAL_DATA["number_of_correct_quest_answers"] += 1 + self._BUTTONS = self._buttons_for_choosing_correct_answer + + def _show_results_of_quest_and_next_quest (self) -> None: + number_of_correct_quest_answers = int (self._SESSIONAL_DATA["number_of_correct_quest_answers"]) + number_of_wrong_quest_answers = int (self._SESSIONAL_DATA["number_of_wrong_quest_answers"]) + self._OUTPUT_TEXT = f"Количество правильных ответов: {number_of_correct_quest_answers}.\n" + self._OUTPUT_TEXT += f"Количество неправильных ответов: {number_of_wrong_quest_answers}.\n" + if number_of_correct_quest_answers and number_of_wrong_quest_answers: + self._OUTPUT_TEXT += f"Ваше знание Python - {round(number_of_correct_quest_answers/number_of_wrong_quest_answers*10, 1)}%." + elif number_of_correct_quest_answers and not number_of_wrong_quest_answers: + self._OUTPUT_TEXT += "Ваше знание Python - 100%. Поздравляю вас!" + self._make_all_sessional_data_false ( ) + self._SESSIONAL_DATA["viewing_quest_results"] = True + self._BUTTONS = create_buttons ("Продолжить квест", "На главное меню", "Пока") + @property def _buttons_for_next_quest_or_changing_difficulty_level (self) -> dict: @@ -267,28 +374,20 @@ def _buttons_for_next_quest_or_changing_difficulty_level (self) -> dict: "На главное меню", "Пока!") def _wrong_answer_of_quest_is_selected (self) -> None: - self._OUTPUT_TEXT = "К сожалению, это неверный ответ." + self._OUTPUT_TEXT = get_text_that_says_answer_is_wrong ( ) + self._SESSIONAL_DATA["number_of_wrong_quest_answers"] += 1 self._BUTTONS = self._buttons_for_choosing_correct_answer - def _choosing_between_repeating_and_changing_difficulty_level (self) -> None: - if self._has_one_word_in_text_in_lower ("дальше", "далее", "следующий"): - self._SESSIONAL_DATA["choosing_between_repeating_and_changing_difficulty_level"] = False + def _viewing_quest_results (self) -> None: + if self._has_one_word_in_text_in_lower ("продолжить"): + self._SESSIONAL_DATA["viewing_quest_results"] = False self._SESSIONAL_DATA["choosing_right_answer_for_quest"] = True - self._save_text_and_correct_answer_of_quest_with_any_difficulty_level_in_session_data ( ) - self._OUTPUT_TEXT = "Хорошо.\n" - self._OUTPUT_TEXT += self._get_text_of_current_quest ( ) + current_difficulty_level = self._SESSIONAL_DATA["difficulty_level"] + self._save_text_and_correct_answer_of_quest_in_session_data (current_difficulty_level) + self._OUTPUT_TEXT = self._get_text_of_current_quest ( ) self._BUTTONS = self._buttons_for_choosing_correct_answer - elif self._has_one_word_in_text_in_lower ("сменить", "изменить"): - self._SESSIONAL_DATA["working_with_quest"] = True - self._OUTPUT_TEXT = "Отлично.\nТеперь просто скажите нужный уровень сложности:\n" - self._OUTPUT_TEXT += "Лёгкий.\n" - self._OUTPUT_TEXT += "Средний.\n" - self._OUTPUT_TEXT += "Высокий.\n" - self._OUTPUT_TEXT += "Рандом." - self._BUTTONS = self._buttons_for_choosing_difficutly_level - elif self._user_wants_to_go_to_main_menu: self._go_to_main_menu ( ) @@ -297,21 +396,29 @@ def _choosing_between_repeating_and_changing_difficulty_level (self) -> None: else: self._OUTPUT_TEXT = get_apology_text ( ) - self._BUTTONS = self._buttons_for_next_quest_or_changing_difficulty_level + self._BUTTONS = create_buttons ("Продолжить квест", "На главное меню", "Пока") - def _save_text_and_correct_answer_of_quest_with_any_difficulty_level_in_session_data (self) -> None: - match self._SESSIONAL_DATA["difficulty_level"]: - case DifficultyLevelsOfQuest.EASY.value: - self._save_text_and_correct_answer_of_easy_quest_in_session_data ( ) - case DifficultyLevelsOfQuest.MEDIUM.value: - self._save_text_and_correct_answer_of_medium_quest_in_session_data ( ) - case DifficultyLevelsOfQuest.HARD.value: - self._save_text_and_correct_answer_of_hard_quest_in_session_data ( ) - #case _: - # raise ValueError ("В self._SESSIONAL_DATA[\"difficulty_level\"]" + - # f"класса {__class__.__name__} записано значение "+ - # "{self._SESSIONAL_DATA["difficulty_level"]},\n" + - # "хотя должно быть записано 0, 1 или 2!") + + def _sending_report (self) -> None: + # Доработать # FIXME + self._BUTTONS = create_buttons ("На главное меню", "Пока!") + if self._user_wants_to_go_to_main_menu: + self._go_to_main_menu ( ) + elif self._user_wants_to_end_session: + self._end_the_session ( ) + else: + self._OUTPUT_TEXT = get_apology_text ( ) + + + def _consulting (self) -> None: + # Доработать # FIXME + self._BUTTONS = create_buttons ("На главное меню", "Пока!") + if self._user_wants_to_go_to_main_menu: + self._go_to_main_menu ( ) + elif self._user_wants_to_end_session: + self._end_the_session ( ) + else: + self._OUTPUT_TEXT = get_apology_text ( ) def _has_all_words_in_text_in_lower (self, *words) -> bool: @@ -349,11 +456,14 @@ def get_response (self) -> dict: "version": self._VERSION, "response": { "text": self._OUTPUT_TEXT, + "tts": self._TEXT_TO_SPEECH, "end_session": self._IS_END_SESSION, "buttons": self._BUTTONS}, "session_state": self._SESSIONAL_DATA, "user_state_update": self._INTERSESSIONAL_DATA } + # Даже если self._TEXT_TO_SPEECH ничего не содержит (""), + # то будет сказан текст, который написан в поле ["response"]["text"] diff --git a/quest_getter.py b/quest_getter.py index 12317ee..4b39905 100644 --- a/quest_getter.py +++ b/quest_getter.py @@ -25,16 +25,17 @@ def _name_of_file_with_quests (self) -> str: def _group_quests (self) -> None: self._create_empty_grouped_quests ( ) for key in self.all_quests.keys(): - if self.all_quests[key]["difficulty_level"] == DifficultyLevelsOfQuest.EASY.value: - self.easy_quests.append (self.all_quests[key]) - elif self.all_quests[key]["difficulty_level"] == DifficultyLevelsOfQuest.MEDIUM.value: - self.medium_quests.append (self.all_quests[key]) - elif self.all_quests[key]["difficulty_level"] == DifficultyLevelsOfQuest.HARD.value: - self.hard_quests.append (self.all_quests[key]) - else: - raise ValueError ("Указан неверный уровень сложности " + - f"в файле {self._name_of_file_with_quests}\n." + - f"Номер неправильного квеста: {key}.") + match self.all_quests[key]["difficulty_level"]: + case DifficultyLevelsOfQuest.EASY.value: + self.easy_quests.append (self.all_quests[key]) + case DifficultyLevelsOfQuest.MEDIUM.value: + self.medium_quests.append (self.all_quests[key]) + case DifficultyLevelsOfQuest.HARD.value: + self.hard_quests.append (self.all_quests[key]) + case _: + raise ValueError ("Указан неверный уровень сложности " + + f"в файле {self._name_of_file_with_quests}\n." + + f"Номер неправильного квеста: {key}.") def _create_empty_grouped_quests (self) -> None: self.easy_quests = [ ] @@ -52,6 +53,16 @@ def save_random_hard_quest (self) -> None: self.saved_random_hard_quest = random.choice (self.hard_quests) + def get_random_easy_quest (self) -> None: + return random.choice (self.easy_quests) + + def get_random_medium_quest (self) -> None: + return random.choice (self.medium_quests) + + def get_random_hard_quest (self) -> None: + return random.choice (self.hard_quests) + + @property def text_of_random_easy_quest (self) -> str: return self.saved_random_easy_quest["quest_text"] @@ -64,6 +75,14 @@ def prepared_text_of_random_easy_quest (self) -> str: def correct_answer_of_random_easy_quest (self) -> Literal[1, 2, 3]: return self.saved_random_easy_quest["correct_answer"] + 1 # В файле первый ответ 0, а не 1 + @property + def answers_to_speech_of_random_easy_quest (self) -> list[str]: + return self.saved_random_easy_quest["answers_to_speech"] + + @property + def answers_to_speech_of_random_easy_quest_as_str (self) -> str: + return " ".join (self.answers_to_speech_of_random_easy_quest) + @property def text_of_random_medium_quest (self) -> str: return self.saved_random_medium_quest["quest_text"] @@ -76,6 +95,14 @@ def prepared_text_of_random_medium_quest (self) -> str: def correct_answer_of_random_medium_quest (self) -> Literal[1, 2, 3]: return self.saved_random_medium_quest["correct_answer"] + 1 # В файле первый ответ 0, а не 1 + @property + def answers_to_speech_of_random_medium_quest (self) -> list[str]: + return self.saved_random_medium_quest["answers_to_speech"] + + @property + def answers_to_speech_of_random_medium_quest_as_str (self) -> str: + return " ".join (self.answers_to_speech_of_random_medium_quest) + @property def text_of_random_hard_quest (self) -> str: return self.saved_random_hard_quest["quest_text"] @@ -88,6 +115,14 @@ def prepared_text_of_random_hard_quest (self) -> str: def correct_answer_of_random_hard_quest (self) -> Literal[1, 2, 3]: return self.saved_random_hard_quest["correct_answer"] + 1 # В файле первый ответ 0, а не 1 + @property + def answers_to_speech_of_random_hard_quest (self) -> list[str]: + return self.saved_random_hard_quest["answers_to_speech"] + + @property + def answers_to_speech_of_random_hard_quest_as_str (self) -> str: + return " ".join (self.answers_to_speech_of_random_hard_quest) + def _get_prepared_quest_text_for_user (self, quest: dict) -> str: prepared_quest_text = quest["quest_text"] + "\n" diff --git a/quests.json b/quests.json index 7b57c24..506eb99 100644 --- a/quests.json +++ b/quests.json @@ -1,441 +1,641 @@ { - "1": { + "1": { "quest_text": "Какая команда в Python используется для вывода текста на экран?", "answers": [ - "input()", - "print()", - "int()" + "input()", + "print()", + "int()" ], - "difficulty_level": 1, + "answers_to_speech": [ + "инпут", + "принт", + "инт" + ], + "difficulty_level": 0, "correct_answer": 1 - }, + }, - "2": { + "2": { "quest_text": "Какая функция Python используется для чтения пользовательского ввода с клавиатуры?", "answers": [ - "input()", - "read()", - "get_input()" + "input()", + "read()", + "get_input()" + ], + "answers_to_speech": [ + "инпут", + "рид", + "гет инпут" + ], + "difficulty_level": 0, + "correct_answer": 0 + }, + + "3": { + "quest_text": "Какая из этих операций увеличивает значение переменной на 1?", + "answers": [ + "x = x - 1", + "x = x * 2", + "x = x + 1" + ], + "answers_to_speech": [ + "икс равно икс минус один", + "икс равно икс умножить на два", + "икс равно икс плюс один" + ], + "difficulty_level": 0, + "correct_answer": 2 + }, + + "4": { + "quest_text": " Какой оператор используется для присвоения значения переменной в Python?", + "answers": [ + ":=", + "=", + "==" + ], + "answers_to_speech": [ + "двоеточие равно", + "равно", + "равно равно" + ], + "difficulty_level": 0, + "correct_answer": 1 + }, + + "5": { + "quest_text": "Какой оператор в Python используется для проверки равенства значений?", + "answers": [ + ":=", + "!=", + "==" + ], + "answers_to_speech": [ + "двоеточие равно", + "восклицательный знак равно", + "равно равно" + ], + "difficulty_level": 0, + "correct_answer": 2 + }, + + "6": { + "quest_text": "Какой оператор используется для осуществления логического НЕ в Python?", + "answers": [ + "!", + "%", + "not" + ], + "answers_to_speech": [ + "восклицательный знак", + "процент", + "нот" + ], + "difficulty_level": 0, + "correct_answer": 2 + }, + + "7": { + "quest_text": "Какие ключевые слова в Python используются для определения условных операторов?", + "answers": [ + "if и else", + "while и for", + "try и except" + ], + "answers_to_speech": [ + "иф и эльс", + "вайл и фор", + "трай и эксэпт" + ], + "difficulty_level": 0, + "correct_answer": 0 + }, + + "8": { + "quest_text": "Как создать цикл for, который будет выполняться 10 раз?", + "answers": [ + "for i in range(1, 10):", + "for i in range(10):", + "for i in range(1, 11):" + ], + "answers_to_speech": [ + "фор ай ин рэндж один десять двоеточие", + "фор ай ин рэндж десять двоеточие", + "фор ай ин рэндж один одиннадцать двоеточие" + ], + "difficulty_level": 0, + "correct_answer": 1 + }, + + "9": { + "quest_text": "Как создать пустой словарь в Python?", + "answers": [ + "dict()", + "{}", + "[]" + ], + "answers_to_speech": [ + "дикт", + "фигурные кобки", + "квадратные скобки" ], "difficulty_level": 0, + "correct_answer": 1 + }, + + "10": { + "quest_text": "Какой тип данных используется для хранения списка элементов?", + "answers": [ + "list", + "bool", + "int" + ], + "answers_to_speech": [ + "лист", + "бул", + "инт" + ], + "difficulty_level": 0, + "correct_answer": 0 + }, + + "11": { + "quest_text": "Каким будет результат выполнения данного кода: items = [1, 2, 3, 4, 5] print(items[2])", + "answers": [ + "1", + "2", + "3" + ], + "answers_to_speech": [ + "один", + "два", + "три" + ], + "difficulty_level": 0, + "correct_answer": 2 + }, + + "12": { + "quest_text": "Какая функция в Python используется для создания пустого списка?", + "answers": [ + "list()", + "dict()", + "set()" + ], + "answers_to_speech": [ + "лист", + "дикт", + "сэт" + ], + "difficulty_level": 0, + "correct_answer": 0 + }, + + "13": { + "quest_text": "От какого родительского класса нужно наследовать дочерний, чтобы создать перечисление?", + "answers": [ + "ABC", + "Exception", + "enum" + ], + "answers_to_speech": [ + "эй би си", + "эксэпшен", + "энам" + ], + "difficulty_level": 2, + "correct_answer": 2 + }, + + "14": { + "quest_text": "Что такое генераторы в Python?", + "answers": [ + "Это функции, которые создают последовательность значений", + "Это объекты, которые создают последовательность значений", + "Это операторы, которые создают последовательность значений" + ], + "answers_to_speech": [ + "это функции которые создают последовательность значений", + "это объекты которые создают последовательность значений", + "это операторы которые создают последовательность значений" + ], + "difficulty_level": 1, + "correct_answer": 1 + }, + + "15": { + "quest_text": "С помощью какой функции можно узнать длину строки в Python?", + "answers": [ + "length()", + "len()", + "size()" + ], + "answers_to_speech": [ + "лэнгф", + "лэн", + "сайз" + ], + "difficulty_level": 1, + "correct_answer": 1 + }, + + "16": { + "quest_text": "Какая функция используется для генерации случайного числа в Python?", + "answers": [ + "random()", + "randint()", + "choice()" + ], + "answers_to_speech": [ + "рэндом", + "рэндинт", + "чойз" + ], + "difficulty_level": 1, + "correct_answer": 1 + }, + + "17": { + "quest_text": "Какую библиотеку нужно использовать, чтобы работать с датами и временем?", + "answers": [ + "datetime", + "time", + "calendar" + ], + "answers_to_speech": [ + "дэйта тайм", + "тайм", + "кэленда" + ], + "difficulty_level": 2, + "correct_answer": 0 + }, + + "18": { + "quest_text": "Какую библиотеку нужно использовать, чтобы работать с базами данных?", + "answers": [ + "sqlite", + "reportlab", + "scipy" + ], + "answers_to_speech": [ + "скьюлайт", + "репорт лаб", + "сайпи" + ], + "difficulty_level": 2, + "correct_answer": 0 + }, + + "19": { + "quest_text": "Какую библиотеку нужно использовать, чтобы работать с графиками и диаграммами?", + "answers": [ + "pandas", + "matplotlib", + "numpy" + ], + "answers_to_speech": [ + "пэндас", + "матплотлиб", + "нампи" + ], + "difficulty_level": 2, + "correct_answer": 1 + }, + + "20": { + "quest_text": "Какую библиотеку нужно использовать, чтобы работать с научными расчетами и численными методами?", + "answers": [ + "sympy", + "tensorflow", + "scipy" + ], + "answers_to_speech": [ + "саймпи", + "тэнсо флоу", + "сайпи" + ], + "difficulty_level": 2, + "correct_answer": 2 + }, + + "21": { + "quest_text": "Какую библиотеку нужно использовать, чтобы работать с обработкой естественного языка?", + "answers": [ + "Theano", + "PyTorch", + "gensim" + ], + "answers_to_speech": [ + "фино", + "пай торч", + "генсим" + ], + "difficulty_level": 2, + "correct_answer": 2 + }, + + "22": { + "quest_text": "Какую библиотеку нужно использовать, чтобы работать с созданием PDF-файлов?", + "answers": [ + "Keras", + "pdfkit", + "PyWin32" + ], + "answers_to_speech": [ + "кэрас", + "пэ дэ эф кит", + "пай вин тридцать два" + ], + "difficulty_level": 2, + "correct_answer": 1 + }, + + "23": { + "quest_text": "Какую библиотеку нужно использовать, чтобы работать со статистическим анализом данных?", + "answers": [ + "Bokeh", + "numpy", + "statsmodels" + ], + "answers_to_speech": [ + "бокех", + "нампи", + "статс модэлс" + ], + "difficulty_level": 2, + "correct_answer": 2 + }, + + "24": { + "quest_text": "Какую библиотеку нужно использовать, чтобы работать с машинным обучением и глубоким обучением?", + "answers": [ + "tensorflow", + "Flask ", + "Plotly " + ], + "answers_to_speech": [ + "тэнсо флоу", + "флэск", + "плотли" + ], + "difficulty_level": 2, + "correct_answer": 0 + }, + + "25": { + "quest_text": "Какую библиотеку нужно использовать, чтобы работать с RESTful API?", + "answers": [ + "django", + "requests ", + "Scrapy" + ], + "answers_to_speech": [ + "джэнго", + "реквестс", + "скрэпи" + ], + "difficulty_level": 2, + "correct_answer": 1 + }, + + "26": { + "quest_text": "Какую библиотеку нужно использовать, чтобы работать с веб-скрапингом?", + "answers": [ + "PyOpenGL", + "OpenCV", + "BeautifulSoup" + ], + "answers_to_speech": [ + "пай оупэн джи эль", + "оупэн си ви", + "бьютифул соуп" + ], + "difficulty_level": 2, + "correct_answer": 2 + }, + + "27": { + "quest_text": "Какое ключевое слово используется для создания функции в Python?", + "answers": [ + "func", + "def", + "define" + ], + "answers_to_speech": [ + "фанк", + "дэф", + "дэфайн" + ], + "difficulty_level": 1, + "correct_answer": 1 + }, + + "28": { + "quest_text": "Какое ключевое слово используется для создания класса в Python?", + "answers": [ + "class", + "def", + "define" + ], + "answers_to_speech": [ + "клэс", + "дэф", + "дэфайн" + ], + "difficulty_level": 1, + "correct_answer": 0 + }, + + "29": { + "quest_text": "Какое ключевое слово дает возможность пропустить часть цикла, где активируется внешнее условие?", + "answers": [ + "continue", + "exit", + "break" + ], + "answers_to_speech": [ + "континью", + "эксит", + "брэйк" + ], + "difficulty_level": 1, "correct_answer": 0 - }, - - "3": { - "quest_text": "Какая из этих операций увеличивает значение переменной на 1?", - "answers": [ - "x = x - 1", - "x = x * 2", - "x = x + 1" - ], - "difficulty_level": 0, - "correct_answer": 2 - }, - - "4": { - "quest_text": " Какой оператор используется для присвоения значения переменной в Python?", - "answers": [ - ":=", - "=", - "==" - ], - "difficulty_level": 0, - "correct_answer": 1 - }, - - "5": { - "quest_text": "Какой оператор в Python используется для проверки равенства значений?", - "answers": [ - ":=", - "!=", - "==" - ], - "difficulty_level": 0, - "correct_answer": 2 - }, - - "6": { - "quest_text": "Какой оператор используется для осуществления логического НЕ в Python?", - "answers": [ - "!", - "%", - "not" - ], - "difficulty_level": 0, - "correct_answer": 2 - }, - - "7": { - "quest_text": "Какие ключевые слова в Python используются для определения условных операторов?", - "answers": [ - "if и else", - "while и for", - "try и except" - ], - "difficulty_level": 0, - "correct_answer": 0 - }, - - "8": { - "quest_text": "Как создать цикл for, который будет выполняться 10 раз?", - "answers": [ - "for i in range(1, 10):", - "for i in range(10):", - "for i in range(1, 11):" - ], - "difficulty_level": 0, - "correct_answer": 1 - }, - - "9": { - "quest_text": "Как создать пустой словарь в Python?", - "answers": [ - "dict()", - "{}", - "[]" - ], - "difficulty_level": 0, - "correct_answer": 1 - }, - - "10": { - "quest_text": "Какой тип данных используется для хранения списка элементов?", - "answers": [ - "list", - "bool", - "int" - ], - "difficulty_level": 0, - "correct_answer": 0 - }, - - "11": { - "quest_text": "Каким будет результат выполнения данного кода: items = [1, 2, 3, 4, 5] print(items[2])", - "answers": [ - "1", - "2", - "3" - ], - "difficulty_level": 0, - "correct_answer": 2 - }, - - "12": { - "quest_text": "Какая функция в Python используется для создания пустого списка?", - "answers": [ - "list()", - "dict()", - "set()" - ], - "difficulty_level": 0, - "correct_answer": 0 - }, - - "13": { - "quest_text": "От какого родительского класса нужно наследовать дочерний, чтобы создать перечисление?", - "answers": [ - "ABC", - "Exception", - "enum" - ], - "difficulty_level": 2, - "correct_answer": 2 - }, - - "14": { - "quest_text": "Что такое генераторы в Python?", - "answers": [ - "Это функции, которые создают последовательность значений", - "Это объекты, которые создают последовательность значений", - "Это операторы, которые создают последовательность значений" - ], - "difficulty_level": 1, - "correct_answer": 1 - }, - - "15": { - "quest_text": "С помощью какой функции можно узнать длину строки в Python?", - "answers": [ - "length()", - "len()", - "size()" - ], - "difficulty_level": 0, - "correct_answer": 1 - }, - - "16": { - "quest_text": "Какая функция используется для генерации случайного числа в Python?", - "answers": [ - "random()", - "randint()", - "choice()" - ], - "difficulty_level": 0, - "correct_answer": 1 - }, - - "17": { - "quest_text": "Какую библиотеку нужно использовать, чтобы работать с датами и временем?", - "answers": [ - "datetime", - "time", - "calendar" - ], - "difficulty_level": 1, - "correct_answer": 0 - }, - - "18": { - "quest_text": "Какую библиотеку нужно использовать, чтобы работать с базами данных?", - "answers": [ - "sqlite", - "reportlab", - "scipy" - ], - "difficulty_level": 1, - "correct_answer": 0 - }, - - "19": { - "quest_text": "Какую библиотеку нужно использовать, чтобы работать с графиками и диаграммами?", - "answers": [ - "pandas", - "matplotlib", - "numpy" - ], - "difficulty_level": 1, - "correct_answer": 1 - }, - - "20": { - "quest_text": "Какую библиотеку нужно использовать, чтобы работать с научными расчетами и численными методами?", - "answers": [ - "sympy", - "tensorflow", - "scipy" - ], - "difficulty_level": 1, - "correct_answer": 2 - }, - - "21": { - "quest_text": "Какую библиотеку нужно использовать, чтобы работать с обработкой естественного языка?", - "answers": [ - "Theano", - "PyTorch", - "gensim" - ], - "difficulty_level": 1, - "correct_answer": 2 - }, - - "22": { - "quest_text": "Какую библиотеку нужно использовать, чтобы работать с созданием PDF-файлов?", - "answers": [ - "Keras", - "pdfkit", - "PyWin32" - ], - "difficulty_level": 1, - "correct_answer": 1 - }, - - "23": { - "quest_text": "Какую библиотеку нужно использовать, чтобы работать со статистическим анализом данных?", - "answers": [ - "Bokeh", - "numpy", - "statsmodels" - ], - "difficulty_level": 1, - "correct_answer": 2 - }, - - "24": { - "quest_text": "Какую библиотеку нужно использовать, чтобы работать с машинным обучением и глубоким обучением?", - "answers": [ - "tensorflow", - "Flask ", - "Plotly " - ], - "difficulty_level": 1, - "correct_answer": 0 - }, - - "25": { - "quest_text": "Какую библиотеку нужно использовать, чтобы работать с RESTful API?", - "answers": [ - "django", - "requests ", - "Scrapy" - ], - "difficulty_level": 1, - "correct_answer": 1 - }, - - "26": { - "quest_text": "Какую библиотеку нужно использовать, чтобы работать с веб-скрапингом?", - "answers": [ - "PyOpenGL", - "OpenCV", - "BeautifulSoup" - ], - "difficulty_level": 1, - "correct_answer": 2 - }, - - "27": { - "quest_text": "Какое ключевое слово используется для создания функции в Python?", - "answers": [ - "func", - "def", - "define" - ], - "difficulty_level": 1, - "correct_answer": 1 - }, - - "28": { - "quest_text": "Какое ключевое слово используется для создания класса в Python?", - "answers": [ - "class", - "def", - "define" - ], - "difficulty_level": 1, - "correct_answer": 0 - }, - - "29": { - "quest_text": "Какое ключевое слово используется для создания класса в Python?", - "answers": [ - "continue", - "exit", - "break" - ], - "difficulty_level": 1, - "correct_answer": 2 - }, - - "30": { - "quest_text": "Что такое списковое включение (list comprehension)?", - "answers": [ - "Функция, возвращающая случайный элемент списка", - "Способ создания нового списка на основе старого с использованием условий и циклов", - "Метод для добавления элемента в список" - ], - "difficulty_level": 1, - "correct_answer": 1 - }, - - "31": { - "quest_text": "Что такое лямбда-функция?", - "answers": [ - "Инструмент для чтения файлов", - "Функция без имени, которая может быть передана в другую функцию", - "Инструмент для работы с базами данных" - ], - "difficulty_level": 1, - "correct_answer": 1 - }, - - "32": { - "quest_text": "Что означает ключевое слово global?", - "answers": [ - "Объявление переменной в глобальной области видимости", - "Объявление переменной в локальной области видимости", - "Объявление функции" - ], - "difficulty_level": 1, - "correct_answer": 0 - }, - - "33": { - "quest_text": "Какой метод используется для перевода строки в нижний регистр?", - "answers": [ - "to_lower()", - "lower()", - "casefold()" - ], - "difficulty_level": 1, - "correct_answer": 1 - }, - - "34": { - "quest_text": "Что такое рекурсия?", - "answers": [ - "Способ создания списка на основе другого списка", - "Цикл, повторяющийся до тех пор, пока не будет выполнено определенное условие", - "Функция, вызывающая саму себя" - ], - "difficulty_level": 1, - "correct_answer": 2 - }, - - "35": { - "quest_text": "Что такое словарь (dict) в Python?", - "answers": [ - "Список, содержащий элементы разных типов данных", - "Массив фиксированной длины", - "Коллекция, содержащая пары ключ-значение" - ], - "difficulty_level": 1, - "correct_answer": 2 - }, - - "36": { - "quest_text": "Что такое генератор (generator) в Python?", - "answers": [ - "Функция, которая возвращает последовательность значений без генерации списка целиком", - "Функция, которая может быть вызвана с любым количеством аргументов", - "Функция, которая принимает список и возвращает новый список, содержащий только уникальные значения" - ], - "difficulty_level": 1, - "correct_answer": 0 - }, - - "37": { - "quest_text": "Какой модуль используется для работы с регулярными выражениями?", - "answers": [ - "regex", - "re", - "reg" - ], - "difficulty_level": 1, - "correct_answer": 1 - }, - - "38": { - "quest_text": "Что означает ключевое слово pass?", - "answers": [ - "Оператор, который не делает ничего", - "Оператор, который прерывает выполнение программы", - "Оператор, который возвращает значение из функции" - ], - "difficulty_level": 1, - "correct_answer": 0 - }, - - "39": { - "quest_text": "Какой метод используется для разделения строки на список по заданному разделителю?", - "answers": [ - "join()", - "split()", - "separate()" - ], - "difficulty_level": 1, - "correct_answer": 1 - }, - - "40": { - "quest_text": "Какое ключевое слово используется для импорта модуля в Python?", - "answers": [ - "include", - "require", - "import" - ], - "difficulty_level": 1, - "correct_answer": 2 - } + }, + + "30": { + "quest_text": "Что такое списковое включение (list comprehension)?", + "answers": [ + "Функция, возвращающая случайный элемент списка", + "Способ создания нового списка на основе старого с использованием условий и циклов", + "Метод для добавления элемента в список" + ], + "answers_to_speech": [ + "Функция возвращающая случайный элемент списка", + "Способ создания нового списка на основе старого с использованием условий и циклов", + "Метод для добавления элемента в список" + ], + "difficulty_level": 1, + "correct_answer": 1 + }, + + "31": { + "quest_text": "Что такое лямбда-функция?", + "answers": [ + "Инструмент для чтения файлов", + "Функция без имени, которая может быть передана в другую функцию", + "Инструмент для работы с базами данных" + ], + "answers_to_speech": [ + "Инструмент для чтения файлов", + "Функция без имени которая может быть передана в другую функцию", + "Инструмент для работы с базами данных" + ], + "difficulty_level": 2, + "correct_answer": 1 + }, + + "32": { + "quest_text": "Что означает ключевое слово global?", + "answers": [ + "Объявление переменной в глобальной области видимости", + "Объявление переменной в локальной области видимости", + "Объявление функции" + ], + "answers_to_speech": [ + "Объявление переменной в глобальной области видимости", + "Объявление переменной в локальной области видимости", + "Объявление функции" + ], + "difficulty_level": 1, + "correct_answer": 0 + }, + + "33": { + "quest_text": "Какой метод используется для перевода строки в нижний регистр?", + "answers": [ + "to_lower()", + "lower()", + "casefold()" + ], + "answers_to_speech": [ + "ту ловэр", + "ловэр", + "кейс фолд" + ], + "difficulty_level": 1, + "correct_answer": 1 + }, + + "34": { + "quest_text": "Что такое рекурсия?", + "answers": [ + "Способ создания списка на основе другого списка", + "Цикл, повторяющийся до тех пор, пока не будет выполнено определенное условие", + "Функция, вызывающая саму себя" + ], + "answers_to_speech": [ + "способ создания списка на основе другого списка", + "цикл повторяющийся до тех пор пока не будет выполнено определенное условие", + "функция вызывающая саму себя" + ], + "difficulty_level": 1, + "correct_answer": 2 + }, + + "35": { + "quest_text": "Что такое словарь (dict) в Python?", + "answers": [ + "Список, содержащий элементы разных типов данных", + "Массив фиксированной длины", + "Коллекция, содержащая пары ключ-значение" + ], + "answers_to_speech": [ + "список содержащий элементы разных типов данных", + "массив фиксированной длины", + "коллекция содержащая пары ключ-значение" + ], + "difficulty_level": 1, + "correct_answer": 2 + }, + + "36": { + "quest_text": "Что такое генератор (generator) в Python?", + "answers": [ + "Функция, которая возвращает последовательность значений без генерации списка целиком", + "Функция, которая может быть вызвана с любым количеством аргументов", + "Функция, которая принимает список и возвращает новый список, содержащий только уникальные значения" + ], + "answers_to_speech": [ + "функция которая возвращает последовательность значений без генерации списка целиком", + "функция которая может быть вызвана с любым количеством аргументов", + "функция которая принимает список и возвращает новый список, содержащий только уникальные значения" + ], + "difficulty_level": 2, + "correct_answer": 0 + }, + + "37": { + "quest_text": "Какой модуль используется для работы с регулярными выражениями?", + "answers": [ + "regex", + "re", + "reg" + ], + "answers_to_speech": [ + "рэджэкс", + "рэ", + "рэг" + ], + "difficulty_level": 2, + "correct_answer": 1 + }, + + "38": { + "quest_text": "Что означает ключевое слово pass?", + "answers": [ + "Оператор, который не делает ничего", + "Оператор, который прерывает выполнение программы", + "Оператор, который возвращает значение из функции" + ], + "answers_to_speech": [ + "Оператор который не делает ничего", + "Оператор который прерывает выполнение программы", + "Оператор который возвращает значение из функции" + ], + "difficulty_level": 1, + "correct_answer": 0 + }, + + "39": { + "quest_text": "Какой метод используется для разделения строки на список по заданному разделителю?", + "answers": [ + "join()", + "split()", + "separate()" + ], + "answers_to_speech": [ + "джоин", + "сплит", + "сэпэрэйт" + ], + "difficulty_level": 1, + "correct_answer": 1 + }, + + "40": { + "quest_text": "Какое ключевое слово используется для импорта модуля в Python?", + "answers": [ + "include", + "require", + "import" + ], + "answers_to_speech": [ + "инклюд", + "рекваир", + "импорт" + ], + "difficulty_level": 0, + "correct_answer": 2 + } } \ No newline at end of file diff --git a/texts_for_users.json b/texts_for_users.json index a105818..1de3bcc 100644 --- a/texts_for_users.json +++ b/texts_for_users.json @@ -26,9 +26,10 @@ "Перейди на N урок", "Задачка", "Квест", - "Продолжить квест", "Оцени мои знания", - "Выход" + "Консультант по Python", + "Отправить отчёт", + "Пока" ], "you_stopped_at_lesson": [ "Что ж, вы остановились на уроке №", @@ -44,27 +45,56 @@ "Ваша последняя задачка - №" ], "something_is_unclear": [ - "Извините, я вас не поняла.", - "Простите, я вас не поняла.", - "Извините, не поняла вас.", - "Простите, не поняла вас.", + "Извините, я вас не понял.", + "Простите, я вас не понял.", + "Извините, не понял вас.", + "Простите, не понял вас.", "Извините, не могу разобрать.", "Простите, не могу разобрать.", "Извините, я не могу разобрать.", "Простите, я не могу разобрать.", - "Извините, не разобрала.", - "Простите, не разобрала.", - "Извините, не поняла, что вы имеете в виду.", - "Простите, не поняла, что вы имеете в виду.", - "Извините, я не поняла, что вы имеете в виду.", - "Простите, я не поняла, что вы имеете в виду." + "Извините, не разобрал.", + "Простите, не разобрал.", + "Извините, не понял, что вы имеете в виду.", + "Простите, не понял, что вы имеете в виду.", + "Извините, я не понял, что вы имеете в виду.", + "Простите, я не понял, что вы имеете в виду." + ], + "correct_answer": [ + "Ура! Ты ответил правильно!", + "Ты ответил правильно!", + "Ура! Твой ответ верный!", + "Твой ответ верный!", + "Ура! Так держать!", + "Супер! Это правильный ответ!", + "Супер! Это верный ответ!" , + "Так держать!", + "Верно!" + ], + "wrong_answer": [ + "Извините, но это неправильный ответ.", + "Извините, это неправильный ответ.", + "Неправильный ответ.", + "Неправильно." + ], + "there_is_no_answer_like_that": [ + "Извините, но такого ответа нет.", + "Извините, такого ответа нет.", + "Такого ответа нет.", + "Нет такого ответа." + ], + "continue_or_change_difficulty_level": [ + "Показать следующий квест или сменить уровень сложности?", + "Следующий квест или хотите сменить уровень сложности?", + "Следующий квест или сменить уровень сложности?", + "Дальше по квестам или хотите сменить уровень сложности?" ], "head_of_farewell": [ "До свидания", "Прощайте", "Чао", "Goodbye", - "Bye" + "Bye-bye" ], "body_of_farewell": [ "!", diff --git a/useful_functions.py b/useful_functions.py index 6342bbc..81eaa93 100644 --- a/useful_functions.py +++ b/useful_functions.py @@ -10,8 +10,13 @@ def create_sessional_data (sessional_data: dict) -> dict: "text_of_quest": "", "correct_answer_of_quest": 0, "difficulty_level": 0, + "number_of_correct_quest_answers": 0, + "number_of_wrong_quest_answers": 0, + "viewing_quest_results": False, + "was_said_that_user_can_change_difficulty_level": False, "working_with_tasks": False, - "working_with_report": False + "sending_report": False, + "consulting": False } else: # Значит, сообщение уже не первое return sessional_data From df127a72821d160e66977e744f56007e0363ef7c Mon Sep 17 00:00:00 2001 From: Alexonys1 <107358560+Alexonys1@users.noreply.github.com> Date: Thu, 23 Mar 2023 14:50:56 +0300 Subject: [PATCH 06/31] =?UTF-8?q?=D0=95=D1=89=D1=91=20=D0=BE=D0=B4=D0=BD?= =?UTF-8?q?=D0=BE=20=D0=BE=D0=B1=D0=BD=D0=BE=D0=B2=D0=BB=D0=B5=D0=BD=D0=B8?= =?UTF-8?q?=D0=B5=20=D0=B2=D1=82=D0=BE=D1=80=D0=BE=D0=B9=20=D0=B2=D0=B5?= =?UTF-8?q?=D1=80=D1=81=D0=B8=D0=B8.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Переделал систему создания кнопок: добавлен новый файлик с классом Buttons. Раньше передавался список с кнопками напрямую. Теперь же этим занимается отдельный класс. Изменил 8-й квест, потому что он неправильный. --- buttons.py | 26 ++++++++ json_manager.py | 11 ---- main2.py | 142 ++++++++++++++++++++++++++----------------- texts_for_users.json | 2 +- useful_functions.py | 34 ++++++++++- 5 files changed, 144 insertions(+), 71 deletions(-) create mode 100644 buttons.py diff --git a/buttons.py b/buttons.py new file mode 100644 index 0000000..8f9ee72 --- /dev/null +++ b/buttons.py @@ -0,0 +1,26 @@ +from json_manager import get_main_commands_of_skill_as_list + + +class Buttons: + """Класс для работы с кнопками Алисы.""" + def __init__ (self): + self.BUTTONS = [ ] + + def add_buttons (self, *button_texts: str, hide_all: bool) -> None: + """Добавляет новые кнопки.""" + for button_text in button_texts: + self.BUTTONS.append ({"title": button_text, "hide": hide_all}) + + def remove_all_buttons (self) -> None: + """Удаляет все кнопки.""" + self.BUTTONS = [ ] + + def add_buttons_of_main_menu_in_text (self) -> None: + """Добавляет команды навыка на главное меню в текст.""" + self.add_buttons (*get_main_commands_of_skill_as_list ( ), hide_all = False) + + +if __name__ == '__main__': + buttons = Button ( ) + buttons.add_buttons ("test1", "test2", "test3", hide_all = True) + print (buttons.BUTTONS) \ No newline at end of file diff --git a/json_manager.py b/json_manager.py index 85fb784..746a0fe 100644 --- a/json_manager.py +++ b/json_manager.py @@ -67,17 +67,6 @@ def get_text_that_suggests_to_continue_or_change_difficulty_level ( ) -> str: return random.choice (texts_for_users["continue_or_change_difficulty_level"]) -def create_buttons (*button_texts: str) -> list: - ready_buttons = [ ] - for text_of_button in button_texts: - ready_buttons.append ({"title": text_of_button, "hide": True}) - return ready_buttons - - -def create_buttons_of_main_menu ( ) -> list: - return create_buttons (*get_main_commands_of_skill_as_list ( )) - - def get_apology_text ( ) -> str: return random.choice (texts_for_users["something_is_unclear"]) # Выбирается одно случайное извинение от Алисы, если она что-то не поняла. diff --git a/main2.py b/main2.py index de978a5..f7a3797 100644 --- a/main2.py +++ b/main2.py @@ -3,6 +3,7 @@ from json_manager import * from useful_functions import * from quest_getter import QuestGetter +from buttons import Buttons from enums import * @@ -17,7 +18,7 @@ def __init__ (self, request: dict): self._SESSIONAL_DATA: dict = create_sessional_data (request["state"]["session"]) self._INTERSESSIONAL_DATA: dict = create_intersessional_data (request["state"]["user"]) self._TEXT_TO_SPEECH = "" - self._BUTTONS = [ ] + self._BUTTONS = Buttons ( ) self._working_with_user ( ) @@ -25,18 +26,26 @@ def _working_with_user (self) -> None: # Абсолютно новый пользователь if self._INTERSESSIONAL_DATA["new_user"]: self._OUTPUT_TEXT = get_text_for_new_user ( ) + self._TEXT_TO_SPEECH = get_text_for_new_user ( ) + "\n" + self._TEXT_TO_SPEECH += get_main_commands_of_skill ( ) self._INTERSESSIONAL_DATA["new_user"] = False - self._BUTTONS = create_buttons_of_main_menu ( ) + self._BUTTONS.add_buttons_of_main_menu_in_text ( ) # Пользователь в главном меню впервые elif self._user_is_in_main_menu and self._IS_FIRST_MESSAGE: - self._OUTPUT_TEXT = get_user_greeting ( ) - self._BUTTONS = create_buttons_of_main_menu ( ) + user_greeting = get_user_greeting ( ) + self._OUTPUT_TEXT = user_greeting + self._TEXT_TO_SPEECH = user_greeting + self._TEXT_TO_SPEECH += get_main_commands_of_skill ( ) + self._BUTTONS.add_buttons_of_main_menu_in_text ( ) # Пользователь просто в главном меню elif self._user_is_in_main_menu: - self._OUTPUT_TEXT = get_text_that_says_user_is_just_in_main_menu ( ) - self._BUTTONS = create_buttons_of_main_menu ( ) + text_that_says_user_is_just_in_main_menu = get_text_that_says_user_is_just_in_main_menu ( ) + self._OUTPUT_TEXT = text_that_says_user_is_just_in_main_menu + self._TEXT_TO_SPEECH = text_that_says_user_is_just_in_main_menu + self._TEXT_TO_SPEECH += get_main_commands_of_skill ( ) + self._BUTTONS.add_buttons_of_main_menu_in_text ( ) self._working_with_user_in_main_menu ( ) # Пользователь не в главном меню @@ -55,13 +64,16 @@ def _user_is_in_main_menu (self) -> bool: def _working_with_user_in_main_menu (self) -> None: + self._BUTTONS.remove_all_buttons ( ) + self._TEXT_TO_SPEECH = "" # Пока навык в разработке if self._has_all_words_in_text_in_lower ("сбрось", "настройки") or \ self._has_all_words_in_text_in_lower ("сбросить", "настройки"): self._INTERSESSIONAL_DATA["new_user"] = True self._INTERSESSIONAL_DATA["last_lesson"] = 0 self._INTERSESSIONAL_DATA["last_task"] = 0 - self._OUTPUT_TEXT = "Настройки сброшены." + self._OUTPUT_TEXT = "Настройки сброшены.\n" + self._OUTPUT_TEXT = "Перезагрузите навык." elif self._has_one_word_in_text_in_lower ( "курс", "курса", "курсу", "курсом", "курсе"): @@ -74,7 +86,7 @@ def _working_with_user_in_main_menu (self) -> None: self._SESSIONAL_DATA["working_with_course"] = True self._OUTPUT_TEXT = "Пока \"Курс\" ничего не умеет...\n" self._OUTPUT_TEXT += "Может, на главное меню?" - self._BUTTONS = create_buttons ("На главное меню", "Пока!") + self._BUTTONS.add_buttons ("На главное меню", "Пока!", hide_all = True) elif self._has_one_word_in_text_in_lower ( "задачка", "задачки", "задачку", "задачке", "задачкой", @@ -84,32 +96,30 @@ def _working_with_user_in_main_menu (self) -> None: self._SESSIONAL_DATA["working_with_tasks"] = True self._OUTPUT_TEXT = "Пока \"Задачка\" ничего не умеет...\n" self._OUTPUT_TEXT += "Может, на главное меню?" - self._BUTTONS = create_buttons ("На главное меню", "Пока!") + self._BUTTONS.add_buttons ("На главное меню", "Пока!", hide_all = True) elif self._has_one_word_in_text_in_lower ( "квест", "квеста", "квесту", "квестом", "квесте"): # Просто доделать self._SESSIONAL_DATA["working_with_quest"] = True self._OUTPUT_TEXT = "Какой уровень сложности вы предпочитаете?\n" - self._OUTPUT_TEXT += "Лёгкий.\n" - self._OUTPUT_TEXT += "Средний.\n" - self._OUTPUT_TEXT += "Высокий.\n" - self._OUTPUT_TEXT += "Случайный.\n" - self._BUTTONS = self._buttons_for_choosing_difficutly_level + self._TEXT_TO_SPEECH = "Какой уровень сложности вы предпочитаете?\n" + self._TEXT_TO_SPEECH += f"{', '.join (self._difficulty_levels)}" + self._BUTTONS.add_buttons (*self._difficulty_levels, hide_all = False) + self._BUTTONS.add_buttons ("Узнать мои результаты", "На главное меню", "Пока", hide_all = True) elif self._has_all_words_in_text_in_lower ("на", "урок"): self._SESSIONAL_DATA["working_with_course"] = True - self._OUTPUT_TEXT = "Пока \"Перейти на N урок\" ничего не умеет...\n" + self._OUTPUT_TEXT = "Пока \"Перейти на урок\" ничего не умеет...\n" self._OUTPUT_TEXT += "Может, на главное меню?" - self._BUTTONS = create_buttons ("На главное меню", "Пока!") + self._BUTTONS.add_buttons ("На главное меню", "Пока!", hide_all = True) - elif self._has_one_word_in_text_in_lower ("пожаловаться", "жалоба") or \ - self._has_all_words_in_text_in_lower ("отправить", "отчёт") or \ - self._has_all_words_in_text_in_lower ("отправить", "жалобу"): + elif self._has_one_word_in_text_in_lower ( + "пожаловаться", "жалоба", "жалобу", "отчёт", "отчет"): self._SESSIONAL_DATA["sending_report"] = True self._OUTPUT_TEXT = "Я не знаю, на какую почту отправлять жалобу...\n" self._OUTPUT_TEXT += "Может, на главное меню?" - self._BUTTONS = create_buttons ("На главное меню", "Пока!") + self._BUTTONS.add_buttons ("На главное меню", "Пока!", hide_all = True) elif self._has_one_word_in_text_in_lower ( "консультант", "консультанта", "консультанту", "консультантом", "консультанте" @@ -117,12 +127,12 @@ def _working_with_user_in_main_menu (self) -> None: self._SESSIONAL_DATA["consulting"] = True self._OUTPUT_TEXT = "Пока я не могу вас проконсультировать, извините...\n" self._OUTPUT_TEXT += "Может, на главное меню?" - self._BUTTONS = create_buttons ("На главное меню", "Пока!") + self._BUTTONS.add_buttons ("На главное меню", "Пока!", hide_all = True) elif self._has_all_words_in_text_in_lower ("оцени", "знания"): self._OUTPUT_TEXT = "Зачем \"Оцени мои знания\", когда есть \"Квест\"?\n" self._OUTPUT_TEXT += "Скажи \"Квест\", чтобы его попробовать." - self._BUTTONS = create_buttons_of_main_menu ( ) + self._BUTTONS.add_buttons_of_main_menu_in_text ( ) elif self._user_wants_to_go_to_main_menu: self._OUTPUT_TEXT = "Вы уже на главном меню!" @@ -133,10 +143,13 @@ def _working_with_user_in_main_menu (self) -> None: else: self._OUTPUT_TEXT = get_apology_text ( ) + @property + def _difficulty_levels (self) -> tuple[str, str, str, str]: + return "Лёгкий", "Средний", "Высокий", "Случайный" + @property def _buttons_for_choosing_difficutly_level (self) -> dict: - return create_buttons ("Лёгкий", "Средний", "Высокий", "Случайный", - "Узнать мои результаты", "На главное меню", "Пока!") + return "Лёгкий", "Средний", "Высокий", "Случайный", "Узнать мои результаты", "На главное меню", "Пока!" def _working_with_user_outside_main_menu (self) -> None: @@ -165,7 +178,7 @@ def _working_with_course (self) -> None: else: self._OUTPUT_TEXT = get_apology_text ( ) - self._BUTTONS = create_buttons ("На главное меню", "Пока!") + self._BUTTONS.add_buttons ("На главное меню", "Пока!", hide_all = True) @property def _user_wants_to_go_to_main_menu (self) -> bool: @@ -190,7 +203,7 @@ def _working_with_tasks (self) -> None: else: self._OUTPUT_TEXT = get_apology_text ( ) - self._BUTTONS = create_buttons ("На главное меню", "Пока!") + self._BUTTONS.add_buttons ("На главное меню", "Пока!", hide_all = True) def _working_with_quest (self) -> None: if self._has_one_word_in_text_in_lower ( @@ -203,7 +216,7 @@ def _working_with_quest (self) -> None: self._OUTPUT_TEXT = random.choice (("Хорошо.", "Отлично.", "Прекрасно.")) + "\n\n" self._say_that_user_can_change_their_difficulty_level_if_it_is_not_said_yet ( ) self._OUTPUT_TEXT += self._get_text_of_current_quest ( ) - self._BUTTONS = self._buttons_for_choosing_correct_answer + self._BUTTONS.add_buttons (*self._buttons_for_choosing_correct_answer, hide_all = True) elif self._has_one_word_in_text_in_lower ( "средний", "среднего", "среднему", "среднем", @@ -215,7 +228,7 @@ def _working_with_quest (self) -> None: self._OUTPUT_TEXT = random.choice (("Хорошо.", "Отлично.", "Прекрасно.")) + "\n\n" self._say_that_user_can_change_their_difficulty_level_if_it_is_not_said_yet ( ) self._OUTPUT_TEXT += self._get_text_of_current_quest ( ) - self._BUTTONS = self._buttons_for_choosing_correct_answer + self._BUTTONS.add_buttons (*self._buttons_for_choosing_correct_answer, hide_all = True) elif self._has_one_word_in_text_in_lower ( "высокий", "высокого", "высокому", "высоким", "высоком", @@ -227,7 +240,7 @@ def _working_with_quest (self) -> None: self._OUTPUT_TEXT = random.choice (("Хорошо.", "Отлично.", "Прекрасно.")) + "\n\n" self._say_that_user_can_change_their_difficulty_level_if_it_is_not_said_yet ( ) self._OUTPUT_TEXT += self._get_text_of_current_quest ( ) - self._BUTTONS = self._buttons_for_choosing_correct_answer + self._BUTTONS.add_buttons (*self._buttons_for_choosing_correct_answer, hide_all = True) elif self._has_one_word_in_text_in_lower ( "случайный", "случайного", "случайному", "случайным", "случайном", @@ -243,7 +256,7 @@ def _working_with_quest (self) -> None: self._OUTPUT_TEXT = random.choice (("Хорошо.", "Отлично.", "Прекрасно.")) + "\n\n" self._say_that_user_can_change_their_difficulty_level_if_it_is_not_said_yet ( ) self._OUTPUT_TEXT += self._get_text_of_current_quest ( ) - self._BUTTONS = self._buttons_for_choosing_correct_answer + self._BUTTONS.add_buttons (*self._buttons_for_choosing_correct_answer, hide_all = True) elif self._has_one_word_in_text_in_lower ("результат", "результаты"): self._show_results_of_quest_and_next_quest ( ) @@ -256,7 +269,7 @@ def _working_with_quest (self) -> None: else: self._OUTPUT_TEXT = get_apology_text ( ) - self._BUTTONS = self._buttons_for_choosing_difficutly_level + self._BUTTONS.add_buttons (*self._buttons_for_choosing_difficutly_level, hide_all = True) def _save_text_and_correct_answer_of_easy_quest_in_session_data (self) -> None: quest_getter = QuestGetter ( ) @@ -303,7 +316,7 @@ def _get_text_of_current_quest (self) -> str: @property def _buttons_for_choosing_correct_answer (self) -> dict: - return create_buttons ("Первое", "Второе", "Третье", "Изменить уровень сложности", "Узнать мои результаты", "На главное меню", "Пока!") + return "Первое", "Второе", "Третье", "Изменить уровень сложности", "Узнать мои результаты", "На главное меню", "Пока!" def _choosing_right_answer_for_quest (self) -> None: @@ -331,7 +344,7 @@ def _choosing_right_answer_for_quest (self) -> None: self._SESSIONAL_DATA["working_with_quest"] = True self._OUTPUT_TEXT = random.choice (("Хорошо.", "Отлично.")) + "\n" self._OUTPUT_TEXT += "Теперь просто скажите нужный уровень сложности." - self._BUTTONS = self._buttons_for_choosing_difficutly_level + self._BUTTONS.add_buttons (*self._buttons_for_choosing_difficutly_level, hide_all = True) elif self._has_one_word_in_text_in_lower ("результат", "результаты"): self._show_results_of_quest_and_next_quest ( ) @@ -344,7 +357,7 @@ def _choosing_right_answer_for_quest (self) -> None: else: self._OUTPUT_TEXT = get_text_that_says_there_is_no_answer_like_that ( ) - self._BUTTONS = self._buttons_for_choosing_correct_answer + self._BUTTONS.add_buttons (*self._buttons_for_choosing_correct_answer, hide_all = True) def _correct_answer_of_quest_is_selected (self) -> None: self._OUTPUT_TEXT = get_text_that_says_answer_is_correct ( ) + "\n\n" @@ -352,31 +365,42 @@ def _correct_answer_of_quest_is_selected (self) -> None: self._save_text_and_correct_answer_of_quest_in_session_data (current_difficulty_level) self._OUTPUT_TEXT += self._get_text_of_current_quest ( ) self._SESSIONAL_DATA["number_of_correct_quest_answers"] += 1 - self._BUTTONS = self._buttons_for_choosing_correct_answer + self._BUTTONS.add_buttons (*self._buttons_for_choosing_correct_answer, hide_all = True) def _show_results_of_quest_and_next_quest (self) -> None: - number_of_correct_quest_answers = int (self._SESSIONAL_DATA["number_of_correct_quest_answers"]) - number_of_wrong_quest_answers = int (self._SESSIONAL_DATA["number_of_wrong_quest_answers"]) - self._OUTPUT_TEXT = f"Количество правильных ответов: {number_of_correct_quest_answers}.\n" - self._OUTPUT_TEXT += f"Количество неправильных ответов: {number_of_wrong_quest_answers}.\n" - if number_of_correct_quest_answers and number_of_wrong_quest_answers: - self._OUTPUT_TEXT += f"Ваше знание Python - {round(number_of_correct_quest_answers/number_of_wrong_quest_answers*10, 1)}%." - elif number_of_correct_quest_answers and not number_of_wrong_quest_answers: - self._OUTPUT_TEXT += "Ваше знание Python - 100%. Поздравляю вас!" - self._make_all_sessional_data_false ( ) - self._SESSIONAL_DATA["viewing_quest_results"] = True - self._BUTTONS = create_buttons ("Продолжить квест", "На главное меню", "Пока") + correct_quest_answers = int (self._SESSIONAL_DATA["number_of_correct_quest_answers"]) + wrong_quest_answers = int (self._SESSIONAL_DATA["number_of_wrong_quest_answers"]) + if correct_quest_answers and wrong_quest_answers: + self._OUTPUT_TEXT = f"Количество правильных ответов: {correct_quest_answers}.\n" + self._OUTPUT_TEXT += f"Количество неправильных ответов: {wrong_quest_answers}.\n" + python_knowledge = calculate_python_knowledge (correct_quest_answers, wrong_quest_answers) + self._OUTPUT_TEXT += f"Ваше знание Python: {python_knowledge}%." + self._make_all_sessional_data_false ( ) + self._SESSIONAL_DATA["viewing_quest_results"] = True + self._BUTTONS.add_buttons ("Продолжить квест", "На главное меню", "Пока", hide_all = True) + + elif not correct_quest_answers and wrong_quest_answers: + self._OUTPUT_TEXT = "Жаль, но у вас нет ни одного правильного ответа на квест." + self._make_all_sessional_data_false ( ) + self._SESSIONAL_DATA["viewing_quest_results"] = True + self._BUTTONS.add_buttons ("Продолжить квест", "На главное меню", "Пока", hide_all = True) + + elif correct_quest_answers and not wrong_quest_answers: + self._OUTPUT_TEXT = "Все ваши ответы верны! Похоже, вы профессиональный программист!" + self._make_all_sessional_data_false ( ) + self._SESSIONAL_DATA["viewing_quest_results"] = True + self._BUTTONS.add_buttons ("Продолжить квест", "На главное меню", "Пока", hide_all = True) + else: + self._OUTPUT_TEXT = "Пока вы не ответили ни на один квест." + self._make_all_sessional_data_false ( ) + self._BUTTONS.add_buttons_of_main_menu_in_text ( ) - @property - def _buttons_for_next_quest_or_changing_difficulty_level (self) -> dict: - return create_buttons ("Следующий квест", "Сменить уровень сложности", - "На главное меню", "Пока!") def _wrong_answer_of_quest_is_selected (self) -> None: self._OUTPUT_TEXT = get_text_that_says_answer_is_wrong ( ) self._SESSIONAL_DATA["number_of_wrong_quest_answers"] += 1 - self._BUTTONS = self._buttons_for_choosing_correct_answer + self._BUTTONS.add_buttons (*self._buttons_for_choosing_correct_answer, hide_all = True) def _viewing_quest_results (self) -> None: @@ -386,7 +410,7 @@ def _viewing_quest_results (self) -> None: current_difficulty_level = self._SESSIONAL_DATA["difficulty_level"] self._save_text_and_correct_answer_of_quest_in_session_data (current_difficulty_level) self._OUTPUT_TEXT = self._get_text_of_current_quest ( ) - self._BUTTONS = self._buttons_for_choosing_correct_answer + self._BUTTONS.add_buttons (*self._buttons_for_choosing_correct_answer, hide_all = True) elif self._user_wants_to_go_to_main_menu: self._go_to_main_menu ( ) @@ -396,12 +420,12 @@ def _viewing_quest_results (self) -> None: else: self._OUTPUT_TEXT = get_apology_text ( ) - self._BUTTONS = create_buttons ("Продолжить квест", "На главное меню", "Пока") + self._BUTTONS.add_buttons ("Продолжить квест", "На главное меню", "Пока", hide_all = True) def _sending_report (self) -> None: # Доработать # FIXME - self._BUTTONS = create_buttons ("На главное меню", "Пока!") + self._BUTTONS.add_buttons ("На главное меню", "Пока!", hide_all = True) if self._user_wants_to_go_to_main_menu: self._go_to_main_menu ( ) elif self._user_wants_to_end_session: @@ -412,7 +436,7 @@ def _sending_report (self) -> None: def _consulting (self) -> None: # Доработать # FIXME - self._BUTTONS = create_buttons ("На главное меню", "Пока!") + self._BUTTONS.add_buttons ("На главное меню", "Пока!", hide_all = True) if self._user_wants_to_go_to_main_menu: self._go_to_main_menu ( ) elif self._user_wants_to_end_session: @@ -422,12 +446,14 @@ def _consulting (self) -> None: def _has_all_words_in_text_in_lower (self, *words) -> bool: + """Есть ли все слова в ответе пользователя?""" for word in words: if not word in self._WORDS_OF_TEXT_IN_LOWER: return False return True def _has_one_word_in_text_in_lower (self, *words) -> bool: + """Есть ли хоть одно слово в ответе пользователя?""" for word in words: if word in self._WORDS_OF_TEXT_IN_LOWER: return True @@ -436,7 +462,9 @@ def _has_one_word_in_text_in_lower (self, *words) -> bool: def _go_to_main_menu (self) -> None: self._OUTPUT_TEXT = get_text_that_says_user_is_just_in_main_menu ( ) - self._BUTTONS = create_buttons_of_main_menu ( ) + self._TEXT_TO_SPEECH = get_text_that_says_user_is_just_in_main_menu ( ) + self._TEXT_TO_SPEECH += get_main_commands_of_skill ( ) + self._BUTTONS.add_buttons_of_main_menu_in_text ( ) self._make_all_sessional_data_false ( ) def _make_all_sessional_data_false (self) -> None: @@ -458,7 +486,7 @@ def get_response (self) -> dict: "text": self._OUTPUT_TEXT, "tts": self._TEXT_TO_SPEECH, "end_session": self._IS_END_SESSION, - "buttons": self._BUTTONS}, + "buttons": self._BUTTONS.BUTTONS}, "session_state": self._SESSIONAL_DATA, "user_state_update": self._INTERSESSIONAL_DATA } diff --git a/texts_for_users.json b/texts_for_users.json index 1de3bcc..08ba7ee 100644 --- a/texts_for_users.json +++ b/texts_for_users.json @@ -23,7 +23,7 @@ ], "main_commands_of_skill": [ "Курс", - "Перейди на N урок", + "Перейди на урок", "Задачка", "Квест", "Оцени мои знания", diff --git a/useful_functions.py b/useful_functions.py index 81eaa93..3d9c8b6 100644 --- a/useful_functions.py +++ b/useful_functions.py @@ -36,9 +36,39 @@ def create_intersessional_data (intersessional_data: dict) -> dict: def get_user_greeting ( ) -> str: hello_text = get_hello_text ( ) + "\n" hello_text += get_text_asking_if_user_has_forgotten_commands ( ) + "\n" - hello_text += get_main_commands_of_skill ( ) + #hello_text += get_main_commands_of_skill ( ) return hello_text def get_text_that_says_user_is_just_in_main_menu ( ) -> str: - return "Вы на главном меню!\nМои основные команды:\n" + get_main_commands_of_skill ( ) + return "Вы на главном меню!\nМои основные команды:" + + +def create_buttons (*button_texts: str) -> list[dict]: + ready_buttons = [ ] + for text_of_button in button_texts: + ready_buttons.append ({"title": text_of_button, "hide": True}) + return ready_buttons + +def create_buttons_in_text (*button_texts: str) -> list[dict]: + ready_buttons = [ ] + for text_of_button in button_texts: + ready_buttons.append ({"title": text_of_button, "hide": False}) + return ready_buttons + + +def create_buttons_of_main_menu ( ) -> list: + return create_buttons (*get_main_commands_of_skill_as_list ( )) + +def create_buttons_of_main_menu_in_text ( ) -> list: + return create_buttons_in_text (*get_main_commands_of_skill_as_list ( )) + + +def calculate_python_knowledge (number_of_correct_answers: int, + number_of_wrong_answers: int) -> float: + if number_of_correct_answers == number_of_wrong_answers: + python_knowledge = 50 # 50% знания Python + else: + python_knowledge = number_of_correct_answers / (number_of_correct_answers + number_of_wrong_answers) * 100 + + return round (python_knowledge, 1) \ No newline at end of file From 2e799e21be64d6fa687376c90e424171f0fa04f0 Mon Sep 17 00:00:00 2001 From: Alexonys1 <107358560+Alexonys1@users.noreply.github.com> Date: Thu, 23 Mar 2023 16:03:05 +0300 Subject: [PATCH 07/31] =?UTF-8?q?=D0=9E=D0=B1=D0=BD=D0=BE=D0=B2=D0=B8?= =?UTF-8?q?=D0=BB=20=D0=B2=D1=82=D0=BE=D1=80=D1=83=D1=8E=20=D0=B2=D0=B5?= =?UTF-8?q?=D1=80=D1=81=D0=B8=D1=8E.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Переделал систему создания кнопок: добавлен новый файлик с классом Buttons. Раньше передавался список с кнопками напрямую. Теперь же этим занимается отдельный класс. Пофиксил произношение квестов. Всё работает. --- main2.py | 43 +++++++++++++++++++++++++++++++------------ quest_getter.py | 12 ++++++++++++ 2 files changed, 43 insertions(+), 12 deletions(-) diff --git a/main2.py b/main2.py index f7a3797..2bda608 100644 --- a/main2.py +++ b/main2.py @@ -213,9 +213,12 @@ def _working_with_quest (self) -> None: self._SESSIONAL_DATA["working_with_quest"] = False self._SESSIONAL_DATA["choosing_right_answer_for_quest"] = True self._save_text_and_correct_answer_of_easy_quest_in_session_data ( ) - self._OUTPUT_TEXT = random.choice (("Хорошо.", "Отлично.", "Прекрасно.")) + "\n\n" + well = random.choice (("Хорошо.", "Отлично.", "Прекрасно.")) + "\n\n" + self._OUTPUT_TEXT = well + self._TEXT_TO_SPEECH = well self._say_that_user_can_change_their_difficulty_level_if_it_is_not_said_yet ( ) self._OUTPUT_TEXT += self._get_text_of_current_quest ( ) + self._TEXT_TO_SPEECH += self._get_text_of_current_quest ( ) self._BUTTONS.add_buttons (*self._buttons_for_choosing_correct_answer, hide_all = True) elif self._has_one_word_in_text_in_lower ( @@ -225,9 +228,12 @@ def _working_with_quest (self) -> None: self._SESSIONAL_DATA["working_with_quest"] = False self._SESSIONAL_DATA["choosing_right_answer_for_quest"] = True self._save_text_and_correct_answer_of_medium_quest_in_session_data ( ) - self._OUTPUT_TEXT = random.choice (("Хорошо.", "Отлично.", "Прекрасно.")) + "\n\n" + well = random.choice (("Хорошо.", "Отлично.", "Прекрасно.")) + "\n\n" + self._OUTPUT_TEXT = well + self._TEXT_TO_SPEECH = well self._say_that_user_can_change_their_difficulty_level_if_it_is_not_said_yet ( ) self._OUTPUT_TEXT += self._get_text_of_current_quest ( ) + self._TEXT_TO_SPEECH += self._get_text_of_current_quest ( ) self._BUTTONS.add_buttons (*self._buttons_for_choosing_correct_answer, hide_all = True) elif self._has_one_word_in_text_in_lower ( @@ -237,9 +243,12 @@ def _working_with_quest (self) -> None: self._SESSIONAL_DATA["working_with_quest"] = False self._SESSIONAL_DATA["choosing_right_answer_for_quest"] = True self._save_text_and_correct_answer_of_hard_quest_in_session_data ( ) - self._OUTPUT_TEXT = random.choice (("Хорошо.", "Отлично.", "Прекрасно.")) + "\n\n" + well = random.choice (("Хорошо.", "Отлично.", "Прекрасно.")) + "\n\n" + self._OUTPUT_TEXT = well + self._TEXT_TO_SPEECH = well self._say_that_user_can_change_their_difficulty_level_if_it_is_not_said_yet ( ) self._OUTPUT_TEXT += self._get_text_of_current_quest ( ) + self._TEXT_TO_SPEECH += self._get_text_of_current_quest ( ) self._BUTTONS.add_buttons (*self._buttons_for_choosing_correct_answer, hide_all = True) elif self._has_one_word_in_text_in_lower ( @@ -253,9 +262,12 @@ def _working_with_quest (self) -> None: self._SESSIONAL_DATA["working_with_quest"] = False self._SESSIONAL_DATA["choosing_right_answer_for_quest"] = True self._save_text_and_correct_answer_of_quest_in_session_data (difficulty_level) - self._OUTPUT_TEXT = random.choice (("Хорошо.", "Отлично.", "Прекрасно.")) + "\n\n" + well = random.choice (("Хорошо.", "Отлично.", "Прекрасно.")) + "\n\n" + self._OUTPUT_TEXT = well + self._TEXT_TO_SPEECH = well self._say_that_user_can_change_their_difficulty_level_if_it_is_not_said_yet ( ) self._OUTPUT_TEXT += self._get_text_of_current_quest ( ) + self._TEXT_TO_SPEECH += self._get_text_of_current_quest ( ) self._BUTTONS.add_buttons (*self._buttons_for_choosing_correct_answer, hide_all = True) elif self._has_one_word_in_text_in_lower ("результат", "результаты"): @@ -276,21 +288,21 @@ def _save_text_and_correct_answer_of_easy_quest_in_session_data (self) -> None: quest_getter.save_random_easy_quest ( ) self._SESSIONAL_DATA["text_of_quest"] = quest_getter.prepared_text_of_random_easy_quest self._SESSIONAL_DATA["correct_answer_of_quest"] = quest_getter.correct_answer_of_random_easy_quest - self._TEXT_TO_SPEECH = quest_getter.answers_to_speech_of_random_easy_quest_as_str + #self._TEXT_TO_SPEECH = quest_getter.answers_to_speech_of_random_easy_quest_as_str def _save_text_and_correct_answer_of_medium_quest_in_session_data (self) -> None: quest_getter = QuestGetter ( ) quest_getter.save_random_medium_quest ( ) self._SESSIONAL_DATA["text_of_quest"] = quest_getter.prepared_text_of_random_medium_quest self._SESSIONAL_DATA["correct_answer_of_quest"] = quest_getter.correct_answer_of_random_medium_quest - self._TEXT_TO_SPEECH = quest_getter.answers_to_speech_of_random_medium_quest_as_str + #self._TEXT_TO_SPEECH = quest_getter.answers_to_speech_of_random_medium_quest_as_str def _save_text_and_correct_answer_of_hard_quest_in_session_data (self) -> None: quest_getter = QuestGetter ( ) quest_getter.save_random_hard_quest ( ) self._SESSIONAL_DATA["text_of_quest"] = quest_getter.prepared_text_of_random_hard_quest self._SESSIONAL_DATA["correct_answer_of_quest"] = quest_getter.correct_answer_of_random_hard_quest - self._TEXT_TO_SPEECH = quest_getter.answers_to_speech_of_random_hard_quest_as_str + #self._TEXT_TO_SPEECH = quest_getter.answers_to_speech_of_random_hard_quest_as_str def _save_text_and_correct_answer_of_quest_in_session_data (self, difficulty_level: int) -> None: match difficulty_level: @@ -305,10 +317,14 @@ def _save_text_and_correct_answer_of_quest_in_session_data (self, difficulty_lev def _say_that_user_can_change_their_difficulty_level_if_it_is_not_said_yet (self) -> None: if not self._SESSIONAL_DATA["was_said_that_user_can_change_difficulty_level"]: - self._OUTPUT_TEXT += "В любой момент вы можете сменить уровень сложности, сказав: \"Хочу сменить сложность\";\n" - self._OUTPUT_TEXT += "или выйти на главное меню, сказав: \"На главное меню\".\n" - self._OUTPUT_TEXT += "Так же вы можете узнать количество правильно отвеченных вопросов, сказав: \"Покажи результаты\".\n" - self._OUTPUT_TEXT += "Вот квест.\n\n" + text = [ + "В любой момент вы можете сменить уровень сложности, сказав: \"Хочу сменить сложность\";\n", + "или выйти на главное меню, сказав: \"На главное меню\".\n", + "Так же вы можете узнать количество правильно отвеченных вопросов, сказав: \"Покажи результаты\".\n", + "Вот квест.\n\n" + ] + self._OUTPUT_TEXT += "".join (text) + self._TEXT_TO_SPEECH += "".join (text) self._SESSIONAL_DATA["was_said_that_user_can_change_difficulty_level"] = True def _get_text_of_current_quest (self) -> str: @@ -360,10 +376,13 @@ def _choosing_right_answer_for_quest (self) -> None: self._BUTTONS.add_buttons (*self._buttons_for_choosing_correct_answer, hide_all = True) def _correct_answer_of_quest_is_selected (self) -> None: - self._OUTPUT_TEXT = get_text_that_says_answer_is_correct ( ) + "\n\n" + text_that_says_answer_is_correct = get_text_that_says_answer_is_correct ( ) + "\n\n" + self._OUTPUT_TEXT = text_that_says_answer_is_correct + self._TEXT_TO_SPEECH = text_that_says_answer_is_correct current_difficulty_level = self._SESSIONAL_DATA["difficulty_level"] self._save_text_and_correct_answer_of_quest_in_session_data (current_difficulty_level) self._OUTPUT_TEXT += self._get_text_of_current_quest ( ) + self._TEXT_TO_SPEECH += self._get_text_of_current_quest ( ) self._SESSIONAL_DATA["number_of_correct_quest_answers"] += 1 self._BUTTONS.add_buttons (*self._buttons_for_choosing_correct_answer, hide_all = True) diff --git a/quest_getter.py b/quest_getter.py index 4b39905..703fa17 100644 --- a/quest_getter.py +++ b/quest_getter.py @@ -75,6 +75,10 @@ def prepared_text_of_random_easy_quest (self) -> str: def correct_answer_of_random_easy_quest (self) -> Literal[1, 2, 3]: return self.saved_random_easy_quest["correct_answer"] + 1 # В файле первый ответ 0, а не 1 + @property + def answers_of_random_easy_quest_as_str (self) -> list[str]: + return ", ".join (self.saved_random_easy_quest["answers"] ) + @property def answers_to_speech_of_random_easy_quest (self) -> list[str]: return self.saved_random_easy_quest["answers_to_speech"] @@ -95,6 +99,10 @@ def prepared_text_of_random_medium_quest (self) -> str: def correct_answer_of_random_medium_quest (self) -> Literal[1, 2, 3]: return self.saved_random_medium_quest["correct_answer"] + 1 # В файле первый ответ 0, а не 1 + @property + def answers_of_random_medium_quest_as_str (self) -> list[str]: + return ", ".join (self.saved_random_medium_quest["answers"] ) + @property def answers_to_speech_of_random_medium_quest (self) -> list[str]: return self.saved_random_medium_quest["answers_to_speech"] @@ -115,6 +123,10 @@ def prepared_text_of_random_hard_quest (self) -> str: def correct_answer_of_random_hard_quest (self) -> Literal[1, 2, 3]: return self.saved_random_hard_quest["correct_answer"] + 1 # В файле первый ответ 0, а не 1 + @property + def answers_of_random_hard_quest_as_str (self) -> list[str]: + return ", ".join (self.saved_random_hard_quest["answers"] ) + @property def answers_to_speech_of_random_hard_quest (self) -> list[str]: return self.saved_random_hard_quest["answers_to_speech"] From 8402b71cdd9af735462dffeb7562333be456e1b2 Mon Sep 17 00:00:00 2001 From: Alexonys1 <107358560+Alexonys1@users.noreply.github.com> Date: Sat, 25 Mar 2023 17:16:58 +0300 Subject: [PATCH 08/31] =?UTF-8?q?3-=D1=8F=20=D0=BD=D0=B5=D0=BC=D0=BD=D0=BE?= =?UTF-8?q?=D0=B3=D0=BE=20=D0=B8=D0=B7=D0=BC=D0=B5=D0=BD=D1=91=D0=BD=D0=BD?= =?UTF-8?q?=D0=B0=D1=8F=20=D0=B2=D0=B5=D1=80=D1=81=D0=B8=D1=8F.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Переделал машину состояний. Всё работает без сбоев. --- enums.py | 14 +- lesson_getter.py | 48 +++ lessons.json | 109 +++---- main3.py | 705 +++++++++++++++++++++++++++++++++++++++++++ quest_getter.py | 8 +- task_getter.py | 53 ++++ tasks.json | 97 ++++++ texts_for_users.json | 24 +- useful_functions.py | 27 +- 9 files changed, 1001 insertions(+), 84 deletions(-) create mode 100644 lesson_getter.py create mode 100644 main3.py create mode 100644 task_getter.py create mode 100644 tasks.json diff --git a/enums.py b/enums.py index efe4a7b..a5c662b 100644 --- a/enums.py +++ b/enums.py @@ -1,18 +1,24 @@ import enum import random +from typing import Literal + @enum.unique -class DifficultyLevelsOfQuest (enum.IntEnum): +class DifficultyLevels (enum.IntEnum): EASY = 0 MEDIUM = 1 HARD = 2 + VERY_HARD = 3 - def get_random_difficulty_level ( ) -> int: + def get_random_difficulty_level_for_quest ( ) -> Literal[0, 1, 2]: return random.randint (0, 2) + def get_random_difficulty_level_for_task ( ) -> Literal[0, 1, 2, 3]: + return random.randint (0, 3) + if __name__ == '__main__': - print ("DifficultyLevelsOfQuest.get_random_difficulty_level: ", - DifficultyLevelsOfQuest.get_random_difficulty_level ( ), + print ("DifficultyLevels.get_random_difficulty_level_for_task: ", + DifficultyLevels.get_random_difficulty_level_for_task ( ), sep = "") \ No newline at end of file diff --git a/lesson_getter.py b/lesson_getter.py new file mode 100644 index 0000000..bb64691 --- /dev/null +++ b/lesson_getter.py @@ -0,0 +1,48 @@ +import json + + +class LessonGetter: + """Класс для работы с уроками, курсом в целом.""" + def __init__ (self): + self._load_all_lessons_from_file ( ) + self.themes = [lesson_theme for lesson_theme in self.all_lessons.keys()] + + def _load_all_lessons_from_file (self) -> None: + with open (self._name_of_file_with_lessons, "r") as file_with_lessons: + self.all_lessons: dict = json.load (file_with_lessons) + + @property + def _name_of_file_with_lessons (self) -> str: + return "lessons.json" + + + def get_subtheme_names (self, theme: str) -> list[str]: + """Получить имена подтем указанной темы.""" + return [lesson_subtheme for lesson_subtheme in self.all_lessons[theme].keys()] + + def get_first_subtheme_name (self, theme: str) -> str: + """Получить имя первой подтемы указанной темы.""" + return self.get_subtheme_names (theme = theme)[0] + + def get_subtheme_text (self, theme: str, subtheme: str) -> str: + """Получить подтему указанной темы.""" + return self.all_lessons[theme][subtheme] + + def get_name_of_next_theme (self, current_theme: str) -> str: + """Получить имя следующей темы.""" + index_of_current_theme = self.themes.index (current_theme) + index_of_next_theme = index_of_current_theme + 1 + try: + return self.themes[index_of_next_theme] + except IndexError: + return "" # Значит, эта тема последняя + + def get_name_of_next_subtheme (self, theme: str, subtheme: str) -> str: + """Получить имя следующей подтемы.""" + subthemes = self.get_subtheme_names (theme) + index_current_subtheme = subthemes.index (subtheme) + index_of_next_subtheme = index_current_subtheme + 1 + try: + return subthemes[index_of_next_subtheme] + except IndexError: + return "" # Значит, эта подтема последняя \ No newline at end of file diff --git a/lessons.json b/lessons.json index 82f2cb7..03df09d 100644 --- a/lessons.json +++ b/lessons.json @@ -1,52 +1,59 @@ -{ - "введение" : - { - "text" : - [ - "Предисловие.\nPython - это высокоуровневый, интерпретируемый язык программирования, который был создан в конце 1980-х годов Гвидо ван Россумом.", - "Он обладает простым и понятным синтаксисом, что делает его очень популярным среди начинающих программистов и профессионалов. Python поддерживает множество парадигм программирования, включая процедурное, объектно-ориентированное и функциональное программирование. ", - "Кроме того, Python имеет большое количество библиотек и фреймворков, которые делают его подходящим для различных задач, включая научные вычисления, веб-разработку, анализ данных и машинное обучение. Python также является платформонезависимым языком, что позволяет использовать его на разных операционных системах.", - "Все это делает Python одним из самых популярных языков программирования в мире, и он продолжает расти и развиваться с каждым годом.", - "Давайте начнем с приветствия мира Python! Откройте свой любимый текстовый редактор и введите следующий код: \nprint('Привет, мир!')\nСохраните файл с расширением .py, например, hello_world.py, и запустите его. Вы должны увидеть сообщение \"Привет, мир!\" на экране.", - "Это был очень простой пример, но Python имеет много возможностей и функций, которые мы будем изучать вместе по мере продвижения.", - "Курс начнется с изучения основных конструкций языка, таких как переменные, условные выражения, циклы и функции. Это поможет вам получить крепкую основу для дальнейшего изучения языка.", - "Удачного изучения Python!" - ], - "index":0, - "max_index":7 - }, - "комментарии": - { - "text" : - [ - "Второй урок. Комментарии. \nКомментарии в Python - это текст, который игнорируется интерпретатором Python при выполнении программы. Они используются для пояснения кода, описания работы программы или напоминания о том, что нужно доделать.", - "Комментарии начинаются с символа решетки (#) и идут до конца строки. Вот несколько примеров:\n# Это комментарий, который игнорируется интерпретатором\nprint(\"Hello!\") # Это комментарий после выражения", - "Комментарии могут быть как однострочными, так и многострочными. Однострочные комментарии удобны для коротких пояснений, а многострочные - для более подробного описания. Для создания многострочных комментариев в Python можно использовать тройные кавычки, как в примере ниже:\n\"\"\"\nЭто многострочный комментарий, который может\nсодержать несколько строк.\nОн игнорируется интерпретатором Python.\n\"\"\"", - "Кроме того, комментарии можно использовать для временного отключения участков кода. Например, если нужно проверить, как работает программа без определенного участка кода, его можно закомментировать, добавив символ # в начало каждой строки, и выполнить программу. Если нужно восстановить работу участка кода, символы # можно убрать.", - "Важно помнить, что комментарии должны быть понятными и информативными. Хороший комментарий должен описывать не только то, что делает код, но и почему это нужно, какие альтернативы были рассмотрены, какие возможные проблемы могут возникнуть, и т.д." - ], - "index":1, - "max_index":4 - }, - "переменные": - { - "text" : - [ - "Третий урок. Переменные. \nВ этом уроке я расскажу тебе о переменных в Python. Переменная - это место, где мы можем хранить данные в программе. В Python переменная создается присвоением значения с помощью знака \"=\". Например, чтобы создать переменную с именем \"x\" и присвоить ей значение 5, нужно написать:\nx = 5\nЗдесь мы создали переменную \"x\" и присвоили ей значение 5.", - "Имя переменной может состоять из букв, цифр и символа подчеркивания \"_\", но оно не может начинаться с цифры. Также в Python существует ряд зарезервированных слов, которые нельзя использовать в качестве имени переменной (например, \"if\", \"else\", \"for\" и т.д.).", - "Значение переменной можно изменить путем повторного присваивания. Например, чтобы изменить значение переменной \"x\" на 10, нужно написать:\nx = 10", - "В Python существует несколько встроенных типов данных, таких как:\nЦелые числа (int)\nВещественные числа (float)\nСтроки (str)\nБулевы значения (bool)\nСписки (list)\nКортежи (tuple)\nСловари (dict)\nМножества (set)\nКаждый тип имеет свои специфические методы и свойства, которые можно использовать для работы с данными.", - "Давайте рассмотрим их подробнее:\nЦелые числа (int)\nЦелые числа представляют собой положительные или отрицательные числа без дробной части. В Python целочисленные значения записываются без десятичной точки. Примеры:\nx = 5\ny = -10", - "Вещественные числа (float)\nВещественные числа представляют собой числа с дробной частью. В Python вещественные значения записываются с десятичной точкой. Примеры:\nx = 3.14\ny = -0.5\n", - "Строки (str)\nСтроки представляют собой последовательности символов в кавычках. \nВ Python строки можно задавать как в одинарных, так и в двойных кавычках. Примеры:\nx = 'Hello, World!'\ny = \"Python is awesome\"", - "Булевы значения (bool)\nБулевы значения представляют собой логические значения и могут быть либо True (истина), либо False (ложь). В будущем мы узнаем, что булевы значения используются в условных операторах (if, while, for) и логических выражениях. Примеры:\nx = True\ny = False\nС остальными типами данных мы познакомимся позже", - "Python является языком с динамической типизацией, что означает, что тип переменной определяется автоматически во время выполнения программы, в зависимости от значения, которое мы присваиваем ей. Например, если мы присваиваем переменной \"x\" значение 5, то ее тип будет целочисленным (int), а если мы присваиваем ей значение \"Hello, World!\", то ее тип будет строковым (str).", - "Чтобы узнать тип переменной, можно использовать функцию \"type()\". Например:\nx = 5\nprint(type(x)) # int\ny = \"Hello, World!\"\nprint(type(y)) # str", - "Несколько полезных советов по использованию переменных в Python:\nИспользуйте осмысленные имена переменных, чтобы код был более читаемым.\nИзбегайте использования зарезервированных слов в качестве имен переменных.\nИзбегайте использования слишком длинных имен переменных, чтобы не усложнять код.\nИспользуйте комментарии для пояснения, что делает каждая переменная в вашем коде.", - "Важно помнить, что комментарии должны быть понятными и информативными. Хороший комментарий должен описывать не только то, что делает код, но и почему это нужно, какие альтернативы были рассмотрены, какие возможные проблемы могут возникнуть, и т.д.", - "Сегодня мы закончили наш курс, этот урок был последним. Мы прошли все темы и научились многому новому. Удачи в дальнейшем изучении Python!" - ], - "index":2, - "max_index":11 - } +{ + "Урок 1: Введение в Python.": { + "Предисловие": "Python – простой и минималистичный язык.\nЧтение хорошей программы на Python очень напоминает чтение английского текста, хотя и достаточно строгого! Такая псевдо-кодовая природа Python является одной из его самых сильных сторон. Она позволяет вам сосредоточиться на решении задачи, а не на самом языке.", + "Python - это... Часть I": "Python - Язык высокого уровня.\nПри написании программы на Python вам никогда не придётся отвлекаться на такие низкоуровневые детали, как управление памятью, используемой вашей программой, и т.п.", + "Python - это... Часть II": "Python - Язык объектно-ориентированный.\nPython поддерживает как процедурно-ориентированное, так и объектноориентированное программирование. В процедурно-ориентированных языках программы строятся на основе процедур или функций, которые представляют собой просто-напросто многократно используемые фрагменты программы. В объектно-ориентированных языках программирования программы строятся на основе объектов, объединяющих в себе данные и функционал. \n\n__Python предоставляет простые, но мощные средства для ООП, особенно в сравнении с такими большими языками программирования, как C++ или Java.__" , + "Python - это... Часть III": "Python - Язык встраиваемый.\nВ Python можно встраивать в программы на C/C++, чтобы предоставлять возможности написания сценариев их пользователям." + }, + + "Урок 2: Установка Python.": { + "Предисловие": "Итак для того чтобы нам начать писать код нужно установть сам Python, а так же редактор для него ", + "Установка в Windows": "Посетите страницу http://www.python.org/download и загрузите последнюю версию. Установка производится так же, как и для любых других программ для Windows.", + "Выбор редактора": "Поскольку мы не можем набирать программу в командной строке интерпретатора каждый раз, когда нам нужно что-то запустить, нам понадобится сохранять программы в файлах, чтобы потом иметь возможность запускать их сколько угодно раз. \n\nПрежде чем приступить к написанию программ на Python в файлах, нам нужен редактор для работы с файлами программ. Выбор редактора крайне важен. Подходить к выбору редактора следует так же, как и к выбору личного автомобиля. Хороший редактор поможет вам легко писать программы на Python, делая ваше путешествие более комфортным, а также позволяя быстрее и безопаснее достичь вашей цели. \n\nОдно из самых основных требований – это __подсветка синтаксиса__, когда разные элементы программы на Python раскрашены так, чтобы вы могли легко видеть вашу программу и ход её выполнения. \n\nЕсли вы не знаете, с чего начать, мы бы порекомендовали вам пользоваться программой PyCharm", + "Создание проекта": "Запустите выбранный вами редактор, введите следующую программу и сохраните её под именем helloworld.py . \n\nЕсли вы пользуетесь PyCharm, нажмите «New Project» → «выберете путь где будут хранится ваши программы» → «создавайте проект!»" + }, + + "Урок 3: Основы.": { + "Предисловие": "Python – это, один из немногих языков программирования, простых в освоении и одновременно мощных. \n\nЭто очень важно и для начинающих, и для специалистов, но что ещё важнее – на нём приятно программировать.", + "Комментарии": "Комментарии – это то, что пишется после символа #, и представляет интерес лишь как заметка для читающего программу. \n\nНапример: \nprint(Привет, Мир!) # print -- это функция", + "Строка": "Строка – это последовательность символов. Чаще всего строки – это просто некоторые наборы слов. \n\nСлова могут быть как на английском языке, так и на любом другом, поддерживаемом стандартом Unicode, что означает почти на любом языке мира.", + "Одинарные кавычки": "Строку можно указать, используя одинарные кавычки, как например, 'Фраза в кавычках'. Все пробелы и знаки табуляции сохранятся, как есть.", + "Двойные кавычки": "Строки в двойных кавычках работают точно так же, как и в одинарных. Например,\"Как тебя зовут?\".", + "Типы данных": "Переменные могут хранить значения разных типов, называемых типами данных. Основными типами являются числа и строки, о которых мы уже говорили. В дальнейших главах мы увидим, как создавать свои собственные типы при помощи классов.", + "Переменные": "Использование одних лишь литеральных констант может скоро наскучить – нам ведь нужен способ хранения любой информации и манипулирования ею. Вот здесь на сцену выходят переменные. Слово «переменные» говорит само за себя – их значение может меняться, а значит, вы можете хранить в переменной всё, что угодно. \n\nПеременные – это просто области памяти компьютера, в которых вы храните некоторую информацию. В отличие от констант, к такой информации нужно каким-то образом получать доступ, поэтому переменным даются имена." + }, + + "Урок 4: Операторы и выражения.": { + "Предисловие": "Большинство предложений (логических строк) в программах содержат выражения. Простой пример выражения: 2 + 3. Выражение можно разделить на операторы и операнды. Операторы – это некий функционал, производящий какие-либо действия, который может быть представлен в виде символов, как например +, или специальных зарезервированных слов. Операторы могут производить некоторые действия над данными, и эти данные называются операндами. В нашем случае 2 и 3 – это операнды.", + "Оператор сложения": "Объяснение: суммирует два объекта. \n\nПример: 3 + 5 даст 8; 'a' + 'b' даст 'ab'", + "Оператор вычитания": "Объяснение: Даёт разность двух чисел; если первый операнд отсутствует, он считается равным нулю. \n\nПример: -5.2 даст отрицательное число, а 50 - 24 даст 26.", + "Оператор умножения": "Объяснение: Даёт произведение двух чисел или возвращает строку, повторённую заданное число раз. \n\nПример: 2 * 3 даст 6. 'la' * 3 даст 'lalala'", + "Оператор деления": "Объяснение: Возвращает частное от деления x на y. \n\nПример: 4 / 2 даст 2", + "Оператор меньше": "Объяснение: Определяет, верно ли, что x меньше y. Все операторы сравнения возвращают True или False. Обратите внимание на заглавные буквы в этих словах. \n\nПример: 5 < 3 даст False", + "Оператор больше": "Объяснение: Определяет, верно ли, что x больше y. \n\nПример: 5 > 3 даст True", + "Оператор равенства": "Объяснение: Проверяет,одинаковы ли объекты. \n\nПример: x = 2; y = 2; x == y даёт True", + "Оператор неравенства": "Объяснение: Проверяет, верно ли, что объекты не равны. \n\nПример: x = 2; y = 3; x != y даёт True", + "Оператор логического НЕ": "Объяснение: Если x равно True, оператор вернёт False. Если же x равно False, получим True. \n\nПример: x = True; not x даёт False", + "Оператор логического И": "Объяснение: x and y даёт False, если x равно False , в противном случае возвращает значение y. \n\nПример: x = False; y = True; x and y возвращает False, поскольку x равно False", + "Оператор логического ИЛИ": "Объяснение: Если x равно True, в результате получим True, в противном случае получим значение y. \n\nПример: x = True; y = False; x or y даёт True" + }, + + "Урок 5: Поток команд.": { + "Предисловие": "В программах, которые мы до сих пор рассматривали, последовательность команд всегда выполнялась Python по порядку строго сверху вниз. А что, если нам необходимо изменить поток выполняющихся команд? Например, если требуется, чтобы программа принимала некоторое решение и выполняла различные действия в зависимости от ситуации; скажем, печатала «Доброе утро» или «Добрый вечер» в зависимости от времени суток. \n\nКак вы уже, наверное, догадались, этого можно достичь при помощи операторов управления потоком. В Python есть три оператора управления потоком: if, for и while.", + "Условные оператор if. Часть I.": "Оператор if используется для проверки условий: если условие верно, выполняется блок выражений (называемый «if-блок»), иначе выполняется другой блок выражений (называемый «else-блок»). Блок «else» является необязательным.", + "Условные оператор if. Часть II.": "number = 23\nguess = int(input('Введите целое число : '))\n\nif guess == number:\n print('Поздравляю, вы угадали,') # Начало нового блока\n print('(хотя и не выиграли никакого приза!)') # Конец нового блока\nelif guess < number:\n print('Нет, загаданное число немного больше этого.') # Ещё один блок\nelse:\n print('Нет, загаданное число немного меньше этого.')", + "Условные оператор if. Часть III.": "В этой программе мы принимаем варианты от пользователя и проверяем, совпадают ли они с заранее заданным числом. Мы устанавливаем переменной number значение любого целого числа, какого хотим. Например, 23. После этого мы принимаем вариант числа от пользователя при помощи функции input(). Функции – это всего-навсего многократно используемые фрагменты программы. Мы узнаем о них больше в следующей главе. \n\nМы передаём встроенной функции input строку, которую она выводит на экран и ожидает ввода от пользователя. Как только мы ввели что-нибудь и нажали клавишу Enter, функция input() возвращает строку, которую мы ввели. Затем мы преобразуем полученную строку в число при помощи int(), и сохраняем это значение в переменную guess. При помощи int можно преобразовать строку в целое число (предполагая, что строка содержит целое число). \n\nДалее мы сравниваем число, введённое пользователем, с числом, которое мы выбрали заранее. Если они равны, мы печатаем сообщение об успехе. После этого мы проверяем, верно ли, что пользовательский вариант числа меньше загаданного, и если это так, мы информируем пользователя о том, что ему следует выбирать числа немного больше этого. Здесь мы использовали выражение elif, которое попросту объединяет в себе два связанных if else-if else выражения в одно выражение if-elif-else. Это облегчает чтение программы, а также не требует дополнительных отступов.", + "Оператор while. Часть I.": "Оператор while позволяет многократно выполнять блок команд до тех пор, пока выполняется некоторое условие. Это один из так называемых операторов цикла. Он также может иметь необязательный пункт else.", + "Оператор while. Часть II.": "number = 23\nrunning = True\n\nwhile running:\n guess = int(input('Введите целое число : '))\n\n if guess == number:\n print('Поздравляю, вы угадали.')\n running = False # это останавливает цикл while\n elif guess < number:\n print('Нет, загаданное число немного больше этого.')\n else:\n print('Нет, загаданное число немного меньше этого.')\nelse:\n print('Цикл while закончен.')", + "Оператор while. Часть III.": "В этой программе мы продолжаем играть в игру с угадыванием, но преимущество состоит в том, что теперь пользователь может угадывать до тех пор, пока не угадает правильное число, и ему не придётся запускать программу заново для каждой попытки, как это происходило до сих пор. Это наглядно демонстрирует применение оператора while.\n\nМы переместили операторы input и if внутрь цикла while и установили переменную running в значение True перед запуском цикла. Прежде всего проверяется, равно ли значение переменной running True, а затем происходит переход к соответствующему while-блоку. После выполнения этого блока команд условие, которым в данном случае является переменная running, проверяется снова. Если оно истинно, while-блок запускается снова, в противном случае происходит переход к дополнительному else-блоку, а затем – к следующему оператору.", + "Цикл for. Часть I.": "Оператор for..in также является оператором цикла, который осуществляет итерацию по последовательности объектов, т.е. проходит через каждый элемент в последовательности. __Мы узнаем больше о последовательностях в дальнейших главах, а пока просто запомните, что последовательность – это упорядоченный набор элементов.__", + "Цикл for. Часть II.": "for i in range(1, 5):\n print(i)\nelse:\n print('Цикл for закончен')", + "Цикл for. Часть III.": "В этой программе мы выводим на экран последовательность чисел. Мы генерируем эту последовательность, используя встроенную функцию range.\n\nМы задаём два числа, и range возвращает последовательность чисел от первого числа до второго. Например, range(1,5) даёт последовательность [1, 2, 3, 4]. По умолчанию range принимает значение шага, равное 1. Если мы зададим также и третье число range, оно будет служить шагом. Например, range(1,5,2) даст [1,3]. Помните, интервал простирается только до второго числа, т.е. не включает его в себя.\n\nЗатем цикл for осуществляет итерацию по этому диапазону - for i in range(1,5) эквивалентно for i in [1, 2, 3, 4], что напоминает присваивание переменной i по одному числу (или объекту) за раз, выполняя блок команд для каждого значения i. В данном случае в блоке команд мы просто выводим значение на экран.", + "Оператор break. Часть I.": "Оператор break служит для прерывания цикла, т.е. остановки выполнения команд даже если условие выполнения цикла ещё не приняло значения False или последовательность элементов не закончилась.\n\n__Важно отметить, что если циклы for или while прервать оператором break, соответствующие им блоки else выполняться не будут.__", + "Оператор break. Часть II.": "while True:\n s = input('Введите что-нибудь : ')\n if s == 'выход':\n break\n print('Длина строки:', len(s))", + "Оператор break. Часть III.": "В этой программе мы многократно считываем пользовательский ввод и выводим на экран длину каждой введённой строки. Для остановки программы мы вводим специальное условие, проверяющее, совпадает ли пользовательский ввод со строкой 'выход'. Мы останавливаем программу прерыванием цикла оператором break и достигаем её конца.\n\n__Длина введённой строки может быть найдена при помощи встроенной функции len.__", + "Оператор continue. Часть I.": "Оператор continue используется для указания Python, что необходимо пропустить все оставшиеся команды в текущем блоке цикла и продолжить со следующей итерации цикла", + "Оператор continue. Часть II.": "while True:\n s = input('Введите что-нибудь : ')\n if s == 'выход':\n break\n if len(s) < 3:\n print('Слишком мало')\n continue\n print('Введённая строка достаточной длины')", + "Оператор continue. Часть III.": "В этой программе мы запрашиваем ввод со стороны пользователя, но обрабатываем введённую строку только если она имеет длину хотя бы в 3 символа. Итак, мы используем встроенную функцию len для получения длины строки, и если длина менее 3, мы пропускаем остальные действия в блоке при помощи оператора continue. В противном случае все остальные команды в цикле выполняются, производя любые манипуляции, которые нам нужны." + } } \ No newline at end of file diff --git a/main3.py b/main3.py new file mode 100644 index 0000000..797902c --- /dev/null +++ b/main3.py @@ -0,0 +1,705 @@ +import random + +from json_manager import * +from useful_functions import * +from quest_getter import QuestGetter +from lesson_getter import LessonGetter +from task_getter import TaskGetter +from buttons import Buttons +from enums import * + +from typing import Literal + + +class HandlerOfAlisa: + def __init__ (self, request: dict): + self._VERSION: str = request["version"] + self._TEXT_IN_LOWER: str = request["request"]["command"] + self._ORIGINAL_TEXT: str = request["request"]["original_utterance"] + self._WORDS_OF_TEXT_IN_LOWER: list = request["request"]["nlu"]["tokens"] + self._IS_FIRST_MESSAGE: bool = request["session"]["new"] + self._IS_END_SESSION: bool = False + # Заранее создаются сессионные и межсессионные данные + self._SESSIONAL_DATA: dict = create_sessional_data (request["state"]["session"]) + self._INTERSESSIONAL_DATA: dict = create_intersessional_data (request["state"]["user"]) + self._TEXT_TO_SPEECH = "" + self._BUTTONS = Buttons ( ) + self._working_with_user ( ) + + + def _working_with_user (self) -> None: + """Во время запуска навыка Алиса получает пустой текстовый запрос, + на который она тут же отвечает. Этот ответ мы воспринимаем + как первое сообщение (хотя оно уже по факту второе, но это неважно). + """ + # Абсолютно новый пользователь + if self._INTERSESSIONAL_DATA["new_user"]: + self._OUTPUT_TEXT = get_text_for_new_user ( ) + self._TEXT_TO_SPEECH = get_text_for_new_user ( ) + "\n" + self._TEXT_TO_SPEECH += get_main_commands_of_skill ( ) + self._INTERSESSIONAL_DATA["new_user"] = False + self._BUTTONS.add_buttons_of_main_menu_in_text ( ) + + # Пользователь в главном меню впервые + elif self._user_is_in_main_menu and self._IS_FIRST_MESSAGE: + user_greeting = get_user_greeting ( ) + self._OUTPUT_TEXT = user_greeting + self._TEXT_TO_SPEECH = user_greeting + self._TEXT_TO_SPEECH += get_main_commands_of_skill ( ) + self._BUTTONS.add_buttons_of_main_menu_in_text ( ) + + # Пользователь просто в главном меню + elif self._user_is_in_main_menu: + text_that_says_user_is_just_in_main_menu = get_text_that_says_user_is_just_in_main_menu ( ) + self._OUTPUT_TEXT = text_that_says_user_is_just_in_main_menu + self._TEXT_TO_SPEECH = text_that_says_user_is_just_in_main_menu + self._TEXT_TO_SPEECH += get_main_commands_of_skill ( ) + self._BUTTONS.add_buttons_of_main_menu_in_text ( ) + self._working_with_user_in_main_menu ( ) + + # Пользователь не в главном меню + else: + self._working_with_user_outside_main_menu ( ) + + @property + def _user_is_in_main_menu (self) -> bool: + if self._SESSIONAL_DATA["state"] == "in_main_menu": + return True + else: + return False + + + def _working_with_user_in_main_menu (self) -> None: + self._BUTTONS.remove_all_buttons ( ) + self._TEXT_TO_SPEECH = "" + # Пока навык в разработке + if self._has_all_words_in_text_in_lower ("сбрось", "настройки") or \ + self._has_all_words_in_text_in_lower ("сбросить", "настройки"): + self._INTERSESSIONAL_DATA["new_user"] = True + self._INTERSESSIONAL_DATA["last_lesson"] = 0 + self._INTERSESSIONAL_DATA["last_task"] = 0 + self._OUTPUT_TEXT = "Настройки сброшены.\n" + self._OUTPUT_TEXT = "Перезагрузите навык." + + elif self._has_one_word_in_text_in_lower ( + "курс", "курса", "курсу", "курсом", "курсе"): + self._SESSIONAL_DATA["state"] = "working_with_course" + self._OUTPUT_TEXT = "Вы находитесь в меню Курса.\n" + self._OUTPUT_TEXT += "Здесь вы можете посмотреть список тем и выбрать любую,\n" + self._OUTPUT_TEXT += "можете продолжить последнюю или переслушать текущую." + self._BUTTONS.add_buttons (*self._commands_of_course, hide_all = False) + + elif self._has_one_word_in_text_in_lower ( + "задачка", "задачки", "задачку", "задачке", "задачкой", + "задача", "задачи", "задачу", "задаче", "задачей", + "задачек", "задачкам", "задачками", "задачках"): + # FIXME + self._SESSIONAL_DATA["state"] = "working_with_tasks" + self._OUTPUT_TEXT = "Какой уровень сложности вы хотите выбрать?\n" + self._TEXT_TO_SPEECH = self._OUTPUT_TEXT + self._TEXT_TO_SPEECH += ", ".join (self._difficulty_levels_of_course) + self._BUTTONS.add_buttons (*self._difficulty_levels_of_course, hide_all = False) + self._BUTTONS.add_buttons ("Узнать мои результаты", "На главное меню", "Пока", hide_all = True) + + elif self._has_one_word_in_text_in_lower ( + "квест", "квеста", "квесту", "квестом", "квесте", + "квесты", "квестов", "квестам", "квестами", "квестах"): + self._SESSIONAL_DATA["state"] = "working_with_quest" + self._OUTPUT_TEXT = "Какой уровень сложности вы хотите выбрать?\n" + self._TEXT_TO_SPEECH = self._OUTPUT_TEXT + self._TEXT_TO_SPEECH += ", ".join (self._difficulty_levels_of_quest) + self._BUTTONS.add_buttons (*self._difficulty_levels_of_quest, hide_all = False) + self._BUTTONS.add_buttons ("Узнать мои результаты", "На главное меню", "Пока", hide_all = True) + + elif self._has_one_word_in_text_in_lower ( + "пожаловаться", "жалоба", "жалобу", "отчёт", "отчет"): + self._SESSIONAL_DATA["state"] = "sending_report" + self._OUTPUT_TEXT = "Я не знаю, на какую почту отправлять жалобу...\n" + self._OUTPUT_TEXT += "Может, на главное меню?" + self._BUTTONS.add_buttons ("На главное меню", "Пока!", hide_all = True) + + elif self._has_one_word_in_text_in_lower ( + "консультант", "консультанта", "консультанту", "консультантом", "консультанте" + "консультация", "консультации", "консультацию", "консультацией", "проконсультируй"): + self._SESSIONAL_DATA["state"] = "consulting" + self._OUTPUT_TEXT = "Пока я не могу вас проконсультировать, извините...\n" + self._OUTPUT_TEXT += "Может, на главное меню?" + self._BUTTONS.add_buttons ("На главное меню", "Пока!", hide_all = True) + + elif self._has_all_words_in_text_in_lower ("оцени", "знания"): + self._OUTPUT_TEXT = "Зачем \"Оцени мои знания\", когда есть \"Квест\"?\n" + self._OUTPUT_TEXT += "Скажи \"Квест\", чтобы его попробовать." + self._BUTTONS.add_buttons_of_main_menu_in_text ( ) + + elif self._user_wants_to_go_to_main_menu: + self._OUTPUT_TEXT = "Вы уже на главном меню!" + + elif self._user_wants_to_end_session: + self._end_the_session ( ) + + else: + self._OUTPUT_TEXT = get_apology_text ( ) + + @property + def _commands_of_course (self) -> tuple[str]: + return "Посмотреть список тем", "Текущая тема", "Продолжить последнюю", "Переслушать текущую", "На главное меню", "Пока!" + + @property + def _difficulty_levels_of_quest (self) -> tuple[str, str, str, str]: + return "Лёгкий", "Средний", "Высокий", "Случайный" + + @property + def _difficulty_levels_of_course (self) -> tuple[str, str, str, str, str]: + return "Лёгкий", "Средний", "Высокий", "Очень высокий", "Случайный" + + + def _working_with_user_outside_main_menu (self) -> None: + match self._SESSIONAL_DATA["state"]: + case "working_with_course": + self._working_with_course ( ) + case "choosing_course_theme": + self._choosing_course_theme ( ) + case "start_next_lesson_or_not": + self._start_next_lesson_or_not ( ) + case "working_with_tasks": + self._working_with_tasks ( ) + case "choosing_right_answer_for_task": + self._choosing_right_answer_for_task ( ) + case "working_with_quest": + self._working_with_quest ( ) + case "choosing_right_answer_for_quest": + self._choosing_right_answer_for_quest ( ) + case "viewing_quest_results": + self._viewing_quest_results ( ) + case "sending_report": + self._sending_report ( ) + case "consulting": + self._consulting ( ) + + + def _working_with_course (self) -> None: + lesson_getter = LessonGetter ( ) + current_lesson_theme = self._INTERSESSIONAL_DATA["current_lesson"] + current_lesson_subtheme = self._INTERSESSIONAL_DATA["current_sublesson"] + + if self._has_one_word_in_text_in_lower ("список", "списка", "списку", "списком", "списке") or \ + self._has_one_word_in_text_in_lower ("списки", "списка", "спискам", "списками", "списках"): + self._SESSIONAL_DATA["state"] = "choosing_course_theme" + self._OUTPUT_TEXT = "Список тем уроков:" + self._TEXT_TO_SPEECH = self._OUTPUT_TEXT + for lesson_theme in lesson_getter.themes: + self._BUTTONS.add_buttons (lesson_theme, hide_all = False) + self._TEXT_TO_SPEECH += lesson_theme + "\n" + self._BUTTONS.add_buttons ("Назад", "На главное меню", "Выход", hide_all = True) + + elif self._has_one_word_in_text_in_lower ("продолжить", "дальше", "далее"): + if current_lesson_theme: + next_subtheme = lesson_getter.get_name_of_next_subtheme (theme = current_lesson_theme, + subtheme = current_lesson_subtheme) + else: + next_subtheme = None + + if next_subtheme: + self._INTERSESSIONAL_DATA["current_sublesson"] = next_subtheme + self._OUTPUT_TEXT = lesson_getter.get_subtheme_text (theme = current_lesson_theme, + subtheme = next_subtheme) + self._BUTTONS.add_buttons ("Продолжить", "Переслушать", "Список тем", + "На главное меню", "Пока", hide_all = True) + elif not next_subtheme and current_lesson_subtheme: + self._OUTPUT_TEXT = "Поздравляю! Вы прошли целый урок.\n" + self._OUTPUT_TEXT += "Следующий - это " + lesson_getter.get_name_of_next_theme (current_lesson_theme) + "\n" + self._OUTPUT_TEXT += "Хотите продолжить?" + self._SESSIONAL_DATA["state"] = "start_next_lesson_or_not" + self._BUTTONS.add_buttons ("Да, хочу!", "Нет, позже.", hide_all = False) + self._BUTTONS.add_buttons ("На главное меню", "Пока", hide_all = True) + + else: + self._user_has_not_listened_to_any_lesson ( ) + + elif self._has_all_words_in_text_in_lower ("переслушать"): + if current_lesson_theme: + self._OUTPUT_TEXT = lesson_getter.get_subtheme_text (theme = current_lesson_theme, + subtheme = current_lesson_subtheme) + self._OUTPUT_TEXT += "\nСкажите: \"Продолжить\", чтобы продолжить." + self._BUTTONS.add_buttons ("Продолжить", "Переслушать", "Список тем", "Текущая тема", + "На главное меню", "Пока", hide_all = True) + else: + self._user_has_not_listened_to_any_lesson ( ) + + elif self._has_one_word_in_text_in_lower ("текущая", "текущую"): + if current_lesson_theme: + self._OUTPUT_TEXT = "Текущая тема урока: " + current_lesson_theme + "\n" + self._OUTPUT_TEXT += "Подтема: " + current_lesson_subtheme + self._BUTTONS.add_buttons ("Продолжить", "Переслушать", "На главное меню", "Пока", hide_all = True) + else: + self._user_has_not_listened_to_any_lesson ( ) + + elif self._user_wants_to_go_to_main_menu: + self._go_to_main_menu ( ) + + elif self._user_wants_to_end_session: + self._end_the_session ( ) + + else: + self._OUTPUT_TEXT = get_apology_text ( ) + self._BUTTONS.add_buttons ("На главное меню", "Пока!", hide_all = True) + + @property + def _user_wants_to_go_to_main_menu (self) -> bool: + if self._has_all_words_in_text_in_lower ("на", "главное", "меню"): + return True + else: + return False + + @property + def _user_wants_to_end_session (self) -> bool: + if self._has_one_word_in_text_in_lower ("выход", "выйти", "пока", "прощай"): + return True + else: + return False + + + def _user_has_not_listened_to_any_lesson (self) -> None: + self._OUTPUT_TEXT = "Вы ещё не прошли ни одного урока.\n" + self._OUTPUT_TEXT += "Скажите: \"Покажи список тем\", чтобы начать изучать курс." + self._BUTTONS.add_buttons ("Покажи список тем", "На главное меню", "Выход", hide_all = True) + + + def _choosing_course_theme (self) -> None: + if self._has_one_word_in_text_in_lower ("1", "введение"): + self._start_next_lesson_and_sublesson (1) + + elif self._has_one_word_in_text_in_lower ("2", "устанока"): + self._start_next_lesson_and_sublesson (2) + + elif self._has_one_word_in_text_in_lower ("3", "основы"): + self._start_next_lesson_and_sublesson (3) + + elif self._has_one_word_in_text_in_lower ("4", "операторы", "выражения"): + self._start_next_lesson_and_sublesson (4) + + elif self._has_one_word_in_text_in_lower ("5", "поток", "команд"): + self._start_next_lesson_and_sublesson (5) + + elif self._has_one_word_in_text_in_lower ("назад", "обратно"): + self._SESSIONAL_DATA["state"] = "working_with_course" + self._OUTPUT_TEXT = "Вы находитесь в меню Курса.\n" + self._OUTPUT_TEXT += "Здесь вы можете посмотреть список тем и выбрать любую,\n" + self._OUTPUT_TEXT += "можете продолжить последнюю или переслушать текущую." + self._BUTTONS.add_buttons (*self._commands_of_course, hide_all = False) + self._BUTTONS.add_buttons ("Покажи список тем", "На главное меню", "Выход", hide_all = True) + + elif self._user_wants_to_go_to_main_menu: + self._go_to_main_menu ( ) + + elif self._user_wants_to_end_session: + self._end_the_session ( ) + + else: + self._OUTPUT_TEXT = get_apology_text ( ) + + def _start_next_lesson_and_sublesson (self, theme_number: Literal[1, 2, 3, 4, 5]) -> None: + lesson_getter = LessonGetter ( ) + theme_number = theme_number - 1 # Первый урок под номером 0, а не 1 + self._SESSIONAL_DATA["state"] = "working_with_course" + self._INTERSESSIONAL_DATA["current_lesson"] = (name_of_current_theme := lesson_getter.themes[theme_number]) # Морожовый, он самый) + self._INTERSESSIONAL_DATA["current_sublesson"] = (name_of_current_subtheme := lesson_getter.get_first_subtheme_name (name_of_current_theme)) + self._OUTPUT_TEXT = random.choice (("Хорошо, ", "Отлично, ", "Прекрасно, ")) + "тогда начнём?" + "\n\n" + self._OUTPUT_TEXT += "Предисловие первого занятия:\n" + self._OUTPUT_TEXT += lesson_getter.get_subtheme_text (theme = name_of_current_theme, + subtheme = name_of_current_subtheme) + self._TEXT_TO_SPEECH = self._OUTPUT_TEXT + self._BUTTONS.add_buttons ("Далее", "Переслушать", "На главное меню", "Пока", hide_all = True) + + + def _start_next_lesson_or_not (self) -> None: + old_lesson_theme = self._INTERSESSIONAL_DATA["current_lesson"] + lesson_getter = LessonGetter ( ) + next_lesson_theme = lesson_getter.get_name_of_next_theme (old_lesson_theme) + first_lesson_subtheme = lesson_getter.get_first_subtheme_name (next_lesson_theme) + self._INTERSESSIONAL_DATA["current_lesson"] = next_lesson_theme + self._INTERSESSIONAL_DATA["current_sublesson"] = first_lesson_subtheme + + if self._has_one_word_in_text_in_lower ("да", "конечно", "дальше", "далее"): + self._SESSIONAL_DATA["state"] = "working_with_course" + self._OUTPUT_TEXT = lesson_getter.get_subtheme_text (theme = next_lesson_theme, + subtheme = first_lesson_subtheme) + self._BUTTONS.add_buttons ("Далее", "Переслушать", "На главное меню", "Пока", hide_all = True) + + elif self._has_one_word_in_text_in_lower ("не", "нет", "позже", "потом"): + self._SESSIONAL_DATA["state"] = "working_with_course" + self._OUTPUT_TEXT = "Как хотите. В любой момент скажите просто скажите: \"Продолжить\"." + self._BUTTONS.add_buttons (*self._commands_of_course, hide_all = False) + + elif self._user_wants_to_go_to_main_menu: + self._go_to_main_menu ( ) + + elif self._user_wants_to_end_session: + self._end_the_session ( ) + + else: + self._OUTPUT_TEXT = get_apology_text ( ) + self._BUTTONS.add_buttons ("Да, хочу!", "Нет, позже.", hide_all = True) + + + def _working_with_tasks (self) -> None: + if self._has_one_word_in_text_in_lower ( + "лёгкий", "лёгкого", "лёгкому", "лёгким", "лёгком", + "легкий", "легкого", "легкому", "легким", "легком"): + self._OUTPUT_TEXT = random.choice (("Хорошо, ", "Отлично, ", "Прекрасно, ")) + "тогда начнём?\n" + self._SESSIONAL_DATA["difficulty_level_of_task"] = DifficultyLevels.EASY.value + self._SESSIONAL_DATA["state"] = "choosing_between_solve_and_code" + + elif self._has_one_word_in_text_in_lower ( + "средний", "среднего", "среднему", "среднем", + "средняя", "средней", "среднюю"): + self._OUTPUT_TEXT = random.choice (("Хорошо, ", "Отлично, ", "Прекрасно, ")) + "тогда начнём?\n" + self._SESSIONAL_DATA["difficulty_level_of_task"] = DifficultyLevels.MEDIUM.value + self._SESSIONAL_DATA["state"] = "choosing_between_solve_and_code" + + elif self._has_one_word_in_text_in_lower ( + "высокий", "высокого", "высокому", "высоким", "высоком", + "сложный", "сложного", "сложному", "сложным", "сложном"): + self._OUTPUT_TEXT = random.choice (("Хорошо, ", "Отлично, ", "Прекрасно, ")) + "тогда начнём?\n" + self._SESSIONAL_DATA["difficulty_level_of_task"] = DifficultyLevels.HARD.value + self._SESSIONAL_DATA["state"] = "choosing_between_solve_and_code" + + elif self._has_one_word_in_text_in_lower ( + "случайный", "случайного", "случайному", "случайным", "случайном", + "случайная", "случайной", "случайную", + "рандом", "рандома", "рандому", "рандомом", "рандоме", + "рандомный", "рандомного", "рандомному", "рандомном", + "рандомная", "рандомной", "рандомную"): + self._OUTPUT_TEXT = random.choice (("Хорошо, ", "Отлично, ", "Прекрасно, ")) + "\n" + self._SESSIONAL_DATA["difficulty_level_of_task"] = DifficultyLevels.get_random_difficulty_level_for_task ( ) + self._SESSIONAL_DATA["state"] = "choosing_between_solve_and_code" + + elif self._has_one_word_in_text_in_lower ("результат", "результаты"): + pass + + elif self._user_wants_to_go_to_main_menu: + self._go_to_main_menu ( ) + + elif self._user_wants_to_end_session: + self._end_the_session ( ) + + else: + self._OUTPUT_TEXT = get_apology_text ( ) + self._BUTTONS.add_buttons ("На главное меню", "Пока!", hide_all = True) + + + def _choosing_right_answer_for_task (self) -> None: + # FIXME + if self._user_wants_to_go_to_main_menu: + self._go_to_main_menu ( ) + + elif self._user_wants_to_end_session: + self._end_the_session ( ) + + else: + self._OUTPUT_TEXT = get_apology_text ( ) + self._BUTTONS.add_buttons ("На главное меню", "Пока!", hide_all = True) + + + def _working_with_quest (self) -> None: + if self._has_one_word_in_text_in_lower ( + "лёгкий", "лёгкого", "лёгкому", "лёгким", "лёгком", + "легкий", "легкого", "легкому", "легким", "легком"): + self._SESSIONAL_DATA["difficulty_level_of_quest"] = DifficultyLevels.EASY.value + self._SESSIONAL_DATA["state"] = "choosing_right_answer_for_quest" + self._save_text_and_correct_answer_of_easy_quest_in_session_data ( ) + well = random.choice (("Хорошо.", "Отлично.", "Прекрасно.")) + "\n\n" + self._OUTPUT_TEXT = well + self._TEXT_TO_SPEECH = well + self._say_that_user_can_change_their_difficulty_level_of_quest_if_it_is_not_said_yet ( ) + self._OUTPUT_TEXT += self._get_text_of_current_quest ( ) + self._TEXT_TO_SPEECH += self._get_text_of_current_quest ( ) + self._BUTTONS.add_buttons (*self._buttons_for_choosing_correct_answer, hide_all = True) + + elif self._has_one_word_in_text_in_lower ( + "средний", "среднего", "среднему", "среднем", + "средняя", "средней", "среднюю"): + self._SESSIONAL_DATA["difficulty_level_of_quest"] = DifficultyLevels.MEDIUM.value + self._SESSIONAL_DATA["state"] = "choosing_right_answer_for_quest" + self._save_text_and_correct_answer_of_medium_quest_in_session_data ( ) + well = random.choice (("Хорошо.", "Отлично.", "Прекрасно.")) + "\n\n" + self._OUTPUT_TEXT = well + self._TEXT_TO_SPEECH = well + self._say_that_user_can_change_their_difficulty_level_of_quest_if_it_is_not_said_yet ( ) + self._OUTPUT_TEXT += self._get_text_of_current_quest ( ) + self._TEXT_TO_SPEECH += self._get_text_of_current_quest ( ) + self._BUTTONS.add_buttons (*self._buttons_for_choosing_correct_answer, hide_all = True) + + elif self._has_one_word_in_text_in_lower ( + "высокий", "высокого", "высокому", "высоким", "высоком", + "сложный", "сложного", "сложному", "сложным", "сложном"): + self._SESSIONAL_DATA["difficulty_level_of_quest"] = DifficultyLevels.HARD.value + self._SESSIONAL_DATA["state"] = "choosing_right_answer_for_quest" + self._save_text_and_correct_answer_of_hard_quest_in_session_data ( ) + well = random.choice (("Хорошо.", "Отлично.", "Прекрасно.")) + "\n\n" + self._OUTPUT_TEXT = well + self._TEXT_TO_SPEECH = well + self._say_that_user_can_change_their_difficulty_level_of_quest_if_it_is_not_said_yet ( ) + self._OUTPUT_TEXT += self._get_text_of_current_quest ( ) + self._TEXT_TO_SPEECH += self._get_text_of_current_quest ( ) + self._BUTTONS.add_buttons (*self._buttons_for_choosing_correct_answer, hide_all = True) + + elif self._has_one_word_in_text_in_lower ( + "случайный", "случайного", "случайному", "случайным", "случайном", + "случайная", "случайной", "случайную", + "рандом", "рандома", "рандому", "рандомом", "рандоме", + "рандомный", "рандомного", "рандомному", "рандомном", + "рандомная", "рандомной", "рандомную"): + difficulty_level = DifficultyLevels.get_random_difficulty_level_for_quest ( ) + self._SESSIONAL_DATA["difficulty_level_of_quest"] = difficulty_level + self._SESSIONAL_DATA["state"] = "choosing_right_answer_for_quest" + self._save_text_and_correct_answer_of_quest_in_session_data (difficulty_level) + well = random.choice (("Хорошо.", "Отлично.", "Прекрасно.")) + "\n\n" + self._OUTPUT_TEXT = well + self._TEXT_TO_SPEECH = well + self._say_that_user_can_change_their_difficulty_level_of_quest_if_it_is_not_said_yet ( ) + self._OUTPUT_TEXT += self._get_text_of_current_quest ( ) + self._TEXT_TO_SPEECH += self._get_text_of_current_quest ( ) + self._BUTTONS.add_buttons (*self._buttons_for_choosing_correct_answer, hide_all = True) + + elif self._has_one_word_in_text_in_lower ("результат", "результаты"): + self._show_results_of_quest_and_next_quest ( ) + + elif self._user_wants_to_go_to_main_menu: + self._go_to_main_menu ( ) + + elif self._user_wants_to_end_session: + self._end_the_session ( ) + + else: + self._OUTPUT_TEXT = get_apology_text ( ) + self._BUTTONS.add_buttons (*self._buttons_for_choosing_difficutly_level, hide_all = True) + + @property + def _buttons_for_choosing_difficutly_level (self) -> dict: + return "Лёгкий", "Средний", "Высокий", "Случайный", "Узнать мои результаты", "На главное меню", "Пока!" + + def _save_text_and_correct_answer_of_easy_quest_in_session_data (self) -> None: + quest_getter = QuestGetter ( ) + quest_getter.save_random_easy_quest ( ) + self._SESSIONAL_DATA["text_of_quest"] = quest_getter.prepared_text_of_random_easy_quest + self._SESSIONAL_DATA["correct_answer_of_quest"] = quest_getter.correct_answer_of_random_easy_quest + #self._TEXT_TO_SPEECH = quest_getter.answers_to_speech_of_random_easy_quest_as_str + + def _save_text_and_correct_answer_of_medium_quest_in_session_data (self) -> None: + quest_getter = QuestGetter ( ) + quest_getter.save_random_medium_quest ( ) + self._SESSIONAL_DATA["text_of_quest"] = quest_getter.prepared_text_of_random_medium_quest + self._SESSIONAL_DATA["correct_answer_of_quest"] = quest_getter.correct_answer_of_random_medium_quest + #self._TEXT_TO_SPEECH = quest_getter.answers_to_speech_of_random_medium_quest_as_str + + def _save_text_and_correct_answer_of_hard_quest_in_session_data (self) -> None: + quest_getter = QuestGetter ( ) + quest_getter.save_random_hard_quest ( ) + self._SESSIONAL_DATA["text_of_quest"] = quest_getter.prepared_text_of_random_hard_quest + self._SESSIONAL_DATA["correct_answer_of_quest"] = quest_getter.correct_answer_of_random_hard_quest + #self._TEXT_TO_SPEECH = quest_getter.answers_to_speech_of_random_hard_quest_as_str + + def _save_text_and_correct_answer_of_quest_in_session_data (self, difficulty_level: int) -> None: + match difficulty_level: + case DifficultyLevels.EASY.value: + self._save_text_and_correct_answer_of_easy_quest_in_session_data ( ) + case DifficultyLevels.MEDIUM.value: + self._save_text_and_correct_answer_of_medium_quest_in_session_data ( ) + case DifficultyLevels.HARD.value: + self._save_text_and_correct_answer_of_hard_quest_in_session_data ( ) + case _: + raise ValueError ("Указан неправильный уровень сложности!") + + def _say_that_user_can_change_their_difficulty_level_of_quest_if_it_is_not_said_yet (self) -> None: + if not self._SESSIONAL_DATA["was_said_that_user_can_change_difficulty_level_in_quest"]: + text = [ + "В любой момент вы можете сменить уровень сложности, сказав: \"Хочу сменить сложность\";\n", + "или выйти на главное меню, сказав: \"На главное меню\".\n", + "Так же вы можете узнать количество правильно отвеченных вопросов, сказав: \"Покажи результаты\".\n", + "Вот квест.\n\n" + ] + self._OUTPUT_TEXT += "".join (text) + self._TEXT_TO_SPEECH += "".join (text) + self._SESSIONAL_DATA["was_said_that_user_can_change_difficulty_level_in_quest"] = True + + def _get_text_of_current_quest (self) -> str: + return self._SESSIONAL_DATA["text_of_quest"] + + @property + def _buttons_for_choosing_correct_answer (self) -> dict: + return "Первое", "Второе", "Третье", "Изменить уровень сложности", "Узнать мои результаты", "На главное меню", "Пока!" + + + def _choosing_right_answer_for_quest (self) -> None: + if self._has_one_word_in_text_in_lower ("1", "один", "первый", "первое"): + if self._SESSIONAL_DATA["correct_answer_of_quest"] == 1: + self._correct_answer_of_quest_is_selected ( ) + else: + self._wrong_answer_of_quest_is_selected ( ) + + elif self._has_one_word_in_text_in_lower ("2", "два", "второй", "второе"): + if self._SESSIONAL_DATA["correct_answer_of_quest"] == 2: + self._correct_answer_of_quest_is_selected ( ) + else: + self._wrong_answer_of_quest_is_selected ( ) + + elif self._has_one_word_in_text_in_lower ("3", "три", "третий", "третье"): + if self._SESSIONAL_DATA["correct_answer_of_quest"] == 3: + self._correct_answer_of_quest_is_selected ( ) + else: + self._wrong_answer_of_quest_is_selected ( ) + + elif self._has_all_words_in_text_in_lower ("уровень", "сложности") or \ + self._has_one_word_in_text_in_lower ("сложность"): + self._SESSIONAL_DATA["state"] = "working_with_quest" + self._OUTPUT_TEXT = random.choice (("Хорошо.", "Отлично.")) + "\n" + self._OUTPUT_TEXT += "Теперь просто скажите нужный уровень сложности." + self._BUTTONS.add_buttons (*self._buttons_for_choosing_difficutly_level, hide_all = True) + + elif self._has_one_word_in_text_in_lower ("результат", "результаты"): + self._show_results_of_quest_and_next_quest ( ) + + elif self._user_wants_to_go_to_main_menu: + self._go_to_main_menu ( ) + + elif self._user_wants_to_end_session: + self._end_the_session ( ) + + else: + self._OUTPUT_TEXT = get_text_that_says_there_is_no_answer_like_that ( ) + self._BUTTONS.add_buttons (*self._buttons_for_choosing_correct_answer, hide_all = True) + + def _correct_answer_of_quest_is_selected (self) -> None: + text_that_says_answer_is_correct = get_text_that_says_answer_is_correct ( ) + "\n\n" + self._OUTPUT_TEXT = text_that_says_answer_is_correct + self._TEXT_TO_SPEECH = text_that_says_answer_is_correct + current_difficulty_level = self._SESSIONAL_DATA["difficulty_level_of_quest"] + self._save_text_and_correct_answer_of_quest_in_session_data (current_difficulty_level) + self._OUTPUT_TEXT += self._get_text_of_current_quest ( ) + self._TEXT_TO_SPEECH += self._get_text_of_current_quest ( ) + self._SESSIONAL_DATA["number_of_correct_quest_answers"] += 1 + self._BUTTONS.add_buttons (*self._buttons_for_choosing_correct_answer, hide_all = True) + + def _show_results_of_quest_and_next_quest (self) -> None: + correct_quest_answers = int (self._SESSIONAL_DATA["number_of_correct_quest_answers"]) + wrong_quest_answers = int (self._SESSIONAL_DATA["number_of_wrong_quest_answers"]) + if correct_quest_answers and wrong_quest_answers: + self._OUTPUT_TEXT = f"Количество правильных ответов: {correct_quest_answers}.\n" + self._OUTPUT_TEXT += f"Количество неправильных ответов: {wrong_quest_answers}.\n" + python_knowledge = calculate_python_knowledge (correct_quest_answers, wrong_quest_answers) + self._OUTPUT_TEXT += f"Ваше знание Python: {python_knowledge}%." + self._SESSIONAL_DATA["state"] = "viewing_quest_results" + self._BUTTONS.add_buttons ("Продолжить квест", "На главное меню", "Пока", hide_all = True) + + elif not correct_quest_answers and wrong_quest_answers: + self._OUTPUT_TEXT = "Жаль, но у вас нет ни одного правильного ответа на квест." + self._SESSIONAL_DATA["state"] = "viewing_quest_results" + self._BUTTONS.add_buttons ("Продолжить квест", "На главное меню", "Пока", hide_all = True) + + elif correct_quest_answers and not wrong_quest_answers: + self._OUTPUT_TEXT = "Все ваши ответы верны! Похоже, вы профессиональный программист!" + self._SESSIONAL_DATA["state"] = "viewing_quest_results" + self._BUTTONS.add_buttons ("Продолжить квест", "На главное меню", "Пока", hide_all = True) + + else: + self._OUTPUT_TEXT = "Пока вы не ответили ни на один квест." + self._make_all_sessional_data_false ( ) + self._BUTTONS.add_buttons_of_main_menu_in_text ( ) + + + def _wrong_answer_of_quest_is_selected (self) -> None: + self._OUTPUT_TEXT = get_text_that_says_answer_is_wrong ( ) + self._SESSIONAL_DATA["number_of_wrong_quest_answers"] += 1 + self._BUTTONS.add_buttons (*self._buttons_for_choosing_correct_answer, hide_all = True) + + + def _viewing_quest_results (self) -> None: + if self._has_one_word_in_text_in_lower ("продолжить"): + self._SESSIONAL_DATA["state"] = "choosing_right_answer_for_quest" + current_difficulty_level = self._SESSIONAL_DATA["difficulty_level_of_quest"] + self._save_text_and_correct_answer_of_quest_in_session_data (current_difficulty_level) + self._OUTPUT_TEXT = self._get_text_of_current_quest ( ) + self._BUTTONS.add_buttons (*self._buttons_for_choosing_correct_answer, hide_all = True) + + elif self._user_wants_to_go_to_main_menu: + self._go_to_main_menu ( ) + + elif self._user_wants_to_end_session: + self._end_the_session ( ) + + else: + self._OUTPUT_TEXT = get_apology_text ( ) + self._BUTTONS.add_buttons ("Продолжить квест", "На главное меню", "Пока", hide_all = True) + + + def _sending_report (self) -> None: + # Доработать # FIXME + self._BUTTONS.add_buttons ("На главное меню", "Пока!", hide_all = True) + if self._user_wants_to_go_to_main_menu: + self._go_to_main_menu ( ) + elif self._user_wants_to_end_session: + self._end_the_session ( ) + else: + self._OUTPUT_TEXT = get_apology_text ( ) + + + def _consulting (self) -> None: + # Доработать # FIXME + self._BUTTONS.add_buttons ("На главное меню", "Пока!", hide_all = True) + if self._user_wants_to_go_to_main_menu: + self._go_to_main_menu ( ) + elif self._user_wants_to_end_session: + self._end_the_session ( ) + else: + self._OUTPUT_TEXT = get_apology_text ( ) + + + def _has_all_words_in_text_in_lower (self, *words) -> bool: + """Есть ли все слова в ответе пользователя?""" + for word in words: + if not word in self._WORDS_OF_TEXT_IN_LOWER: + return False + return True + + def _has_one_word_in_text_in_lower (self, *words) -> bool: + """Есть ли хоть одно слово в ответе пользователя?""" + for word in words: + if word in self._WORDS_OF_TEXT_IN_LOWER: + return True + return False + + + def _go_to_main_menu (self) -> None: + self._OUTPUT_TEXT = get_text_that_says_user_is_just_in_main_menu ( ) + self._TEXT_TO_SPEECH = get_text_that_says_user_is_just_in_main_menu ( ) + self._TEXT_TO_SPEECH += get_main_commands_of_skill ( ) + self._SESSIONAL_DATA["state"] = "in_main_menu" + self._BUTTONS.add_buttons_of_main_menu_in_text ( ) + + + def _end_the_session (self) -> None: + self._OUTPUT_TEXT = get_farewell_text ( ) + self._IS_END_SESSION = True + + + def get_response (self) -> dict: + return { + "version": self._VERSION, + "response": { + "text": self._OUTPUT_TEXT, + "tts": self._TEXT_TO_SPEECH, + "end_session": self._IS_END_SESSION, + "buttons": self._BUTTONS.BUTTONS}, + "session_state": self._SESSIONAL_DATA, + "user_state_update": self._INTERSESSIONAL_DATA + } + # Даже если self._TEXT_TO_SPEECH ничего не содержит (""), + # то будет сказан текст, который написан в поле ["response"]["text"] + + + +# Функция, вызываемая Яндексом для запуска скрипта Алисы (в коде вызывать её не нужно). +def main (request_from_alisa: dict, context) -> dict: + handler_of_alisa = HandlerOfAlisa (request_from_alisa) + return handler_of_alisa.get_response ( ) \ No newline at end of file diff --git a/quest_getter.py b/quest_getter.py index 703fa17..94ff83e 100644 --- a/quest_getter.py +++ b/quest_getter.py @@ -2,7 +2,7 @@ import random from typing import Literal -from enums import DifficultyLevelsOfQuest +from enums import DifficultyLevels class QuestGetter: @@ -26,11 +26,11 @@ def _group_quests (self) -> None: self._create_empty_grouped_quests ( ) for key in self.all_quests.keys(): match self.all_quests[key]["difficulty_level"]: - case DifficultyLevelsOfQuest.EASY.value: + case DifficultyLevels.EASY.value: self.easy_quests.append (self.all_quests[key]) - case DifficultyLevelsOfQuest.MEDIUM.value: + case DifficultyLevels.MEDIUM.value: self.medium_quests.append (self.all_quests[key]) - case DifficultyLevelsOfQuest.HARD.value: + case DifficultyLevels.HARD.value: self.hard_quests.append (self.all_quests[key]) case _: raise ValueError ("Указан неверный уровень сложности " + diff --git a/task_getter.py b/task_getter.py new file mode 100644 index 0000000..4812d37 --- /dev/null +++ b/task_getter.py @@ -0,0 +1,53 @@ +import json +import random + +from enums import DifficultyLevels + + +class TaskGetter: + def __init__ (self): + self._load_all_tasks_from_file ( ) + self._create_groups ( ) + self._group_tasks ( ) + + def _load_all_tasks_from_file (self) -> None: + with open (self._name_of_file_with_tasks, "r") as file_with_tasks: + self.all_tasks = json.load (file_with_tasks) + + @property + def _name_of_file_with_tasks (self) -> str: + return "tasks.json" + + def _create_groups (self) -> None: + self.easy_tasks = [ ] + self.medium_tasks = [ ] + self.hard_tasks = [ ] + self.very_hard_tasks = [ ] + + def _group_tasks (self) -> None: + for task_number in self.all_tasks.keys(): + task = self.all_tasks[task_number] + match task["difficulty"]: + case DifficultyLevels.EASY.value: + self.easy_tasks.append (task) + case DifficultyLevels.MEDIUM.value: + self.medium_tasks.append (task) + case DifficultyLevels.HARD.value: + self.hard_tasks.append (task) + case DifficultyLevels.VERY_HARD.value: + self.very_hard_tasks.append (task) + case _: + raise ValueError (f"Неправильно задана сложность квеста №{task_number}!") + + + def get_random_easy_task (self) -> dict[str, str]: + return random.choice (self.easy_tasks) + + def get_random_medium_task (self) -> dict[str, str]: + return random.choice (self.medium_tasks) + + def get_random_hard_task (self) -> dict[str, str]: + return random.choice (self.hard_tasks) + + def get_random_very_hard_task (self) -> dict[str, str]: + return random.choice (self.very_hard_tasks) \ No newline at end of file diff --git a/tasks.json b/tasks.json new file mode 100644 index 0000000..c54c0e3 --- /dev/null +++ b/tasks.json @@ -0,0 +1,97 @@ +{ + "1": { + "title": "Умножение чисел.", + "task_text": "Напишите программу, которая принимает на вход два числа и выводит их произведение.", + "solve": "Запросим у пользователя два числа c помощью 'input()'. Затем умножим два полученных числа и выведем результат на экран через 'print()'.", + "code": "num1 = float(input()) \n num2 = float(input()) \n print(num1 * num2)", + "difficulty": 0 + }, + + "2": { + "title": "Инверсия.", + "task_text": "Реализуйте функцию, которая принимает на вход строку и возвращает ее в обратном порядке.", + "solve": "Функция `reverse_string()` принимает один аргумент - `s`, который является строкой. Для разворота строки мы используем срезы с отрицательным шагом. Срез `[::-1]` означает, что мы берем все символы строки от конца к началу с шагом -1, то есть в обратном порядке.", + "code": "def reverse_string(s):\n return s[::-1]", + "difficulty": 0 + }, + + "3": { + "title": "Пересечение.", + "task_text": "Напишите функцию, которая принимает на вход два списка чисел и возвращает список, содержащий только числа, которые есть в обоих списках.", + "solve": "Функция `common_elements()` принимает два аргумента - `list1` и `list2`, которые являются списками чисел. Сначала функция преобразует списки во множества с помощью встроенной функции `set()`. Затем функция находит пересечение множеств с помощью метода `intersection()`. Наконец, функция преобразует множество обратно в список с помощью встроенной функции `list()` и возвращает его.", + "code": "def common_elements(list1, list2): \n set1 = set(list1) \n set2 = set(list2) \n result = set1.intersection(set2) \n return list(result)", + "difficulty": 0 + }, + + "4": { + "title": "Подсчёт букв.", + "task_text": "Создайте программу, которая просит пользователя ввести слово и затем выводит количество гласных букв в этом слове.", + "solve": "Код начинается с запроса на ввод слова от пользователя с помощью `input()`. Затем мы создаем список гласных букв и инициализируем переменную `count` для подсчета гласных букв. Далее, мы перебираем каждую букву в слове с помощью цикла `for`, проверяем, является ли буква гласной, и если да, увеличиваем счетчик `count`.", + "code": "word = input() \nvowels = ['a', 'e', 'i', 'o', 'u'] \ncount = 0 \n for letter in word: \n if letter.lower() in vowels: \n count += 1 \n print('Количество гласных букв в слове', word, ':',count)", + "difficulty": 0 + }, + + "5": { + "title": "Строки.", + "task_text": "Напишите программу, которая принимает на вход две строки и возвращает последнее слово в каждой из них.", + "solve": "Функция `last_words()` принимает два аргумента - `s1` и `s2`, которые являются строками. Для нахождения последнего слова в каждой строке мы используем метод `split()`, который разбивает строку на слова. Затем мы берем последнее слово в списке слов с помощью индекса `-1`. Возвращается список с последними словами.", + "code": "def last_words(s1, s2): \n last_word1 = s1.split()[-1] \n last_word2 = s2.split()[-1] \n return [last_word1, last_word2]", + "difficulty": 0 + }, + + "6": { + "title": "Среднее арифметическое.", + "task_text": "Реализуйте функцию, которая принимает на вход список чисел и возвращает среднее значение этого списка.", + "solve": "Функция `average()` принимает один аргумент - `numbers`, который является списком чисел. Для вычисления среднего значения мы сначала вычисляем сумму всех чисел в списке с помощью встроенной функции `sum()`, а затем количество чисел в списке с помощью встроенной функции `len()`. Затем мы вычисляем среднее значение, которое равно сумме чисел, деленной на количество чисел. Наконец, мы возвращаем среднее значение с помощью ключевого слова `return`.", + "code": "def average(numbers): \n return sum(numbers) / len(numbers)", + "difficulty": 0 + }, + + "7": { + "title": "Числа Фибоначчи.", + "task_text": "Напишите программу, которая просит пользователя ввести число N и затем выводит первые N чисел Фибоначчи.", + "solve": "Сначала мы запрашивает у пользователя число N с помощью функции `input()`. Далее инициализирует переменные `a` и `b`, которые будут использоваться для вычисления чисел Фибоначчи. Затем использует цикл `for` для вычисления и вывода первых N чисел Фибоначчи. В каждой итерации цикла программа выводит текущее число Фибоначчи и обновляет значения переменных `a` и `b` для вычисления следующего числа Фибоначчи. Наконец, выводим последовательность чисел Фибоначчи на экран.", + "code": "n = int(input()) \na, b = 0, 1 \n for i in range(n): \n print(a, end=' ') \n a, b = b, a + b", + "difficulty": 0 + }, + + "8": { + "title": "Илон Шмаск и список.", + "task_text": "Напишите программу для Илона Шмаска с созданием списка чисел от 1 до 10 включительно.", + "solve": "Мы создаем при помощи генератора список чисел от 0 до 10 включительно. Затем мы выводим список на экран с помощью функции `print()`.", + "code": "\nprint('Добро пожаловать в компанию SpaceY!') \nprint([i for i in range(11)])", + "difficulty": 1 + }, + + "9": { + "title": "Билл Герц и генератор паролей.", + "task_text": "Напишите программу для Билла Герца с генерацией случайного пароля длиной 8 символов, содержащего только буквы латинского алфавита (в верхнем и нижнем регистре) и цифры.", + "solve": "Мы импортируем модули `random` и `string`, чтобы использовать функции для генерации случайных чисел и создания списка символов, которые могут входить в пароль. Затем мы создаем пустую строку `password` и используем цикл `for` для генерации случайного пароля длиной 8 символов. В каждой итерации цикла мы добавляем случайный символ из списка `characters` к строке `password` с помощью метода `random.choice()`. Наконец, мы выводим пароль на экран с помощью функции `print()`.", + "code": "import random, string \ncharacters = string.ascii_letters + string.digits \npassword = '' \nfor i in range(8): \n password += random.choice(characters \nprint(password)", + "difficulty": 2 + }, + + "10": { + "title": "День недели.", + "task_text": "Напишите программу, которая запрашивает у пользователя день недели (например, 'понедельник') и выводит сообщение 'Сегодня <день недели>', где <день недели> - введенный пользователем день недели.", + "solve": "Мы запрашиваем у пользователя день недели с помощью функции `input()` и сохраняем его в переменную `day`. Наконец, мы выводим сообщение с указанием введенного дня недели, используя форматирование строк с помощью f-строк.", + "code": "day = input('Введите день недели: ') \nprint(f'Сегодня {day}') \n", + "difficulty": 0 + }, + + "11": { + "title": "Cумма чисел до 10.", + "task_text": "Напишите программу для нахождения суммы всех чисел от 1 до 10 включительно.", + "solve": "Применим в решении генератор для чисел от 0 до 10 включительно. При помощи функции `sum` получим их сумму и выведем ее на экран при помощи `print`.", + "code": "print(sum([i for i in range(11)]))", + "difficulty": 1 + }, + + "12": { + "title": "Угадай-ка.", + "task_text": "Напишите программу, которая загадывает случайное число от 1 до 10 и просит пользователя угадать это число. Если пользователь угадал число, выводится сообщение 'Поздравляю, вы победили!'. Если нет, выводится сообщение 'К сожалению, вы проиграли. Загаданное число было <число>'.", + "solve": "Мы используем модуль `random`, чтобы загадать случайное число от 1 до 10. Затем мы просим пользователя ввести число и проверяем, угадал ли он загаданное число. Если пользователь угадал число, то выводится сообщение об победе, иначе программа выводит сообщение о проигрыше.", + "code": "import random \n number = random.randint(1, 10) \nguess = input('Введите число от 1 до 10: ') \nif int(guess) == number: \n print('Поздравляю, вы победили!') \nelse: \n print(f'К сожалению, вы проиграли. Загаданное число было {number}.')", + "difficulty": 1 + } +} \ No newline at end of file diff --git a/texts_for_users.json b/texts_for_users.json index 08ba7ee..4492fd7 100644 --- a/texts_for_users.json +++ b/texts_for_users.json @@ -23,13 +23,11 @@ ], "main_commands_of_skill": [ "Курс", - "Перейди на урок", "Задачка", "Квест", "Оцени мои знания", "Консультант по Python", - "Отправить отчёт", - "Пока" + "Отправить отчёт" ], "you_stopped_at_lesson": [ "Что ж, вы остановились на уроке №", @@ -45,20 +43,20 @@ "Ваша последняя задачка - №" ], "something_is_unclear": [ - "Извините, я вас не понял.", - "Простите, я вас не понял.", - "Извините, не понял вас.", - "Простите, не понял вас.", + "Извините, я вас не поняла.", + "Простите, я вас не поняла.", + "Извините, не поняла вас.", + "Простите, не поняла вас.", "Извините, не могу разобрать.", "Простите, не могу разобрать.", "Извините, я не могу разобрать.", "Простите, я не могу разобрать.", - "Извините, не разобрал.", - "Простите, не разобрал.", - "Извините, не понял, что вы имеете в виду.", - "Простите, не понял, что вы имеете в виду.", - "Извините, я не понял, что вы имеете в виду.", - "Простите, я не понял, что вы имеете в виду." + "Извините, не разобрала.", + "Простите, не разобрала.", + "Извините, не поняла, что вы имеете в виду.", + "Простите, не поняла, что вы имеете в виду.", + "Извините, я не поняла, что вы имеете в виду.", + "Простите, я не поняла, что вы имеете в виду." ], "correct_answer": [ "Ура! Ты ответил правильно!", diff --git a/useful_functions.py b/useful_functions.py index 3d9c8b6..e8cefa2 100644 --- a/useful_functions.py +++ b/useful_functions.py @@ -3,21 +3,24 @@ def create_sessional_data (sessional_data: dict) -> dict: if sessional_data == { }: # То есть это первое сообщение - return {"working_with_course": False, - "working_with_quest": False, - "choosing_right_answer_for_quest": False, - "choosing_between_repeating_and_changing_difficulty_level": False, + return { + "state": "in_main_menu", "text_of_quest": "", "correct_answer_of_quest": 0, - "difficulty_level": 0, + "difficulty_level_of_quest": 0, "number_of_correct_quest_answers": 0, "number_of_wrong_quest_answers": 0, - "viewing_quest_results": False, - "was_said_that_user_can_change_difficulty_level": False, - "working_with_tasks": False, - "sending_report": False, - "consulting": False + "was_said_that_user_can_change_difficulty_level_in_quest": False, + + "title_of_task": "", + "text_of_task": "", + "difficulty_level_of_task": 0, + "solve_of_task": "", + "code_of_task": "" } + # Все состояния: in_main_menu, working_with_course, choosing_course_theme, start_next_lesson_or_not, + # working_with_quest, choosing_right_answer_for_quest, choosing_between_repeating_and_changing_difficulty_level, + # viewing_quest_results, working_with_tasks, sending_report, consulting. else: # Значит, сообщение уже не первое return sessional_data @@ -26,8 +29,8 @@ def create_intersessional_data (intersessional_data: dict) -> dict: if not "new_user" in intersessional_data.keys() or intersessional_data["new_user"]: return { "new_user": True, - "last_lesson": 0, - "last_task": 0 + "current_lesson": "", + "current_sublesson": "" } else: return intersessional_data From f50ef610a955e405ac742ac94eaa1a63cf1317ae Mon Sep 17 00:00:00 2001 From: Alexonys1 <107358560+Alexonys1@users.noreply.github.com> Date: Sat, 25 Mar 2023 17:33:27 +0300 Subject: [PATCH 09/31] =?UTF-8?q?=D0=9A=D0=BE=D0=B5-=D1=87=D1=82=D0=BE=20?= =?UTF-8?q?=D0=BF=D0=B5=D1=80=D0=B5=D0=B4=D0=B5=D0=BB=D0=B0=D0=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- main3.py | 44 +++++++++++--------------------------------- 1 file changed, 11 insertions(+), 33 deletions(-) diff --git a/main3.py b/main3.py index 797902c..93a02ee 100644 --- a/main3.py +++ b/main3.py @@ -406,43 +406,22 @@ def _working_with_quest (self) -> None: "лёгкий", "лёгкого", "лёгкому", "лёгким", "лёгком", "легкий", "легкого", "легкому", "легким", "легком"): self._SESSIONAL_DATA["difficulty_level_of_quest"] = DifficultyLevels.EASY.value - self._SESSIONAL_DATA["state"] = "choosing_right_answer_for_quest" self._save_text_and_correct_answer_of_easy_quest_in_session_data ( ) - well = random.choice (("Хорошо.", "Отлично.", "Прекрасно.")) + "\n\n" - self._OUTPUT_TEXT = well - self._TEXT_TO_SPEECH = well - self._say_that_user_can_change_their_difficulty_level_of_quest_if_it_is_not_said_yet ( ) - self._OUTPUT_TEXT += self._get_text_of_current_quest ( ) - self._TEXT_TO_SPEECH += self._get_text_of_current_quest ( ) - self._BUTTONS.add_buttons (*self._buttons_for_choosing_correct_answer, hide_all = True) + self._show_quest ( ) elif self._has_one_word_in_text_in_lower ( "средний", "среднего", "среднему", "среднем", "средняя", "средней", "среднюю"): self._SESSIONAL_DATA["difficulty_level_of_quest"] = DifficultyLevels.MEDIUM.value - self._SESSIONAL_DATA["state"] = "choosing_right_answer_for_quest" self._save_text_and_correct_answer_of_medium_quest_in_session_data ( ) - well = random.choice (("Хорошо.", "Отлично.", "Прекрасно.")) + "\n\n" - self._OUTPUT_TEXT = well - self._TEXT_TO_SPEECH = well - self._say_that_user_can_change_their_difficulty_level_of_quest_if_it_is_not_said_yet ( ) - self._OUTPUT_TEXT += self._get_text_of_current_quest ( ) - self._TEXT_TO_SPEECH += self._get_text_of_current_quest ( ) - self._BUTTONS.add_buttons (*self._buttons_for_choosing_correct_answer, hide_all = True) + self._show_quest ( ) elif self._has_one_word_in_text_in_lower ( "высокий", "высокого", "высокому", "высоким", "высоком", "сложный", "сложного", "сложному", "сложным", "сложном"): self._SESSIONAL_DATA["difficulty_level_of_quest"] = DifficultyLevels.HARD.value - self._SESSIONAL_DATA["state"] = "choosing_right_answer_for_quest" self._save_text_and_correct_answer_of_hard_quest_in_session_data ( ) - well = random.choice (("Хорошо.", "Отлично.", "Прекрасно.")) + "\n\n" - self._OUTPUT_TEXT = well - self._TEXT_TO_SPEECH = well - self._say_that_user_can_change_their_difficulty_level_of_quest_if_it_is_not_said_yet ( ) - self._OUTPUT_TEXT += self._get_text_of_current_quest ( ) - self._TEXT_TO_SPEECH += self._get_text_of_current_quest ( ) - self._BUTTONS.add_buttons (*self._buttons_for_choosing_correct_answer, hide_all = True) + self._show_quest ( ) elif self._has_one_word_in_text_in_lower ( "случайный", "случайного", "случайному", "случайным", "случайном", @@ -452,15 +431,8 @@ def _working_with_quest (self) -> None: "рандомная", "рандомной", "рандомную"): difficulty_level = DifficultyLevels.get_random_difficulty_level_for_quest ( ) self._SESSIONAL_DATA["difficulty_level_of_quest"] = difficulty_level - self._SESSIONAL_DATA["state"] = "choosing_right_answer_for_quest" self._save_text_and_correct_answer_of_quest_in_session_data (difficulty_level) - well = random.choice (("Хорошо.", "Отлично.", "Прекрасно.")) + "\n\n" - self._OUTPUT_TEXT = well - self._TEXT_TO_SPEECH = well - self._say_that_user_can_change_their_difficulty_level_of_quest_if_it_is_not_said_yet ( ) - self._OUTPUT_TEXT += self._get_text_of_current_quest ( ) - self._TEXT_TO_SPEECH += self._get_text_of_current_quest ( ) - self._BUTTONS.add_buttons (*self._buttons_for_choosing_correct_answer, hide_all = True) + self._show_quest ( ) elif self._has_one_word_in_text_in_lower ("результат", "результаты"): self._show_results_of_quest_and_next_quest ( ) @@ -520,7 +492,6 @@ def _say_that_user_can_change_their_difficulty_level_of_quest_if_it_is_not_said_ "Вот квест.\n\n" ] self._OUTPUT_TEXT += "".join (text) - self._TEXT_TO_SPEECH += "".join (text) self._SESSIONAL_DATA["was_said_that_user_can_change_difficulty_level_in_quest"] = True def _get_text_of_current_quest (self) -> str: @@ -530,6 +501,13 @@ def _get_text_of_current_quest (self) -> str: def _buttons_for_choosing_correct_answer (self) -> dict: return "Первое", "Второе", "Третье", "Изменить уровень сложности", "Узнать мои результаты", "На главное меню", "Пока!" + def _show_quest (self) -> None: + self._SESSIONAL_DATA["state"] = "choosing_right_answer_for_quest" + self._OUTPUT_TEXT = random.choice (("Хорошо.", "Отлично.", "Прекрасно.")) + "\n\n" + self._say_that_user_can_change_their_difficulty_level_of_quest_if_it_is_not_said_yet ( ) + self._OUTPUT_TEXT += self._get_text_of_current_quest ( ) + self._BUTTONS.add_buttons (*self._buttons_for_choosing_correct_answer, hide_all = True) + def _choosing_right_answer_for_quest (self) -> None: if self._has_one_word_in_text_in_lower ("1", "один", "первый", "первое"): From d8f4037f2932b2e8f6ca00bf2f8636fb5c120fd8 Mon Sep 17 00:00:00 2001 From: TchTech <67865526+TchTech@users.noreply.github.com> Date: Sat, 25 Mar 2023 19:35:54 +0300 Subject: [PATCH 10/31] add tasks --- lessons.json | 203 +++++++++++++++++++++++++++--------- tasks.json | 288 ++++++++++++++++++++++++++++++++++----------------- 2 files changed, 344 insertions(+), 147 deletions(-) diff --git a/lessons.json b/lessons.json index 03df09d..2fdc72e 100644 --- a/lessons.json +++ b/lessons.json @@ -1,59 +1,162 @@ + { - "Урок 1: Введение в Python.": { - "Предисловие": "Python – простой и минималистичный язык.\nЧтение хорошей программы на Python очень напоминает чтение английского текста, хотя и достаточно строгого! Такая псевдо-кодовая природа Python является одной из его самых сильных сторон. Она позволяет вам сосредоточиться на решении задачи, а не на самом языке.", - "Python - это... Часть I": "Python - Язык высокого уровня.\nПри написании программы на Python вам никогда не придётся отвлекаться на такие низкоуровневые детали, как управление памятью, используемой вашей программой, и т.п.", - "Python - это... Часть II": "Python - Язык объектно-ориентированный.\nPython поддерживает как процедурно-ориентированное, так и объектноориентированное программирование. В процедурно-ориентированных языках программы строятся на основе процедур или функций, которые представляют собой просто-напросто многократно используемые фрагменты программы. В объектно-ориентированных языках программирования программы строятся на основе объектов, объединяющих в себе данные и функционал. \n\n__Python предоставляет простые, но мощные средства для ООП, особенно в сравнении с такими большими языками программирования, как C++ или Java.__" , - "Python - это... Часть III": "Python - Язык встраиваемый.\nВ Python можно встраивать в программы на C/C++, чтобы предоставлять возможности написания сценариев их пользователям." + "Урок 0: Введение в Python": { + "0": "**Предисловие** \n\nPython – простой и минималистичный язык. Чтение хорошей программы на Python очень напоминает чтение английского текста, хотя и достаточно строгого! Такая псевдо-кодовая природа Python является одной из его самых сильных сторон. Она позволяет вам сосредоточиться на решении задачи, а не на самом языке.", + "1": "**Python - Язык высокого уровня** \n\nПри написании программы на Python вам никогда не придётся отвлекаться на такие низкоуровневые детали, как управление памятью, используемой вашей программой, и т.п.", + "2": "Python - Язык объектно-ориентированный \n\nPython поддерживает как процедурно-ориентированное, так и объектноориентированное программирование. В процедурно-ориентированных языках программы строятся на основе процедур или функций, которые представляют собой просто-напросто многократно используемые фрагменты программы. В объектно-ориентированных языках программирования программы строятся на основе объектов, объединяющих в себе данные и функционал. \n\n__Python предоставляет простые, но мощные средства для ООП, особенно в сравнении с такими большими языками программирования, как C++ или Java.__" , + "3": "Python - Язык встраиваемый \n\nВ Python можно встраивать в программы на C/C++, чтобы предоставлять возможности написания сценариев их пользователям." }, - - "Урок 2: Установка Python.": { - "Предисловие": "Итак для того чтобы нам начать писать код нужно установть сам Python, а так же редактор для него ", - "Установка в Windows": "Посетите страницу http://www.python.org/download и загрузите последнюю версию. Установка производится так же, как и для любых других программ для Windows.", - "Выбор редактора": "Поскольку мы не можем набирать программу в командной строке интерпретатора каждый раз, когда нам нужно что-то запустить, нам понадобится сохранять программы в файлах, чтобы потом иметь возможность запускать их сколько угодно раз. \n\nПрежде чем приступить к написанию программ на Python в файлах, нам нужен редактор для работы с файлами программ. Выбор редактора крайне важен. Подходить к выбору редактора следует так же, как и к выбору личного автомобиля. Хороший редактор поможет вам легко писать программы на Python, делая ваше путешествие более комфортным, а также позволяя быстрее и безопаснее достичь вашей цели. \n\nОдно из самых основных требований – это __подсветка синтаксиса__, когда разные элементы программы на Python раскрашены так, чтобы вы могли легко видеть вашу программу и ход её выполнения. \n\nЕсли вы не знаете, с чего начать, мы бы порекомендовали вам пользоваться программой PyCharm", - "Создание проекта": "Запустите выбранный вами редактор, введите следующую программу и сохраните её под именем helloworld.py . \n\nЕсли вы пользуетесь PyCharm, нажмите «New Project» → «выберете путь где будут хранится ваши программы» → «создавайте проект!»" + "Урок 1: Установка Python": { + "0": "**Предисловие** \n\nИтак для того чтобы нам начать писать код нужно установть сам Python, а так же редактор для него ", + "1": "**Установка в Windows** \n\nПосетите страницу http://www.python.org/download/ и загрузите последнюю версию. Установка производится так же, как и для любых других программ для Windows.", + "2": "**Выбор редактора** \n\nПоскольку мы не можем набирать программу в командной т.к, нам понадобится сохранять программы в файлах. \n\nИтак нам нужен редактор для работы с файлами программ. Выбор редактора крайне важен. Хороший редактор поможет вам легко писать программы на Python, делая ваше путешествие более комфортным, а также позволяя быстрее и безопаснее достичь вашей цели. \n\nОдно из самых основных требований – это __подсветка синтаксиса__, когда разные элементы программы на Python раскрашены так, чтобы вы могли легко видеть вашу программу и ход её выполнения. \n\nЕсли вы не знаете, с чего начать, мы бы порекомендовали вам пользоваться программой PyCharm", + "3": "**Создание проекта** \n\nЗапустите выбранный вами редактор, введите следующую программу и сохраните её под именем helloworld.py . \n\nЕсли вы пользуетесь PyCharm, нажмите «New Project» → «выберете путь где будут хранится ваши программы» → «создавайте проект!»" }, + "Урок 2: Основы": { + "0": "**Предисловие** \n\nPython – это, один из немногих языков программирования, простых в освоении и одновременно мощных. \n\nЭто очень важно и для начинающих, и для специалистов, но что ещё важнее – на нём приятно программировать.", + "1": "**Комментарии** \n\nКомментарии – это то, что пишется после символа #, и представляет интерес лишь как заметка для читающего программу. \n\nНапример: \nprint(Привет, Мир!) # print -- это функция", + "2": "**Строка** \n\nСтрока – это последовательность символов. Чаще всего строки – это просто некоторые наборы слов. \n\nСлова могут быть как на английском языке, так и на любом другом, поддерживаемом стандартом Unicode, что означает почти на любом языке мира.", + "3": "**Одинарные кавычки** \n\nСтроку можно указать, используя одинарные кавычки, как например, 'Фраза в кавычках'. Все пробелы и знаки табуляции сохранятся, как есть.", + "4": "**Двойные кавычки** \n\nСтроки в двойных кавычках работают точно так же, как и в одинарных. Например,\"Как тебя зовут?\".", + "5": "**Типы данных** \n\nПеременные могут хранить значения разных типов, называемых типами данных. Основными типами являются числа и строки, о которых мы уже говорили. В дальнейших главах мы увидим, как создавать свои собственные типы при помощи классов.", + "6": "**Переменные** \n\nИспользование одних лишь литеральных констант может скоро наскучить – нам ведь нужен способ хранения любой информации и манипулирования ею. Вот здесь на сцену выходят переменные. Слово «переменные» говорит само за себя – их значение может меняться, а значит, вы можете хранить в переменной всё, что угодно. \n\nПеременные – это просто области памяти компьютера, в которых вы храните некоторую информацию. В отличие от констант, к такой информации нужно каким-то образом получать доступ, поэтому переменным даются имена." - "Урок 3: Основы.": { - "Предисловие": "Python – это, один из немногих языков программирования, простых в освоении и одновременно мощных. \n\nЭто очень важно и для начинающих, и для специалистов, но что ещё важнее – на нём приятно программировать.", - "Комментарии": "Комментарии – это то, что пишется после символа #, и представляет интерес лишь как заметка для читающего программу. \n\nНапример: \nprint(Привет, Мир!) # print -- это функция", - "Строка": "Строка – это последовательность символов. Чаще всего строки – это просто некоторые наборы слов. \n\nСлова могут быть как на английском языке, так и на любом другом, поддерживаемом стандартом Unicode, что означает почти на любом языке мира.", - "Одинарные кавычки": "Строку можно указать, используя одинарные кавычки, как например, 'Фраза в кавычках'. Все пробелы и знаки табуляции сохранятся, как есть.", - "Двойные кавычки": "Строки в двойных кавычках работают точно так же, как и в одинарных. Например,\"Как тебя зовут?\".", - "Типы данных": "Переменные могут хранить значения разных типов, называемых типами данных. Основными типами являются числа и строки, о которых мы уже говорили. В дальнейших главах мы увидим, как создавать свои собственные типы при помощи классов.", - "Переменные": "Использование одних лишь литеральных констант может скоро наскучить – нам ведь нужен способ хранения любой информации и манипулирования ею. Вот здесь на сцену выходят переменные. Слово «переменные» говорит само за себя – их значение может меняться, а значит, вы можете хранить в переменной всё, что угодно. \n\nПеременные – это просто области памяти компьютера, в которых вы храните некоторую информацию. В отличие от констант, к такой информации нужно каким-то образом получать доступ, поэтому переменным даются имена." }, - - "Урок 4: Операторы и выражения.": { - "Предисловие": "Большинство предложений (логических строк) в программах содержат выражения. Простой пример выражения: 2 + 3. Выражение можно разделить на операторы и операнды. Операторы – это некий функционал, производящий какие-либо действия, который может быть представлен в виде символов, как например +, или специальных зарезервированных слов. Операторы могут производить некоторые действия над данными, и эти данные называются операндами. В нашем случае 2 и 3 – это операнды.", - "Оператор сложения": "Объяснение: суммирует два объекта. \n\nПример: 3 + 5 даст 8; 'a' + 'b' даст 'ab'", - "Оператор вычитания": "Объяснение: Даёт разность двух чисел; если первый операнд отсутствует, он считается равным нулю. \n\nПример: -5.2 даст отрицательное число, а 50 - 24 даст 26.", - "Оператор умножения": "Объяснение: Даёт произведение двух чисел или возвращает строку, повторённую заданное число раз. \n\nПример: 2 * 3 даст 6. 'la' * 3 даст 'lalala'", - "Оператор деления": "Объяснение: Возвращает частное от деления x на y. \n\nПример: 4 / 2 даст 2", - "Оператор меньше": "Объяснение: Определяет, верно ли, что x меньше y. Все операторы сравнения возвращают True или False. Обратите внимание на заглавные буквы в этих словах. \n\nПример: 5 < 3 даст False", - "Оператор больше": "Объяснение: Определяет, верно ли, что x больше y. \n\nПример: 5 > 3 даст True", - "Оператор равенства": "Объяснение: Проверяет,одинаковы ли объекты. \n\nПример: x = 2; y = 2; x == y даёт True", - "Оператор неравенства": "Объяснение: Проверяет, верно ли, что объекты не равны. \n\nПример: x = 2; y = 3; x != y даёт True", - "Оператор логического НЕ": "Объяснение: Если x равно True, оператор вернёт False. Если же x равно False, получим True. \n\nПример: x = True; not x даёт False", - "Оператор логического И": "Объяснение: x and y даёт False, если x равно False , в противном случае возвращает значение y. \n\nПример: x = False; y = True; x and y возвращает False, поскольку x равно False", - "Оператор логического ИЛИ": "Объяснение: Если x равно True, в результате получим True, в противном случае получим значение y. \n\nПример: x = True; y = False; x or y даёт True" + "Урок 3:Операторы и выражения": { + "0": "**Предисловие** \n\nБольшинство предложений (логических строк) в программах содержат выражения. Простой пример выражения: 2 + 3. Выражение можно разделить на операторы и операнды. Операторы – это некий функционал, производящий какие-либо действия, который может быть представлен в виде символов, как например +, или специальных зарезервированных слов. Операторы могут производить некоторые действия над данными, и эти данные называются операндами. В нашем случае 2 и 3 – это операнды.", + "1": "**Оператор сложение** \"+\" \n\nОбъяснение: суммирует два объекта. \n\nПример: 3 + 5 даст 8; 'a' + 'b' даст 'ab'", + "2": "**Оператор вычитание** \"-\" \n\nОбъяснение: Даёт разность двух чисел; если первый операнд отсутствует, он считается равным нулю. \n\nПример: -5.2 даст отрицательное число, а 50 - 24 даст 26.", + "3": "**Оператор умножение** \"*\" \n\nОбъяснение: Даёт произведение двух чисел или возвращает строку, повторённую заданное число раз. \n\nПример: 2 * 3 даст 6. 'la' * 3 даст 'lalala'", + "4": "**Оператор деление** \"/\" \n\nОбъяснение: Возвращает частное от деления x на y. \n\nПример: 4 / 2 даст 2", + "5": "**Оператор меньше** \"<\" \n\nОбъяснение: Определяет, верно ли, что x меньше y. Все операторы сравнения возвращают True или False. Обратите внимание на заглавные буквы в этих словах. \n\nПример: 5 < 3 даст False", + "6": "**Оператор больше** \">\" \n\nОбъяснение: Определяет, верно ли, что x больше y. \n\nПример: 5 > 3 даст True", + "7": "**Оператор равно** \"==\" \n\nОбъяснение: Проверяет,одинаковы ли объекты. \n\nПример: x = 2; y = 2; x == y даёт True", + "8": "**Оператор не равно** \"!=\" \n\nОбъяснение: Проверяет, верно ли, что объекты не равны. \n\nПример: x = 2; y = 3; x != y даёт True", + "9": "**Оператор логическое НЕ** \"not\" \n\nОбъяснение: Если x равно True, оператор вернёт False. Если же x равно False, получим True. \n\nПример: x = True; not x даёт False", + "10": "**Оператор логическое И** \"and\" \n\nОбъяснение: x and y даёт False, если x равно False , в противном случае возвращает значение y. \n\nПример: x = False; y = True; x and y возвращает False, поскольку x равно False", + "11": "**Оператор логическое ИЛИ** \"or\" \n\nОбъяснение: Если x равно True, в результате получим True, в противном случае получим значение y. \n\nПример: x = True; y = False; x or y даёт True" + }, + "Урок 4: Поток команд": { + "0": "**Предисловие** \n\nВ программах, которые мы до сих пор рассматривали, последовательность команд всегда выполнялась Python по порядку строго сверху вниз. А что, если нам необходимо изменить поток выполняющихся команд? Например, если требуется, чтобы программа принимала некоторое решение и выполняла различные действия в зависимости от ситуации; скажем, печатала «Доброе утро» или «Добрый вечер» в зависимости от времени суток. \n\nКак вы уже, наверное, догадались, этого можно достичь при помощи операторов управления потоком. В Python есть три оператора управления потоком: if, for и while.", + "1": "**Оператор if** \n\nОператор if используется для проверки условий: если условие верно, выполняется блок выражений (называемый «if-блок»), иначе выполняется другой блок выражений (называемый «else-блок»). Блок «else» является необязательным.", + "2": "**Пример:** \n\nnumber = 23\nguess = int(input('Введите целое число : '))\n\nif guess == number:\n print('Поздравляю, вы угадали,') # Начало нового блока\n print('(хотя и не выиграли никакого приза!)') # Конец нового блока\nelif guess < number:\n print('Нет, загаданное число немного больше этого.') # Ещё один блок\nelse:\n print('Нет, загаданное число немного меньше этого.')", + "3": "**Оператор while** \n\nОператор while позволяет многократно выполнять блок команд до тех пор, пока выполняется некоторое условие. Это один из так называемых операторов цикла. Он также может иметь необязательный пункт else.", + "4": "**Пример:** \n\nnumber = 23\nrunning = True\n\nwhile running:\n guess = int(input('Введите целое число : '))\n\n if guess == number:\n print('Поздравляю, вы угадали.')\n running = False # это останавливает цикл while\n elif guess < number:\n print('Нет, загаданное число немного больше этого.')\n else:\n print('Нет, загаданное число немного меньше этого.')\nelse:\n print('Цикл while закончен.')", + "5": "**Цикл for** \n\nОператор for..in также является оператором цикла, который осуществляет итерацию по последовательности объектов, т.е. проходит через каждый элемент в последовательности. __Мы узнаем больше о последовательностях в дальнейших главах, а пока просто запомните, что последовательность – это упорядоченный набор элементов.__", + "6": "**Пример:** \n\nfor i in range(1, 5):\n print(i)\nelse:\n print('Цикл for закончен')", + "7": "**Оператор break** \n\nОператор break служит для прерывания цикла, т.е. остановки выполнения команд даже если условие выполнения цикла ещё не приняло значения False или последовательность элементов не закончилась.\n\n__Важно отметить, что если циклы for или while прервать оператором break, соответствующие им блоки else выполняться не будут.__", + "8": "**Пример:** \n\nwhile True:\n s = input('Введите что-нибудь : ')\n if s == 'выход':\n break\n print('Длина строки:', len(s))", + "9": "**Оператор continue** \n\nОператор continue используется для указания Python, что необходимо пропустить все оставшиеся команды в текущем блоке цикла и продолжить со следующей итерации цикла", + "10": "**Пример:** \n\nwhile True:\n s = input('Введите что-нибудь : ')\n if s == 'выход':\n break\n if len(s) < 3:\n print('Слишком мало')\n continue\n print('Введённая строка достаточной длины')" + }, + "Урок 5: Функции": { + "0": "**Предисловие** \n\nФункции – это многократно используемые фрагменты программы. Они позволяют дать имя определённому блоку команд с тем, чтобы впоследствии запускать этот блок по указанному имени в любом месте программы и сколь угодно много раз. Это называется вызовом функции. Мы уже использовали много встроенных функций, как то len и range.\n\nФункции определяются при помощи зарезервированного слова def. После этого слова указывается имя функции, за которым следует пара скобок, в которых можно указать имена некоторых переменных, и заключительное двоеточие в конце строки. Далее следует блок команд, составляющих функцию.", + "1": "**Пример:** \n\ndef sayHello():\n print('Привет, Мир!') # блок, принадлежащий функции\n# Конец функции\n\nsayHello() # вызов функции\nsayHello() # ещё один вызов функции", + "2": "**Как это работает:** \n\nМы определили функцию с именем sayHello, используя описанный выше синтаксис. Эта функция не принимает параметров, поэтому в скобках не объявлены какие-либо переменные. Параметры функции – это некие входные данные, которые мы можем передать функции, чтобы получить соответствующий им результат.", + "3": "**Параметры функций** \n\nФункции могут принимать параметры, т.е. некоторые значения, передаваемые функции для того, чтобы она что-либо сделала с ними. Эти параметры похожи на переменные, за исключением того, что значение этих переменных указывается при вызове функции, и во время работы функции им уже присвоены их значения.\n\nПараметры указываются в скобках при объявлении функции и разделяются запятыми. Аналогично мы передаём значения, когда вызываем функцию. __Обратите внимание на терминологию: имена, указанные в объявлении функции, называются параметрами, тогда как значения, которые вы передаёте в функцию при её вызове, – аргументами.__", + "4": "**Пример:** \n\ndef printMax(a, b):\n if a > b:\n print(a, 'максимально')\n elif a == b:\n print(a, 'равно', b)\n else:\n print(b, 'максимально')\n\nprintMax(3, 4) # прямая передача значений\n\nx = 5\ny = 7\n\nprintMax(x, y) # передача переменных в качестве аргументов", + "5": "**Как это работает:** \n\nЗдесь мы определили функцию с именем printMax, которая использует два параметра с именами a и b. Мы находим наибольшее число с применением простого оператора if..else и выводим это число.\n\nПри первом вызове функции printMax мы напрямую передаём числа в качестве аргументов. Во втором случае мы вызываем функцию с переменными в качестве аргументов. printMax(x, y) назначает значение аргумента x параметру a, а значение аргумента y – параметру b. В обоих случаях функция printMax работает одинаково.", + "6": "**Локальные переменные** \n\nПри объявлении переменных внутри определения функции, они никоим образом не связаны с другими переменными с таким же именем за пределами функции – т.е. имена переменных являются локальными в функции. Это называется областью видимости переменной. Область видимости всех переменных ограничена блоком, в котором они объявлены, начиная с точки объявления имени.", + "7": "**Пример:** \n\nx = 50\n\ndef func(x):\n print('x равен', x\n x = 2\n print('Замена локального x на', x)\n\nfunc(x)\nprint('x по-прежнему', x)", + "8": "**Как это работает:** \n\nПри первом выводе значения, присвоенного имени x, в первой строке функции Python использует значение параметра, объявленного в основном блоке, выше определения функции.\n\nДалее мы назначаем x значение 2. Имя x локально для нашей функции. Поэтому когда мы заменяем значение x в функции, x, объявленный в основном блоке, остаётся незатронутым.\n\nПоследним вызовом функции print мы выводим значение x, указанное в основном блоке, подтверждая таким образом, что оно не изменилось при локальном присваивании значения в ранее вызванной функции.", + "9": "**Зарезервированное слово global** \n\nЧтобы присвоить некоторое значение переменной, определённой на высшем уровне программы необходимо указать глобально. Сделаем это при помощи зарезервированного слова global. Без применения global невозможно присвоить значение переменной, определённой за пределами функции.\n\nИспользование зарезервированного слова global достаточно ясно показывает, что переменная объявлена в самом внешнем блоке.", + "10": "**Пример:** \n\nx = 50\n\ndef func():\n global x\n\n print('x равно', x)\n x = 2\n print('Заменяем глобальное значение x на', x)\n\nfunc()\nprint('Значение x составляет', x)", + "11": "**Как это работает:** \n\nЗарезервированное слово global используется для того, чтобы объявить, что x – это глобальная переменная, а значит, когда мы присваиваем значение имени x внутри функции, это изменение отразится на значении переменной x в основном блоке программы.\n\n__Используя одно зарезервированное слово global, можно объявить сразу несколько переменных: global x, y, z.__", + "12": "**Зарезервированное слово nonlocal**\n\nМы увидели, как получать доступ к переменным в локальной и глобальной области видимости. Есть ещё один тип области видимости, называемый «нелокальной» (nonlocal) областью видимости, который представляет собой нечто среднее между первыми двумя. Нелокальные области видимости встречаются, когда вы определяете функции внутри функций.", + "13": "**Пример:** \n\ndef func_outer():\n x = 2\n print('x равно', x)\n\n def func_inner():\n nonlocal x\n x = 5\n\n func_inner()\n print('Локальное x сменилось на', x)\n\nfunc_outer()", + "14": "**Как это работает:** \n\nКогда мы находимся внутри func_inner, переменная x, определённая в первой строке func_outer находится ни в локальной области видимости (определение переменной не входит в блок func_inner), ни в глобальной области видимости (она также и не в основном блоке программы). Мы объявляем, что хотим использовать именно эту переменную x, следующим образом: nonlocal x.", + "15": "**Значения аргументов по умолчанию** \n\nЗачастую часть параметров функций могут быть необязательными, и для них будут использоваться некоторые заданные значения по умолчанию, если пользователь не укажет собственных. Этого можно достичь с помощью значений аргументов по умолчанию. Их можно указать, добавив к имени параметра в определении функции оператор присваивания (=) с последующим значением.", + "16": "**Пример:** \n\ndef say(message, times = 1):\n print(message * times)\n\nsay('Привет')\nsay('Мир', 5)", + "17": "**Как это работает:** \n\nФункция под именем say используется для вывода на экран строки указанное число раз. Если мы не указываем значения, по умолчанию строка выводится\nодин раз. Мы достигаем этого указанием значения аргумента по умолчанию, равного 1 для параметра times.\n\nПри первом вызове say мы указываем только строку, и функция выводит её один раз. При втором вызове say мы указываем также и аргумент 5, обозначая таким образом, что мы хотим сказать фразу 5 раз.", + "18": "**Ключевые аргументы** \n\nЕсли имеется некоторая функция с большим числом параметров, и при её вызове требуется указать только некоторые из них, значения этих параметров могут задаваться по их имени – это называется ключевые параметры. В этом случае для передачи аргументов функции используется имя (ключ) вместо позиции (как было до сих пор).\n\nЕсть два преимущества такого подхода: во-первых, использование функции становится легче, поскольку нет необходимости отслеживать порядок аргументов; во-вторых, можно задавать значения только некоторым избранным аргументам, при условии, что остальные параметры имеют значения аргумента по умолчанию.", + "19": "**Пример:** \n\ndef func(a, b=5, c=10):\n print('a равно', a, ', b равно', b, ', а c равно', c)\n\nfunc(3, 7)\nfunc(25, c=24)\nfunc(c=50, a=100)", + "20": "**Как это работает:** \n\nФункция с именем func имеет один параметр без значения по умолчанию, за которым следуют два параметра со значениями по умолчанию.\n\nПри первом вызове, func(3, 7), параметр a получает значение 3, параметр b получает значение 7, а c получает своё значение по умолчанию, равное 10.\n\nПри втором вызове func(25, c=24) переменная a получает значение 25 в силу позиции аргумента. После этого параметр c получает значение 24 по имени, т.е. как ключевой параметр. Переменная b получает значение по умолчанию, равное 5.\n\nПри третьем обращении func(c=50, a=100) мы используем ключевые аргументы для всех указанных значений. Обратите внимание на то, что мы указываем значение для параметра c перед значением для a, даже несмотря на то, что в определении функции параметр a указан раньше c.", + "21": "**Переменное число параметров** \n\nИногда бывает нужно определить функцию, способную принимать любое число параметров. Этого можно достичь при помощи звёздочек", + "22": "**Пример:** \n\ndef total(a=5, *numbers, **phonebook):\n print('a', a)\n\n #проход по всем элементам кортежа\n for single_item in numbers:\n print('single_item', single_item)\n\n #проход по всем элементам словаря\n for first_part, second_part in phonebook.items():\n print(first_part,second_part)\n\nprint(total(10,1,2,3,Jack=1123,John=2231,Inge=1560))", + "23": "**Как это работает:** \n\nКогда мы объявляем параметр со звёздочкой (например, *param), все позиционные аргументы начиная с этой позиции и до конца будут собраны в кортеж под именем param.\n\nАналогично, когда мы объявляем параметры с двумя звёздочками (**param), все ключевые аргументы начиная с этой позиции и до конца будут собраны в словарь под именем param.", + "24": "**Оператор return** \n\nОператор return используется для возврата5 из функции, т.е. для прекращения её работы и выхода из неё. При этом можно также вернуть некоторое значение из функции.", + "25": "**Пример:** \n\ndef maximum(x, y):\n if x > y:\n return x\n elif x == y:\n return 'Числа равны.'\n else:\n return y\n\nprint(maximum(2, 3))", + "26": "**Как это работает:** \n\nФункция maximum возвращает максимальный из двух параметров, которые в\nданном случае передаются ей при вызове. Она использует обычный условный оператор if..else для определения наибольшего числа, а затем возвращает это число." + }, + "Урок 6: Модули": { + "0": "**Предисловие** \n\nКак можно использовать код повторно, помещая его в функции, мы уже видели. А что, если нам понадобится повторно использовать различные функции в других наших программах? Как вы уже, наверное, догадались, ответ – модули.\n\nСуществуют разные способы составления модулей, но самый простой – это создать файл с расширением .py, содержащий функции и переменные.\n\nДругой способ – написать модуль на том языке программирования, на котором написан сам интерпретатор Python. Например, можно писать модули на языке программирования C, которые после компиляции могут использоваться стандартным интерпретатором Python\n\nСперва посмотрим, как использовать модули стандартной библиотеки.", + "1": "**Пример:** \n\nimport sys\n\nprint('Аргументы командной строки:')\nfor i in sys.argv:\n print(i)\n\nprint('\\n\\nПеременная PYTHONPATH содержит', sys.path, '\\n')", + "2": "**Как это работает:** \n\nМы импортируем модуль sys.\n\nКогда выполняется команда import sys, идёт поиск модуля sys.\n\nДоступ к переменной argv в модуле sys предоставляется при помощи точки, т.е. sys.argv. Это явно показывает, что это имя является частью модуля sys.\n\nКогда мы запускаем «python using_sys.py we are arguments», мы запускаем модуль using_sys.py командой python, а всё, что следует далее – аргументы, передаваемые программе. Python сохраняет аргументы командной строки в переменной sys.argv для дальнейшего использования.", + "3": "**Файлы байткода .pyc** \n\nИмпорт модуля – относительно дорогостоящее мероприятие, поэтому Python предпринимает некоторые трюки для ускорения этого процесса. Один из способов – создать байткомпилированные файлы (или байткод) с расширением .pyc, которые являются некой промежуточной формой, в которую Python переводит программу (помните раздел «Введение» о том, как работает Python?). Такой файл .pyc полезен при импорте модуля в следующий раз в другую программу – это произойдёт намного быстрее, поскольку значительная часть обработки, требуемой при импорте модуля, будет уже проделана. Этот байткод также является платформо-независимым.", + "4": "**Оператор from... import...** \n\nЧтобы импортировать переменную argv прямо в программу и не писать всякий раз sys. При обращении к ней, можно воспользоваться выражением «from sys import argv».\n\nДля импорта всех имён, использующихся в модуле sys, можно выполнить команду «from sys import *». Это работает для любых модулей.\n\nВ общем случае вам следует избегать использования этого оператора и использовать вместо этого оператор import, чтобы предотвратить конфликты имён и не затруднять чтение программы.", + "5": "**Создание собственных модулей** \n\nСоздать собственный модуль очень легко. Да вы всё время делали это! Ведь каждая программа на Python также является и модулем. Необходимо лишь убедиться, что у неё установлено расширение .py.", + "6": "**Пример:** \n\ndef sayhi():\n print('Привет! Это говорит мой модуль.')\n\n__version__ = '0.1'\n\n# Конец модуля mymodule.py", + "7": "**Функция dir** \n\nВстроенная функция dir() возвращает список имён, определяемых объектом. Например, для модуля в этот список входят функции, классы и переменные, определённые в этом модуле.\n\nЭта функция может принимать аргументы. Если в качестве аргумента указано имя модуля, она возвращает список имён, определённых в этом модуле. Если никакого аргумента не передавать, она вернёт список имён, определённых в текущем модуле.", + "8": "**Пример:** \n\n$ python3\n\n>>> import sys # получим список атрибутов модуля 'sys'\n\n>>> dir(sys)\n['getfilesystemencoding', 'getprofile', 'getrecursionlimit', 'getrefcount', 'getsizeof', 'gettrace', porter_cache', 'platform', 'prefix', 'ps1', 'ps2', 'setcheckinterval', 'setprofile', 'setrecursionlimit', 'settrace', 'stderr', 'stdin', 'stdout', 'subversion', 'version', 'version_info', 'warnoptions', 'winver']\n\n>>> dir() # получим список атрибутов текущего модуля\n['__builtins__', '__doc__', '__name__', '__package__', 'sys']\n\n>>> a = 5 # создадим новую переменную 'a'\n\n>>> dir()\n['__builtins__', '__doc__', '__name__', '__package__', 'a', 'sys']\n\n>>> del a # удалим имя 'a'\n\n>>> dir()\n['__builtins__', '__doc__', '__name__', '__package__', 'sys']\n\n>>>", + "9": "**Как это работает:** \n\nМы вызываем функцию dir, не передавая ей параметров. По умолчанию, она возвращает список атрибутов текущего модуля. __Обратите внимание, что список импортированных модулей также входит туда.__\n\nЧтобы пронаблюдать за действием dir, мы определяем новую переменную a и присваиваем ей значение, а затем снова вызываем dir. Видим, что в полученном списке появилось дополнительное значение. Удалим переменную/атрибут из текущего модуля при помощи оператора del, и изменения вновь отобразятся на выводе функции dir.\n\nЗамечание по поводу del: этот оператор используется для удаления переменной/имени, и после его выполнения, в данном случае – del a, к переменной a больше невозможно обратиться – её как будто никогда и не было.", + "10": "**Пакеты** \n\nК настоящему времени вы, вероятно, начали наблюдать некоторую иерархию в организации ваших программ. Переменные обычно находятся в функциях. Функции и глобальные переменные обычно находятся в модулях. А что, если возникнет необходимость как-то организовать модули? Вот здесь-то и выходят на сцену пакеты.\n\nПакеты – это просто каталоги с модулями и специальным файлом __init__.py, который показывает Python, что этот каталог особый, так как содержит модули Python.\n\nПредставим, что мы хотим создать пакет под названием «world» с субпакетами «asia», «africa» и т.д., которые, в свою очередь, будут содержать модули «india», «madagascar» и т.д.", + "11": "**Пример:** \n\nПредставим, что мы хотим создать пакет под названием «world» с субпакетами «asia», «africa» и т.д., которые, в свою очередь, будут содержать модули «india», «madagascar» и т.д.\n\nДля этого следовало бы создать следующую структуру каталогов:\n\n| - <некоторый каталог из sys.path>/\n| |---- world/\n| |---- __init__.py\n| |---- asia/\n| | |---- __init__.py\n| | |---- india/\n| | |---- __init__.py\n| | |---- foo.py\n| |---- africa/\n| |---- __init__.py\n| |---- madagascar/\n| |---- __init__.py\n| |---- bar.py" + }, + "Урок 7: Структуры данных": { + "0": "**Предисловие** \n\nСтруктуры данных – это, по сути, и есть структуры, которые могут хранить некоторые данные вместе. Другими словами, они используются для хранения связанных данных.\n\nВ Python существуют четыре встроенных структуры данных: список, кортеж, словарь и множество. Посмотрим, как ими пользоваться, и как они могут облегчить нам жизнь.", + "1": "**Список** \n\nСписок – это структура данных, которая содержит упорядоченный набор элементов, т.е. хранит последовательность элементов. Это легко представить, если вспомнить список покупок, в котором перечисляется, что нужно купить, с тем лишь исключением, что в списке покупок каждый элемент обычно размещается на отдельной строке, тогда как в Python они разделяются запятыми.\n\nСписок элементов должен быть заключён в квадратные скобки, чтобы Python понял, что это список. Как только список создан, можно добавлять, удалять или искать элементы в нём. Поскольку элементы можно добавлять и удалять, мы говорим, что список – это изменяемый тип данных, т.е. его можно модифицировать.", + "2": "**Краткое введение в объекты и классы** \n\nСписок – это один из примеров использования объектов и классов. Когда мы назначаем некоторой переменной i значение, скажем, целое число 5, это можно представить себе как создание объекта (т.е. экземпляра) i класса (т.е. типа) int. Чтобы лучше понять это, прочитайте help(int).\n\nКласс может также иметь методы, т.е. функции, определённые для использования только применительно к данному классу. Этот функционал будет доступен только когда имеется объект данного класса. Например, Python предоставляет метод append для класса list, который позволяет добавлять элемент к концу списка. Так mylist.append('and item') добавит эту строку к списку mylist. Обратите внимание на обозначение точкой для доступа к методам объектов.", + "3": "**Пример:** \n\nshoplist = ['яблоки', 'манго', 'морковь', 'бананы']\n\nprint('Я должен сделать', len(shoplist), 'покупки.')\n\nprint('Покупки:', end=' ')\nfor item in shoplist:\n print(item, end=' ')\n\nprint('\\nТакже нужно купить риса.')\nshoplist.append('рис')\nprint('Теперь мой список покупок таков:', shoplist)\n\nprint('Отсортирую-ка я свой список')\nshoplist.sort()\nprint('Отсортированный список покупок выглядит так:', shoplist)\n\nprint('Первое, что мне нужно купить, это', shoplist[0])\nolditem = shoplist[0]\ndel shoplist[0]\nprint('Я купил', olditem)\nprint('Теперь мой список покупок:', shoplist)", + "4": "**Как это работает:** \n\nВ shoplist мы храним только строки с названиями того, что нужно купить.\n\nДалее мы добавляем элемент к списку при помощи append – метода объекта списка. Затем мы проверяем, действительно ли элемент был добавлен к списку, выводя содержимое списка на экран.\n\nЗатем мы сортируем список, используя метод sort объекта списка.\n\nДалее после совершения покупки мы хотим удалить её из списка. Это достигается применением оператора del.", + "5": "**Кортеж** \n\nКортежи служат для хранения нескольких объектов вместе. Их можно рассматривать как аналог списков, но без такой обширной функциональности, которую предоставляет класс списка. Одна из важнейших особенностей кортежей заключается в том, что они неизменяемы, так же, как и строки. Т.е. модифицировать кортежи невозможно.\n\nКортежи обозначаются указанием элементов, разделённых запятыми; по желанию их можно ещё заключить в круглые скобки.\n\nКортежи обычно используются в тех случаях, когда оператор или пользовательская функция должны наверняка знать, что набор значений, т.е. кортеж значений, не изменится.", + "6": "**Пример:** \n\nzoo = ('питон', 'слон', 'пингвин') # помните, что скобки не обязательны\nprint('Количество животных в зоопарке -', len(zoo))\n\nnew_zoo = 'обезьяна', 'верблюд', zoo\nprint('Количество клеток в зоопарке -', len(new_zoo))\nprint('Все животные в новом зоопарке:', new_zoo)\nprint('Животные, привезённые из старого зоопарка:', new_zoo[2])\nprint('Последнее животное, привезённое из старого зоопарка -', new_zoo[2][2])\nprint('Количество животных в новом зоопарке -', len(new_zoo)-1 + \\\n len(new_zoo[2]))", + "7": "**Как это работает:** \n\nПеременная zoo обозначает кортеж элементов. Функция len позволяет получить длину кортежа.\n\nТеперь мы перемещаем этих животных в новый зоопарк. Поэтому кортеж new_zoo содержит тех животных, которые уже там, наряду с привезёнными из старого зоопарка.\n\nДоступ к элементам кортежа осуществляется указанием позиции элемента, заключённой в квадратные скобки. Это называется оператором индексирования. Доступ к третьему элементу в new_zoo мы получаем, указывая new_zoo[2], а доступ к третьему элементу внутри третьего элемента в кортеже new_zoo – указывая new_zoo[2][2].", + "8": "**Словарь** \n\nСловарь – это некий аналог адресной книги, в которой можно найти адрес или контактную информацию о человеке, зная лишь его имя; т.е. некоторые ключи связаны со значениями.\n\nПары ключ-значение указываются в словаре следующим образом: «d = {key1 : value1, key2 : value2 }». Обратите внимание, что ключ и значение разделяются двоеточием, а пары друг от друга отделяются запятыми, а затем всё это заключается в фигурные скобки.", + "9": "**Пример:** \n\nab = { 'Swaroop' : 'swaroop@swaroopch.com',\n 'Larry' : 'larry@wall.org',\n 'Matsumoto' : 'matz@ruby-lang.org',\n 'Spammer' : 'spammer@hotmail.com'\n }\n\nprint(\"Адрес Swaroop'а:\", ab['Swaroop'])\n\n# Удаление пары ключ-значение\ndel ab['Spammer']\n\nprint('\\nВ адресной книге {0} контакта\\n'.format(len(ab)))\n print('Контакт {0} с адресом {1}'.format(name, address))\n\n# Добавление пары ключ-значение\nab['Guido'] = 'guido@python.org'\n\nif 'Guido' in ab:\n print(\"\\nАдрес Guido:\", ab['Guido'])", + "10": "**Как это работает:** \n\nМы создаём словарь ab. Затем мы обращаемся к парам ключ-значение. Как видите, синтаксис прост.\n\nУдалять пары ключ-значение можно при помощи оператора del. Мы указываем имя словаря и оператор индексирования для удаляемого ключа, после чего передаём это оператору del.\n\nДалее мы обращаемся ко всем парам ключ-значение нашего словаря, используя метод items, который возвращает список кортежей, каждый из которых содержит пару элементов: ключ и значение. Мы получаем эту пару и присваиваем её значение переменным name и address соответственно в цикле for..in, а затем выводим эти значения на экран в блоке for.", + "11": "**Последовательности** \n\nСписки, кортежи и строки являются примерами последовательностей. Но что такое последовательности и что в них такого особенного?\n\nОсновные возможности – это проверка принадлежности (т.е. выражения «in» и «not in») и оператор индексирования, позволяющий получить напрямую некоторый элемент последовательности.\n\nВсе три типа последовательностей, упоминавшиеся выше (списки, кортежи и строки), также предоставляют операцию получения вырезки, которая позволяет получить вырезку последовательности, т.е. её фрагмент.", + "12": "**Пример:** \n\nshoplist = ['яблоки', 'манго', 'морковь', 'бананы']\nname = 'swaroop'\n\n# Операция индексирования\nprint('Элемент 0 -', shoplist[0])\nprint('Элемент 1 -', shoplist[1])\nprint('Элемент 2 -', shoplist[2])\nprint('Элемент 3 -', shoplist[3])\nprint('Элемент -1 -', shoplist[-1])\nprint('Элемент -2 -', shoplist[-2])\nprint('Символ 0 -', name[0])\n\n# Вырезка из списка\nprint('Элементы с 1 по 3:', shoplist[1:3])\nprint('Элементы с 2 до конца:', shoplist[2:])\nprint('Элементы с 1 по -1:', shoplist[1:-1])\nprint('Элементы от начала до конца:', shoplist[:])\n\n# Вырезка из строки\nprint('Символы с 1 по 3:', name[1:3])\nprint('Символы с 2 до конца:', name[2:])\nprint('Символы с 1 до -1:', name[1:-1])\nprint('Символы от начала до конца:', name[:])" + }, + "Урок 8: Исключения": { + "0": "**Предисловие** \n\nИсключения возникают тогда, когда в программе возникает некоторая исключительная ситуация. Например, к чему приведёт попытка чтения несуществующего файла? Или если файл был случайно удалён, пока программа работала? Такие ситуации обрабатываются при помощи исключений.\n\nЭто касается и программ, содержащих недействительные команды. В этом случае Python поднимает руки и сообщает, что обнаружил ошибку.", + "1": "**Ошибки** \n\nРассмотрим простой вызов функции print. Что, если мы ошибочно напишем print как Print? Обратите внимание на заглавную букву. В этом случае Python поднимает синтаксическую ошибку.", + "2": "**Пример:** \n\n>>> Print('Привет, Мир!')\nTraceback (most recent call last):\n File \"\", line 1, in \n Print('Привет, Мир!')\nNameError: name 'Print' is not defined\n\nОбратите внимание, что была поднята ошибка NameError, а также указано место, где была обнаружена ошибка. Так в данном случае действует обработчик ошибок.", + "3": "**Исключения** \n\nПопытаемся считать что-либо от пользователя. Нажмите Сtrl-D (или Ctrl+Z в Windows) и посмотрите, что произойдёт.", + "4": "**Пример:** \n\n>>> s = input('Введите что-нибудь --> ')\n\nВведите что-нибудь -->\nTraceback (most recent call last):\n File \"\", line 1, in \n s = input('Введите что-нибудь --> ') \nEOFError: EOF when reading a line\n\nPython поднимает ошибку с именем EOFError, что означает, что он обнаружил символ конца файла (который вводится при помощи Ctrl-D) там, где не ожидал.", + "5": "**Обработка исключений** \n\nОбрабатывать исключения можно при помощи оператора try..except. При этом все обычные команды помещаются внутрь try-блока, а все обработчики исключений – в except-блок.", + "6": "**Пример:** \n\ntry:\n text = input('Введите что-нибудь --> ')\nexcept EOFError:\n print('Ну зачем вы сделали мне EOF?')\nexcept KeyboardInterrupt:\n print('Вы отменили операцию.')\nelse:\n print('Вы ввели {0}'.format(text))", + "7": "**Как это работает:** \n\nЗдесь мы поместили все команды, которые могут вызвать исключения/ошибки, внутрь блока try, а затем поместили обработчики соответствующих ошибок/исключений в блок except. Выражение except может обрабатывать как одиночную ошибку или исключение, так и список ошибок/исключений в скобках. Если не указано имя ошибки или исключения, обрабатываться будут все ошибки и исключения.", + "8": "**Вызов исключения** \n\nИсключение можно поднять при помощи оператора raise, передав ему имя ошибки/исключения, а также объект исключения, который нужно выбросить.\n\nВызываемая ошибка или исключение должна быть классом, который прямо или непрямо является производным от класса Exception.", + "9": "**Пример:** \n\nclass ShortInputException(Exception):\n '''Пользовательский класс исключения.'''\n def __init__(self, length, atleast):\n Exception.__init__(self)\n self.length = length\n self.atleast = atleast\n\ntry:\n text = input('Введите что-нибудь --> ')\n if len(text) < 3:\n raise ShortInputException(len(text), 3)\n # Здесь может происходить обычная работа\nexcept EOFError:\n print('Ну зачем вы сделали мне EOF?')\nexcept ShortInputException as ex:\n print('ShortInputException: Длина введённой строки -- {0}; \\\n ожидалось, как минимум, {1}'.format(ex.length, ex.atleast))\nelse:\n print('Не было исключений.')", + "10": "**Как это работает:** \n\nЗдесь мы создаём наш собственный тип исключения. Этот новый тип исключения называется ShortInputException. Он содержит два поля: length, хранящее длину введённого текста, и atleast, указывающее, какую минимальную длину текста ожидала программа.\n\nВ пункте except мы указываем класс ошибки ShortInputException, который будет сохранён как переменная ex, содержащая соответствующий объект ошибки/исключения. Это аналогично параметрам и аргументам при вызове функции. Внутри этого пункта except мы используем поля length и atleast объекта исключения для вывода необходимых сообщений пользователю.", + "11": "**Try .. Finally** \n\nПредставим, что в программе происходит чтение файла и необходимо убедиться, что объект файла был корректно закрыт и что не возникло никакого исключения. Этого можно достичь с применением блока finally.", + "12": "**Пример:** \n\nimport time\n\ntry:\n f = open('poem.txt')\n while True: # наш обычный способ читать файлы\n line = f.readline()\n if len(line) == 0:\n break\n print(line, end='')\n time.sleep(2) # Пусть подождёт некоторое время\nexcept KeyboardInterrupt:\n print('!! Вы отменили чтение файла.')\nfinally:\n f.close()\n print('(Очистка: Закрытие файла)')", + "13": "**Как это работает:** \n\nЗдесь мы производим обычные операции чтения из файла, но в данном случае добавляем двухсекундный сон после вывода каждой строки при помощи функции time.sleep, чтобы программа выполнялась медленно (ведь Python очень быстр от природы). Во время выполнения программы нажмите ctrl-c, чтобы прервать/отменить выполнение программы.\n\nПронаблюдайте, как при этом выдаётся исключение KeyboardInterrupt, и программа выходит. Однако, прежде чем программа выйдет, выполняется пункт finally, и файловый объект будет всегда закрыт.", + "14": "**Оператор with** \n\nТипичной схемой является запрос некоторого ресурса в блоке try с последующим освобождением этого ресурса в блоке finally. Для того, чтобы сделать это более «чисто»,существует оператор with:", + "15": "**Пример:** \n\nwith open(\"poem.txt\") as f:\n for line in f:\n print(line, end='')", + "16": "**Как это работает:** \n\nСуществует некий протокол, используемый оператором with. Он считывает объект, возвращаемый операторомopen.Назовём его в данном случае «thefile».\n\nПеред запуском блока кода, содержащегося в нём, оператор with всегда вызывает функцию thefile.__enter__, а также всегда вызывает thefile.__exit__ после завершения выполнения этого блока кода.\n\nТак что код, который мы бы написали в блоке finally, будет автоматически обработан методом __exit__. Это избавляет нас от необходимости повторно в явном виде указывать операторы try..finally." }, + "Урок 9: Дополнительно": { + "0": "**Предисловие** \n\nК настоящему моменту мы уже рассмотрели большую часть того, что вам придётся использовать при работе с Python. В этой главе мы охватим некоторые дополнительные аспекты, которые помогут отшлифовать ваши знания.", + "1": "**Self** \n\nМетоды класса имеют одно отличие от обычных функций: они должны иметь дополнительно имя, добавляемое к началу списка параметров. Однако, при вызове метода никакого значения этому параметру присваивать не нужно – его укажет Python. Эта переменная указывает на сам объект экземпляра класса, и по традиции она называется self.\n\nХотя этому параметру можно дать любое имя, настоятельно рекомендуется использовать только имя self; использование любого другого имени не приветствуется. Есть много достоинств использования стандартного имени: во-первых, любой человек, просматривающий вашу программу, легко узнает его; во-вторых, некоторые специализированные Интегрированные среды разработки (IDE) изначально рассчитаны на использование self.", + "2": "**Классы** \n\nКлассы предоставляют средства объединения данных и функциональности вместе. Создание нового класса создает объект нового типа, позволяя создавать новые экземпляры этого типа. К каждому экземпляру класса могут быть прикреплены атрибуты для поддержания его состояния. Экземпляры класса также могут иметь методы (определенные его классом) для изменения его состояния.", + "3": "**Пример:** \n\nclass Person:\n pass # Пустой блок\n\np = Person()\nprint(p)", + "4": "**Как это работает:** \n\nМы создаём новый класс при помощи оператора class и имени класса. За этим следует блок выражений, формирующих тело класса. В данном случае блок у нас пуст, на что указывает оператор pass.\n\nДалее мы создаём объект-экземпляр класса, записывая имя класса со скобками. (Мы узнаем больше о реализации в следующем разделе). Для проверки мы выясняем тип переменной, просто выводя её на экран. Так мы видим, что у нас есть экземпляр класса Person в модуле __main__.\n\nОбратите внимание, что выводится также и адрес в памяти компьютера, где хранится ваш объект. На вашем компьютере адрес будет другим, так как Python хранит объекты там, где имеется свободное место.", + "5": "**Методы объектов** \n\nИтак, мы выяснили что классы/объекты могут иметь методы, представляющие собой функции, за исключением дополнительной переменной self. А теперь давайте рассмотрим пример", + "6": "**Пример:** \n\nclass Person:\n def sayHi(self):\n print('Привет! Как дела?')\n\np = Person()\np.sayHi()", + "7": "**Как это работает:** \n\nЗдесь мы видим self в действии. __Обратите внимание, что метод sayHi не принимает параметров, но тем не менее, имеет self в определении функции.__", + "8": "**Блоки в одно выражение** \n\nМы неоднократно говорили, что каждый блок команд отделяется от других своим собственным уровнем отступа. Однако, существует и исключение. Если блок команд содержит только одно выражение, его можно указывать в одной строке с условным оператором или, скажем, оператором цикла. Рассмотрим это на примере:", + "9": "**Пример:** \n\n>>> flag = True\n>>> if flag: print('Да')\nДа\n\nОбратите внимание, что единственный оператор расположен в той же строке, а не отдельным блоком. Этот способ может подкупить тем, что якобы «сокращает» программу, но мы настоятельно рекомендуем избегать его во всех случаях, кроме проверки ошибок. Прежде всего, потому что гораздо легче добавлять команды, когда уже есть необходимый уровень отступа.", + "10": "**Lambda-формы** \n\nКлючевое слово lambda используется для создания функций и возврата их значения во время выполнения программы. lambda принимает параметр, за которым следует одно выражение, которое становится телом функции, а значение этого выражения возвращается новой функцией.", + "11": "**Пример:** \n\npoints = [ { 'x' : 2, 'y' : 3 }, { 'x' : 4, 'y' : 1 } ]\npoints.sort(key=lambda i : i['y'])\nprint(points)", + "12": "**Как это работает:** \n\nОбратите внимание на то, что метод sort класса list может принимать параметр key, определяющий способ сортировки списка (обычно мы думаем только о сортировке по возрастанию или по убыванию). В данном случае мы хотим провести сортировку по собственному принципу, для чего нам необходимо написать соответствующую функцию. Но вместо того, чтобы создавать отдельный блок def для описания функции, которая будет использоваться только в этом месте, мы применяем лямбда-выражение.", + "13": "**Генераторы списков** \n\nГенераторы списков служат для создания новых списков на основе существующих. Представьте, что имеется список чисел, на основе которого требуется получить новый список, состоящий из всех чисел, умноженных на 2, но только при условии, что само число больше 2. Генераторы списков подходят для таких задач как нельзя лучше.", + "14": "**Пример:** \n\nlistone = [2, 3, 4]\nlisttwo = [2*i for i in listone if i > 2]\nprint(listtwo)", + "15": "**Как это работает:** \n\nВ этом примере мы создаём новый список, указав операцию, которую необходимо произвести (2 * i), когда выполняется некоторое условие (if i > 2).Обратите внимание, что исходный список при этом не изменяется.", + "16": "**Передача кортежей и словарей в функции** \n\nДля получения параметров, переданных функции, в виде кортежа или словаря, существуют специальные приставки «*» или «**» соответственно. Это особенно полезно в случаях, когда функция может принимать переменное число параметров.", + "17": "**Пример:** \n\n>>> def powersum(power, *args):\n... '''Возвращает сумму аргументов, возведённых в указанную степень.'''\n... total = 0\n... for i in args:\n... total += pow(i, power)\n... return total\n...\n>>> powersum(2, 3, 4)\n25\n>>> powersum(2, 10)\n100\n\nПоскольку перед переменной args указана приставка «*», все дополнительные аргументы, переданные функции, сохранятся в args в виде кортежа. В случае использования приставки «**» все дополнительные параметры будут рассматриваться как пары ключ/значение в словаре.", + "18": "**exec и eval** \n\nФункция exec служит для выполнения команд Python, содержащихся в строке или файле, в отличие от самого текста программы. Например, во время выполнения программы можно сформировать строку, содержащую текст программы на Python, и запустить его при помощи exec:", + "19": "**Пример:** \n\n>>> exec('print(\"Здравствуй, Мир!\")')\nЗдравствуй, Мир!", + "20": "**Оператор assert** \n\nОператор assert существует для того, чтобы указать, что нечто является истиной. Например, если требуется гарантировать, что в списке будет хотя бы один элемент, и вызвать ошибку, если это не так, то оператор assert идеально подойдёт для такой задачи. Когда заявленное выражение ложно, вызывается ошибка AssertionError. Метод pop() возвращает последний элемент списка, одновременно удаляя его оттуда.", + "21": "**Пример:** \n\n>>> mylist = ['item']\n>>> assert len(mylist) >= 1\n>>> mylist.pop()\n'item'\n>>> mylist\n[]\n>>> assert len(mylist) >= 1\nTraceback (most recent call last):\n File \"\", line 1, in \nAssertionError", + "22": "**Функция repr** \n\nФункция repr используется для получения канонического строкового представления объекта. Любопытно, что в большинстве случаев eval(repr(object)) == object.", + "23": "**Пример:** \n\n>>> i = []\n>>> i.append('item')\n>>> repr(i)\n\"['item']\"\n>>> eval(repr(i))\n['item']\n>>> eval(repr(i)) == i\nTrue\n\nПо большому счёту, функция repr служит для получения печатаемого представления объекта. Определив метод __repr__ в собственном классе, можно указать, что он будет возвращать по вызову функции repr.", + "24": "**Установка библиотек** \n\nВ Каталоге пакетов Python существует колоссальное количество открытых библиотек, которые вы можете использовать в своих программах. Для их установки можно воспользоваться pip.", + "25": "**Графические программы** \n\nДля создания собственной графической программы на Python понадобится какая-нибудь библиотека ГИП (графического интерфейса пользователя) со своими привязками к Python. Привязки позволяют писать программу на Python, используя библиотеки, которые сами по себе написаны на C, C++ или других языках.", + "26": "**Kivy** \n\nhttps://kivy.org", + "27": "**PyGTK** \n\nЭто привязки Python к инструментарию GTK+, на основе которого построен GNOME. У GTK+ есть много своих особенностей, но как только вы освоитесь, вы сможете создавать ГИП очень быстро. Что касается дизайнера графического интерфейса Glade, то он просто незаменим. Документация же всё ещё требует некоторых улучшений. GTK+ хорошо работает в GNU/Linux, но его порт на Windows пока не закончен. При помощи GTK+ можно создавать как свободные, так и проприетарные программы. Для начала прочитайте Учебник по PyGTK.", + "28": "**PyQt** \n\nЭто привязки Python к инструментарию Qt, на основе которого построена KDE. Qt чрезвычайно прост в использовании, особенно благодаря Qt Designer и изумительной документации Qt. PyQt бесплатно, если используется для создания свободных программ (с лицензией GPL). Для создания закрытых проприетарных программ вам придётся его купить. Начиная с Qt 4.5, разрешается создавать при помощи него не только GPL’ные программы.", + "29": "**wxPython** \n\nЭто привязки Python к инструментарию wxWidgets. wxPython не так прост в освоении, но зато он переносим и работает на GNU/Linux, Windows, Mac и даже на встраиваемых платформах. Многие среды разработки для wxPython, такие как SPE (Stani’s Python Editor) и wxGlade включают дизайнеры графического интерфейса. При помощи wxPython можно создавать как свободные, так и проприетарные программы." - "Урок 5: Поток команд.": { - "Предисловие": "В программах, которые мы до сих пор рассматривали, последовательность команд всегда выполнялась Python по порядку строго сверху вниз. А что, если нам необходимо изменить поток выполняющихся команд? Например, если требуется, чтобы программа принимала некоторое решение и выполняла различные действия в зависимости от ситуации; скажем, печатала «Доброе утро» или «Добрый вечер» в зависимости от времени суток. \n\nКак вы уже, наверное, догадались, этого можно достичь при помощи операторов управления потоком. В Python есть три оператора управления потоком: if, for и while.", - "Условные оператор if. Часть I.": "Оператор if используется для проверки условий: если условие верно, выполняется блок выражений (называемый «if-блок»), иначе выполняется другой блок выражений (называемый «else-блок»). Блок «else» является необязательным.", - "Условные оператор if. Часть II.": "number = 23\nguess = int(input('Введите целое число : '))\n\nif guess == number:\n print('Поздравляю, вы угадали,') # Начало нового блока\n print('(хотя и не выиграли никакого приза!)') # Конец нового блока\nelif guess < number:\n print('Нет, загаданное число немного больше этого.') # Ещё один блок\nelse:\n print('Нет, загаданное число немного меньше этого.')", - "Условные оператор if. Часть III.": "В этой программе мы принимаем варианты от пользователя и проверяем, совпадают ли они с заранее заданным числом. Мы устанавливаем переменной number значение любого целого числа, какого хотим. Например, 23. После этого мы принимаем вариант числа от пользователя при помощи функции input(). Функции – это всего-навсего многократно используемые фрагменты программы. Мы узнаем о них больше в следующей главе. \n\nМы передаём встроенной функции input строку, которую она выводит на экран и ожидает ввода от пользователя. Как только мы ввели что-нибудь и нажали клавишу Enter, функция input() возвращает строку, которую мы ввели. Затем мы преобразуем полученную строку в число при помощи int(), и сохраняем это значение в переменную guess. При помощи int можно преобразовать строку в целое число (предполагая, что строка содержит целое число). \n\nДалее мы сравниваем число, введённое пользователем, с числом, которое мы выбрали заранее. Если они равны, мы печатаем сообщение об успехе. После этого мы проверяем, верно ли, что пользовательский вариант числа меньше загаданного, и если это так, мы информируем пользователя о том, что ему следует выбирать числа немного больше этого. Здесь мы использовали выражение elif, которое попросту объединяет в себе два связанных if else-if else выражения в одно выражение if-elif-else. Это облегчает чтение программы, а также не требует дополнительных отступов.", - "Оператор while. Часть I.": "Оператор while позволяет многократно выполнять блок команд до тех пор, пока выполняется некоторое условие. Это один из так называемых операторов цикла. Он также может иметь необязательный пункт else.", - "Оператор while. Часть II.": "number = 23\nrunning = True\n\nwhile running:\n guess = int(input('Введите целое число : '))\n\n if guess == number:\n print('Поздравляю, вы угадали.')\n running = False # это останавливает цикл while\n elif guess < number:\n print('Нет, загаданное число немного больше этого.')\n else:\n print('Нет, загаданное число немного меньше этого.')\nelse:\n print('Цикл while закончен.')", - "Оператор while. Часть III.": "В этой программе мы продолжаем играть в игру с угадыванием, но преимущество состоит в том, что теперь пользователь может угадывать до тех пор, пока не угадает правильное число, и ему не придётся запускать программу заново для каждой попытки, как это происходило до сих пор. Это наглядно демонстрирует применение оператора while.\n\nМы переместили операторы input и if внутрь цикла while и установили переменную running в значение True перед запуском цикла. Прежде всего проверяется, равно ли значение переменной running True, а затем происходит переход к соответствующему while-блоку. После выполнения этого блока команд условие, которым в данном случае является переменная running, проверяется снова. Если оно истинно, while-блок запускается снова, в противном случае происходит переход к дополнительному else-блоку, а затем – к следующему оператору.", - "Цикл for. Часть I.": "Оператор for..in также является оператором цикла, который осуществляет итерацию по последовательности объектов, т.е. проходит через каждый элемент в последовательности. __Мы узнаем больше о последовательностях в дальнейших главах, а пока просто запомните, что последовательность – это упорядоченный набор элементов.__", - "Цикл for. Часть II.": "for i in range(1, 5):\n print(i)\nelse:\n print('Цикл for закончен')", - "Цикл for. Часть III.": "В этой программе мы выводим на экран последовательность чисел. Мы генерируем эту последовательность, используя встроенную функцию range.\n\nМы задаём два числа, и range возвращает последовательность чисел от первого числа до второго. Например, range(1,5) даёт последовательность [1, 2, 3, 4]. По умолчанию range принимает значение шага, равное 1. Если мы зададим также и третье число range, оно будет служить шагом. Например, range(1,5,2) даст [1,3]. Помните, интервал простирается только до второго числа, т.е. не включает его в себя.\n\nЗатем цикл for осуществляет итерацию по этому диапазону - for i in range(1,5) эквивалентно for i in [1, 2, 3, 4], что напоминает присваивание переменной i по одному числу (или объекту) за раз, выполняя блок команд для каждого значения i. В данном случае в блоке команд мы просто выводим значение на экран.", - "Оператор break. Часть I.": "Оператор break служит для прерывания цикла, т.е. остановки выполнения команд даже если условие выполнения цикла ещё не приняло значения False или последовательность элементов не закончилась.\n\n__Важно отметить, что если циклы for или while прервать оператором break, соответствующие им блоки else выполняться не будут.__", - "Оператор break. Часть II.": "while True:\n s = input('Введите что-нибудь : ')\n if s == 'выход':\n break\n print('Длина строки:', len(s))", - "Оператор break. Часть III.": "В этой программе мы многократно считываем пользовательский ввод и выводим на экран длину каждой введённой строки. Для остановки программы мы вводим специальное условие, проверяющее, совпадает ли пользовательский ввод со строкой 'выход'. Мы останавливаем программу прерыванием цикла оператором break и достигаем её конца.\n\n__Длина введённой строки может быть найдена при помощи встроенной функции len.__", - "Оператор continue. Часть I.": "Оператор continue используется для указания Python, что необходимо пропустить все оставшиеся команды в текущем блоке цикла и продолжить со следующей итерации цикла", - "Оператор continue. Часть II.": "while True:\n s = input('Введите что-нибудь : ')\n if s == 'выход':\n break\n if len(s) < 3:\n print('Слишком мало')\n continue\n print('Введённая строка достаточной длины')", - "Оператор continue. Часть III.": "В этой программе мы запрашиваем ввод со стороны пользователя, но обрабатываем введённую строку только если она имеет длину хотя бы в 3 символа. Итак, мы используем встроенную функцию len для получения длины строки, и если длина менее 3, мы пропускаем остальные действия в блоке при помощи оператора continue. В противном случае все остальные команды в цикле выполняются, производя любые манипуляции, которые нам нужны." } } \ No newline at end of file diff --git a/tasks.json b/tasks.json index c54c0e3..baf5590 100644 --- a/tasks.json +++ b/tasks.json @@ -1,97 +1,191 @@ -{ - "1": { - "title": "Умножение чисел.", - "task_text": "Напишите программу, которая принимает на вход два числа и выводит их произведение.", - "solve": "Запросим у пользователя два числа c помощью 'input()'. Затем умножим два полученных числа и выведем результат на экран через 'print()'.", - "code": "num1 = float(input()) \n num2 = float(input()) \n print(num1 * num2)", - "difficulty": 0 - }, - - "2": { - "title": "Инверсия.", - "task_text": "Реализуйте функцию, которая принимает на вход строку и возвращает ее в обратном порядке.", - "solve": "Функция `reverse_string()` принимает один аргумент - `s`, который является строкой. Для разворота строки мы используем срезы с отрицательным шагом. Срез `[::-1]` означает, что мы берем все символы строки от конца к началу с шагом -1, то есть в обратном порядке.", - "code": "def reverse_string(s):\n return s[::-1]", - "difficulty": 0 - }, - - "3": { - "title": "Пересечение.", - "task_text": "Напишите функцию, которая принимает на вход два списка чисел и возвращает список, содержащий только числа, которые есть в обоих списках.", - "solve": "Функция `common_elements()` принимает два аргумента - `list1` и `list2`, которые являются списками чисел. Сначала функция преобразует списки во множества с помощью встроенной функции `set()`. Затем функция находит пересечение множеств с помощью метода `intersection()`. Наконец, функция преобразует множество обратно в список с помощью встроенной функции `list()` и возвращает его.", - "code": "def common_elements(list1, list2): \n set1 = set(list1) \n set2 = set(list2) \n result = set1.intersection(set2) \n return list(result)", - "difficulty": 0 - }, - - "4": { - "title": "Подсчёт букв.", - "task_text": "Создайте программу, которая просит пользователя ввести слово и затем выводит количество гласных букв в этом слове.", - "solve": "Код начинается с запроса на ввод слова от пользователя с помощью `input()`. Затем мы создаем список гласных букв и инициализируем переменную `count` для подсчета гласных букв. Далее, мы перебираем каждую букву в слове с помощью цикла `for`, проверяем, является ли буква гласной, и если да, увеличиваем счетчик `count`.", - "code": "word = input() \nvowels = ['a', 'e', 'i', 'o', 'u'] \ncount = 0 \n for letter in word: \n if letter.lower() in vowels: \n count += 1 \n print('Количество гласных букв в слове', word, ':',count)", - "difficulty": 0 - }, - - "5": { - "title": "Строки.", - "task_text": "Напишите программу, которая принимает на вход две строки и возвращает последнее слово в каждой из них.", - "solve": "Функция `last_words()` принимает два аргумента - `s1` и `s2`, которые являются строками. Для нахождения последнего слова в каждой строке мы используем метод `split()`, который разбивает строку на слова. Затем мы берем последнее слово в списке слов с помощью индекса `-1`. Возвращается список с последними словами.", - "code": "def last_words(s1, s2): \n last_word1 = s1.split()[-1] \n last_word2 = s2.split()[-1] \n return [last_word1, last_word2]", - "difficulty": 0 - }, - - "6": { - "title": "Среднее арифметическое.", - "task_text": "Реализуйте функцию, которая принимает на вход список чисел и возвращает среднее значение этого списка.", - "solve": "Функция `average()` принимает один аргумент - `numbers`, который является списком чисел. Для вычисления среднего значения мы сначала вычисляем сумму всех чисел в списке с помощью встроенной функции `sum()`, а затем количество чисел в списке с помощью встроенной функции `len()`. Затем мы вычисляем среднее значение, которое равно сумме чисел, деленной на количество чисел. Наконец, мы возвращаем среднее значение с помощью ключевого слова `return`.", - "code": "def average(numbers): \n return sum(numbers) / len(numbers)", - "difficulty": 0 - }, - - "7": { - "title": "Числа Фибоначчи.", - "task_text": "Напишите программу, которая просит пользователя ввести число N и затем выводит первые N чисел Фибоначчи.", - "solve": "Сначала мы запрашивает у пользователя число N с помощью функции `input()`. Далее инициализирует переменные `a` и `b`, которые будут использоваться для вычисления чисел Фибоначчи. Затем использует цикл `for` для вычисления и вывода первых N чисел Фибоначчи. В каждой итерации цикла программа выводит текущее число Фибоначчи и обновляет значения переменных `a` и `b` для вычисления следующего числа Фибоначчи. Наконец, выводим последовательность чисел Фибоначчи на экран.", - "code": "n = int(input()) \na, b = 0, 1 \n for i in range(n): \n print(a, end=' ') \n a, b = b, a + b", - "difficulty": 0 - }, - - "8": { - "title": "Илон Шмаск и список.", - "task_text": "Напишите программу для Илона Шмаска с созданием списка чисел от 1 до 10 включительно.", - "solve": "Мы создаем при помощи генератора список чисел от 0 до 10 включительно. Затем мы выводим список на экран с помощью функции `print()`.", - "code": "\nprint('Добро пожаловать в компанию SpaceY!') \nprint([i for i in range(11)])", - "difficulty": 1 - }, - - "9": { - "title": "Билл Герц и генератор паролей.", - "task_text": "Напишите программу для Билла Герца с генерацией случайного пароля длиной 8 символов, содержащего только буквы латинского алфавита (в верхнем и нижнем регистре) и цифры.", - "solve": "Мы импортируем модули `random` и `string`, чтобы использовать функции для генерации случайных чисел и создания списка символов, которые могут входить в пароль. Затем мы создаем пустую строку `password` и используем цикл `for` для генерации случайного пароля длиной 8 символов. В каждой итерации цикла мы добавляем случайный символ из списка `characters` к строке `password` с помощью метода `random.choice()`. Наконец, мы выводим пароль на экран с помощью функции `print()`.", - "code": "import random, string \ncharacters = string.ascii_letters + string.digits \npassword = '' \nfor i in range(8): \n password += random.choice(characters \nprint(password)", - "difficulty": 2 - }, - - "10": { - "title": "День недели.", - "task_text": "Напишите программу, которая запрашивает у пользователя день недели (например, 'понедельник') и выводит сообщение 'Сегодня <день недели>', где <день недели> - введенный пользователем день недели.", - "solve": "Мы запрашиваем у пользователя день недели с помощью функции `input()` и сохраняем его в переменную `day`. Наконец, мы выводим сообщение с указанием введенного дня недели, используя форматирование строк с помощью f-строк.", - "code": "day = input('Введите день недели: ') \nprint(f'Сегодня {day}') \n", - "difficulty": 0 - }, - - "11": { - "title": "Cумма чисел до 10.", - "task_text": "Напишите программу для нахождения суммы всех чисел от 1 до 10 включительно.", - "solve": "Применим в решении генератор для чисел от 0 до 10 включительно. При помощи функции `sum` получим их сумму и выведем ее на экран при помощи `print`.", - "code": "print(sum([i for i in range(11)]))", - "difficulty": 1 - }, - - "12": { - "title": "Угадай-ка.", - "task_text": "Напишите программу, которая загадывает случайное число от 1 до 10 и просит пользователя угадать это число. Если пользователь угадал число, выводится сообщение 'Поздравляю, вы победили!'. Если нет, выводится сообщение 'К сожалению, вы проиграли. Загаданное число было <число>'.", - "solve": "Мы используем модуль `random`, чтобы загадать случайное число от 1 до 10. Затем мы просим пользователя ввести число и проверяем, угадал ли он загаданное число. Если пользователь угадал число, то выводится сообщение об победе, иначе программа выводит сообщение о проигрыше.", - "code": "import random \n number = random.randint(1, 10) \nguess = input('Введите число от 1 до 10: ') \nif int(guess) == number: \n print('Поздравляю, вы победили!') \nelse: \n print(f'К сожалению, вы проиграли. Загаданное число было {number}.')", - "difficulty": 1 - } -} \ No newline at end of file +{ + "1": { + "title": "Умножение чисел.", + "task_text": "Напишите программу, которая принимает на вход два числа и выводит их произведение.", + "solve": "Запросим у пользователя два числа c помощью 'input()'. Затем умножим два полученных числа и выведем результат на экран через 'print()'.", + "code": "num1 = float(input()) \n num2 = float(input()) \n print(num1 * num2)", + "difficulty":0 + }, + "2": { + "title": "Инверсия.", + "task_text": "Реализуйте функцию, которая принимает на вход строку и возвращает ее в обратном порядке.", + "solve": "Функция `reverse_string()` принимает один аргумент - `s`, который является строкой. Для разворота строки мы используем срезы с отрицательным шагом. Срез `[::-1]` означает, что мы берем все символы строки от конца к началу с шагом -1, то есть в обратном порядке.", + "code": "def reverse_string(s):\n return s[::-1]", + "difficulty":0 + }, + "3": { + "title": "Пересечение.", + "task_text": "Напишите функцию, которая принимает на вход два списка чисел и возвращает список, содержащий только числа, которые есть в обоих списках.", + "solve": "Функция `common_elements()` принимает два аргумента - `list1` и `list2`, которые являются списками чисел. Сначала функция преобразует списки во множества с помощью встроенной функции `set()`. Затем функция находит пересечение множеств с помощью метода `intersection()`. Наконец, функция преобразует множество обратно в список с помощью встроенной функции `list()` и возвращает его.", + "code": "def common_elements(list1, list2): \n set1 = set(list1) \n set2 = set(list2) \n result = set1.intersection(set2) \n return list(result)", + "difficulty":0 + }, + "4": { + "title": "Подсчёт букв.", + "task_text": "Создайте программу, которая просит пользователя ввести слово и затем выводит количество гласных букв в этом слове.", + "solve": "Код начинается с запроса на ввод слова от пользователя с помощью `input()`. Затем мы создаем список гласных букв и инициализируем переменную `count` для подсчета гласных букв. Далее, мы перебираем каждую букву в слове с помощью цикла `for`, проверяем, является ли буква гласной, и если да, увеличиваем счетчик `count`.", + "code": "word = input() \nvowels = ['a', 'e', 'i', 'o', 'u'] \ncount = 0 \n for letter in word: \n if letter.lower() in vowels: \n count += 1 \n print('Количество гласных букв в слове', word, ':',count)", + "difficulty":0 + }, + "5": { + "title": "Строки.", + "task_text": "Напишите программу, которая принимает на вход две строки и возвращает последнее слово в каждой из них.", + "solve": "Функция `last_words()` принимает два аргумента - `s1` и `s2`, которые являются строками. Для нахождения последнего слова в каждой строке мы используем метод `split()`, который разбивает строку на слова. Затем мы берем последнее слово в списке слов с помощью индекса `-1`. Возвращается список с последними словами.", + "code": "def last_words(s1, s2): \n last_word1 = s1.split()[-1] \n last_word2 = s2.split()[-1] \n return [last_word1, last_word2]", + "difficulty":0 + }, + "6": { + "title": "Среднее арифметическое.", + "task_text": "Реализуйте функцию, которая принимает на вход список чисел и возвращает среднее значение этого списка.", + "solve": "Функция `average()` принимает один аргумент - `numbers`, который является списком чисел. Для вычисления среднего значения мы сначала вычисляем сумму всех чисел в списке с помощью встроенной функции `sum()`, а затем количество чисел в списке с помощью встроенной функции `len()`. Затем мы вычисляем среднее значение, которое равно сумме чисел, деленной на количество чисел. Наконец, мы возвращаем среднее значение с помощью ключевого слова `return`.", + "code": "def average(numbers): \n return sum(numbers) / len(numbers)", + "difficulty":0 + }, + "7": { + "title": "Числа Фибоначчи.", + "task_text": "Напишите программу, которая просит пользователя ввести число N и затем выводит первые N чисел Фибоначчи.", + "solve": "Сначала мы запрашивает у пользователя число N с помощью функции `input()`. Далее инициализирует переменные `a` и `b`, которые будут использоваться для вычисления чисел Фибоначчи. Затем использует цикл `for` для вычисления и вывода первых N чисел Фибоначчи. В каждой итерации цикла программа выводит текущее число Фибоначчи и обновляет значения переменных `a` и `b` для вычисления следующего числа Фибоначчи. Наконец, выводим последовательность чисел Фибоначчи на экран.", + "code": "n = int(input()) \na, b = 0, 1 \n for i in range(n): \n print(a, end=' ') \n a, b = b, a + b", + "difficulty":0 + }, + "8": { + "title": "Илон Шмаск и список.", + "task_text": "Напишите программу для Илона Шмаска с созданием списка чисел от 1 до 10 включительно.", + "solve": "Мы создаем при помощи генератора список чисел от 0 до 10 включительно. Затем мы выводим список на экран с помощью функции `print()`.", + "code": "\nprint('Добро пожаловать в компанию SpaceY!') \nprint([i for i in range(11)])", + "difficulty":1 + }, + "9": { + "title": "Билл Герц и генератор паролей.", + "task_text": "Напишите программу для Билла Герца с генерацией случайного пароля длиной 8 символов, содержащего только буквы латинского алфавита (в верхнем и нижнем регистре) и цифры.", + "solve": "Мы импортируем модули `random` и `string`, чтобы использовать функции для генерации случайных чисел и создания списка символов, которые могут входить в пароль. Затем мы создаем пустую строку `password` и используем цикл `for` для генерации случайного пароля длиной 8 символов. В каждой итерации цикла мы добавляем случайный символ из списка `characters` к строке `password` с помощью метода `random.choice()`. Наконец, мы выводим пароль на экран с помощью функции `print()`.", + "code": "import random, string \ncharacters = string.ascii_letters + string.digits \npassword = '' \nfor i in range(8): \n password += random.choice(characters \nprint(password)", + "difficulty":2 + }, + "10": { + "title": "День недели.", + "task_text": "Напишите программу, которая запрашивает у пользователя день недели (например, 'понедельник') и выводит сообщение 'Сегодня <день недели>', где <день недели> - введенный пользователем день недели.", + "solve": "Мы запрашиваем у пользователя день недели с помощью функции `input()` и сохраняем его в переменную `day`. Наконец, мы выводим сообщение с указанием введенного дня недели, используя форматирование строк с помощью f-строк.", + "code": "day = input('Введите день недели: ') \nprint(f'Сегодня {day}') \n", + "difficulty":0 + }, + "11": { + "title": "Cумма чисел до 10.", + "task_text": "Напишите программу для нахождения суммы всех чисел от 1 до 10 включительно.", + "solve": "Применим в решении генератор для чисел от 0 до 10 включительно. При помощи функции `sum` получим их сумму и выведем ее на экран при помощи `print`.", + "code": "print(sum([i for i in range(11)]))", + "difficulty":1 + }, + "12": { + "title": "Угадай-ка.", + "task_text": "Напишите программу, которая загадывает случайное число от 1 до 10 и просит пользователя угадать это число. Если пользователь угадал число, выводится сообщение 'Поздравляю, вы победили!'. Если нет, выводится сообщение 'К сожалению, вы проиграли. Загаданное число было <число>'.", + "solve": "Мы используем модуль `random`, чтобы загадать случайное число от 1 до 10. Затем мы просим пользователя ввести число и проверяем, угадал ли он загаданное число. Если пользователь угадал число, то выводится сообщение об победе, иначе программа выводит сообщение о проигрыше.", + "code": "import random \n number = random.randint(1, 10) \nguess = input('Введите число от 1 до 10: ') \nif int(guess) == number: \n print('Поздравляю, вы победили!') \nelse: \n print(f'К сожалению, вы проиграли. Загаданное число было {number}.')", + "difficulty":1 + }, + "13": { + "title": "Макс Кукерберг и шифр.", + "task_text": "Напишите программу для Макса Кукерберга, которая принимает на вход строку и шифрует ее с помощью алгоритма Цезаря (каждая буква заменяется на букву с определенным сдвигом по алфавиту). Сдвиг задается пользователем.", + "solve": "Цикл `for` используется для перебора всех символов в исходной строке. Если символ является буквой, то мы определяем новую букву с учетом сдвига и добавляем ее к зашифрованной строке. Если символ не является буквой, то мы добавляем его в зашифрованную строку без изменений. Для определения новой буквы мы используем функции `ord()` и `chr()` для преобразования символа в его код ASCII и обратно.", + "code": "text = input() \nshift = int(input()) \nencrypted_text = '' \nfor char in text: \n if char.isalpha(): \n new_char = chr((ord(char) + shift - 65) % 26 + 65) if char.isupper() \n else chr((ord(char) + shift - 97) % 26 + 97) \n encrypted_text += new_char \n else: \n encrypted_text += char \nprint('Зашифрованная строка:', encrypted_text)", + "difficulty":3 + }, + "14": { + "title": "Бинарный поиск.", + "task_text": "Напишите программу, которая использует бинарный поиск для нахождения заданного элемента в отсортированном списке. Список и элемент должны передаваться в функцию как аргументы.", + "solve": "Объявим переменные left, right - индексы первого и последнего элементов списка. В каждой итерации цикла с условием left<=right мы определяем средний индекс `mid` и сравниваем значение элемента на этой позиции со значением искомого элемента `x`. Если элемент найден, мы возвращаем его индекс и прерываем цикл с помощью оператора `break`. Если элемент не найден, мы возвращаем -1.", + "code": "def search(lst, x): \n left, right = 0, len(lst) - 1 \n while left <= right: \n  mid = (left + right) // 2 \n  if lst[mid] == x: \n  return mid \n  elif lst[mid] < x: \n  left = mid + 1 \n  else: \n  right = mid - 1 \n else: \n  return -1 \n", + "difficulty":2 + }, + "15": { + "title": "Алиса и перестановка букв.", + "task_text": "Создание программу для Алисы, которая будет производить перестановку букв в слове.", + "solve": "Для решения этой задачи можно использовать рекурсию. Объявим функцию `permutations`. Алгоритм начинается с проверки длины слова. Если длина слова равна 1, то возвращается список, содержащий только это слово. Затем в цикле проходим по всем буквам в слове. Для каждой буквы получаем оставшуюся часть слова, и рекурсивно вызываем функцию `permutations` для генерации перестановок оставшейся части слова. Для каждой полученной перестановки добавляем первую букву, и добавляем полученную перестановку в список результата. После завершения цикла возвращаем список всех перестановок.", + "code": "def permutations(word): if len(word) == 1: \n return [word] \n result = [] \n for i in range(len(word)): \n first_letter = word[i] \n remaining_letters = word[:i] + word[i+1:] \n for permutation in permutations(remaining_letters): \n result.append(first_letter + permutation) \n return result", + "difficulty":3 + }, + "16": { + "title": "Алиса и повтор слов.", + "task_text": "Создание программы, которая сканирует текстовый файл на наличие повторяющихся слов в тексте и выводит 10 наиболее часто встречающихся слов в порядке убывания их частоты. Алиса будет помогать оптимизировать алгоритм и ускорить процесс.", + "solve": "Для решения задачи можно использовать словарь, где ключом будет являться слово, а значением - количество его вхождений в текст. Программа сканирует текстовый файл на наличие повторяющихся слов в тексте, подсчитывает количество вхождений каждого слова и сортирует слова по количеству вхождений в порядке убывания. Затем программа выводит наиболее часто встречающиеся слова в порядке убывания их частоты.", + "code": "import re \nwith open('text.txt', 'r') as file: \n text = file.read() \ntext = re.sub(r'[ws]', '', text) \nwords = text.lower().split() \nword_count = {} \nfor word in words: \n if word in word_count: \n word_count[word] += 1 \n else: \n word_count[word] = 1 \nsorted_words = sorted(word_count, key=word_count.get, reverse=True) \nfor word in sorted_words[:10]: \n print(f'{word}: {word_count[word]}')", + "difficulty":3 + }, + "17": { + "title": "Алиса и неубывающая последовательность.", + "task_text": "Разработка программы, которая будет находить наибольшую сумму неубывающей подпоследовательности в данном массиве чисел. Алиса будет помогать выявлять и устранять ошибки в коде.", + "solve": "Для решения этой задачи можно использовать алгоритм динамического программирования, который будет хранить на каждом шаге наибольшую сумму неубывающей подпоследовательности, заканчивающейся в данном элементе массива. Функция `max_sum_subsequence` принимает массив чисел `arr` и возвращает наибольшую сумму неубывающей подпоследовательности в этом массиве. Алгоритм начинается с инициализации списка `dp` длины `len(arr)` нулями. Затем первый элемент списка `dp` присваивается первому элементу массива `arr`. Далее проходим по массиву `arr` начиная со второго элемента. Если текущий элемент больше или равен предыдущему элементу, то наибольшая сумма неубывающей подпоследовательности, заканчивающейся в текущем элементе, равна сумме наибольшей неубывающей подпоследовательности, заканчивающейся в предыдущем элементе, и текущего элемента.", + "code": "def max_sum_subsequence(arr): \n dp = [0] * len(arr) \n dp[0] = arr[0] \n for i in range(1, len(arr)): \n if arr[i] >= arr[i-1]: \n dp[i] = dp[i-1] + arr[i] \n else: \n dp[i] = arr[i] \n max_sum = max(dp) \n return max_sum ", + "difficulty":3 + }, + "18": { + "title": "Алиса и криптография.", + "task_text": "Дан набор чисел и шифр, который нужно расшифровать. Алиса знает, что шифрование произведено с помощью определенного алгоритма. Напишите программу для Алисы, которая реализует этот алгоритм и расшифрует сообщение.", + "solve": "Программа реализует алгоритм расшифровки для заданного набора чисел и шифра. Сначала мы задаем набор чисел и шифр. Затем мы инициализируем пустую строку для расшифрованного сообщения. Далее мы используем цикл `for` для прохода по каждому числу в наборе и добавления соответствующего символа из шифра в расшифрованное сообщение. Для определения символа мы используем операцию остатка от деления числа на длину шифра, чтобы получить индекс символа в шифре. Наконец, мы выводим расшифрованное сообщение на экран.", + "code": "numbers = [10, 23, 56, 7, 31] \ncipher = 'abcdef' \nmessage = '' \nfor number in numbers: \n message += cipher[number % len(cipher)] \nprint(message)", + "difficulty":2 + }, + "19": { + "title": "Алиса и матрица.", + "task_text": "Дана матрица, в которой нужно найти наибольшую сумму элементов в одной строке или одном столбце. Напишите программу для Алисы, которая определит эту сумму.", + "solve": "Программа находит наибольшую сумму элементов в одной строке или одном столбце заданной матрицы. Сначала мы задаем матрицу. Затем мы используем генераторы списков и функции `sum()` для нахождения суммы элементов в каждой строке и столбце матрицы. Для нахождения суммы элементов в столбцах мы используем функцию `zip()`, которая объединяет элементы матрицы в кортежи и транспонирует матрицу. Затем мы находим максимальную сумму элементов с помощью встроенной функции `max()` и выводим ее на экран.", + "code": "matrix = [[1, 2, 3],[4, 5, 6],[7, 8, 9]]\nmax_row_sum = max(sum(row) for row in matrix) \nmax_col_sum = max(sum(col) for col in zip(*matrix)) \nmax_sum = max(max_row_sum,max_col_sum) \nprint(max_sum)", + "difficulty":2 + }, + "20": { + "title": "Медиана.", + "task_text": "Создать функцию для вычисления медианы ряда чисел.", + "solve": "Сначала функция находит количество элементов при помощи `len()` и записывает его в переменную `n`. Далее вычисляем индекс среднего элемента делением переменной `n` нацело на 2. Если Количество элементов чётно - возвращаем средний элемент упорядоченного списка. Иначе - находим среднее арифметическое двух средних элементов упорядоченного списка. Возвращаем результат.", + "code": "def my_median(sample): \nn = len(sample) \nindex = n // 2\nif n % 2: \n return sorted(sample)[index]\n return sum(sorted(sample)[index - 1:index + 1]) / 2 ", + "difficulty":0 + }, + "21": { + "title": "Сумма квадратов чисел.", + "task_text": "Программа для нахождения суммы квадратов чисел. Пользователь должен ввести набор чисел, а программа должна вычислить сумму квадратов этих чисел и вывести результат.", + "solve": "В этой программе мы сначала запрашиваем у пользователя набор чисел, разделенных пробелом. Затем мы преобразуем строку в список чисел, используя функцию `split` для разделения строки на отдельные элементы и функцию `map` для преобразования каждого элемента в число. Затем мы вычисляем сумму квадратов чисел, используя генератор списка и оператор `**` для возведения каждого числа в квадрат. Генератор списка создает новый список, содержащий квадраты каждого элемента в исходном списке чисел.", + "code": "numbers = input() \nnumbers_list = list(map(float, numbers.split())) \nsquares_sum = sum([num**2 for num in numbers_list]) \nprint(squares_sum) ", + "difficulty":0 + }, + "22": { + "title": "Факториал числа.", + "task_text": "Программа для вычисления факториала числа. Пользователь должен ввести число, а программа должна вычислить его факториал и вывести результат.", + "solve": "В этой программе мы сначала запрашиваем у пользователя число, для которого нужно вычислить факториал. Затем мы вычисляем факториал числа, используя цикл `for`. Внутри цикла мы умножаем переменную `factorial` на текущее значение переменной `i` на каждой итерации цикла. На первой итерации `i` равно 1, на второй - 2, на третьей - 3, и так далее, пока `i` не достигнет значения `number`. Наконец, мы выводим результат на экран в виде сообщения пользователю.", + "code": "number = int(input()) \nfactorial = 1 \nfor i in range(1, number + 1): \n factorial *= i \nprint(factorial) ", + "difficulty":1 + }, + "23": { + "title": "Число 3 как смысл жизни.", + "task_text": "Программа для определения чисел, которые делятся на 3. Пользователь должен ввести набор чисел, а программа должна вывести все числа, которые делятся на 3 без остатка.", + "solve": "В этой программе мы сначала запрашиваем у пользователя набор чисел, разделенных пробелом. Затем мы преобразуем строку в список чисел, используя функцию `split` для разделения строки на отдельные элементы и функцию `map` для преобразования каждого элемента в целое число. Затем мы находим числа, которые делятся на 3 без остатка, используя генератор списка и условный оператор `if`. Генератор списка создает новый список, содержащий элементы, для которых выполняется условие в условном операторе `if`. Наконец, мы выводим результат на экран в виде списка чисел, которые делятся на 3 без остатка.", + "code": "numbers = input() \nnumbers_list = list(map(int, numbers.split())) /ndivisible_by_3 = [num for num in numbers_list if num % 3 == 0] \nprint(divisible_by_3) ", + "difficulty":1 + }, + "24": { + "title": "Подсчет ингредиентов.", + "task_text": "Программа для подсчёта количества ингредиентов для приготовления блюда. Пользователь вводит количество порций, а программа автоматически вычисляет необходимое количество ингредиентов для приготовления блюда.", + "solve": "В этой программе мы сначала создаем словарь, в котором указываем необходимое количество ингредиентов для приготовления одной порции блюда. Затем мы запрашиваем у пользователя количество порций и вычисляем необходимое количество ингредиентов для приготовления заданного количества порций, используя цикл for и обращаясь к словарю с необходимым количеством ингредиентов для одной порции блюда. Результаты выводятся на экран в виде словаря, где ключами являются названия ингредиентов, а значениями - необходимое количество ингредиентов для приготовления заданного количества порций.", + "code": "ingredients_per_serving = {'яйцо': 1, 'молоко': 200, 'сыр': 50}\nservings = int(input()) \ningredients = {} \nfor ingredient, quantity in ingredients_per_serving.items(): \n ingredients[ingredient] = quantity * servings \nprint(ingredients) ", + "difficulty":1 + }, + "25": { + "title": "Стоимость пиццы.", + "task_text": "Программа для расчёта стоимости пиццы. Пользователь вводит диаметр и цену пиццы, а программа вычисляет цену за квадратный дюйм и выводит её на экран.", + "solve": "В этой программе пользователь сначала вводит диаметр пиццы (в дюймах) и её цену. Затем программа вычисляет площадь пиццы (используя формулу для вычисления площади круга), а затем вычисляет стоимость за квадратный дюйм, разделив цену на площадь. Результат выводится на экран в виде сообщения пользователю.", + "code": "diameter = float(input()) \nprice = float(input()) \nradius = diameter / 2 \narea = 3.14159 * radius ** 2 \ncost_per_square_inch = price / area \nprint(round(cost_per_square_inch, 2))", + "difficulty":0 + }, + "26": { + "title": "Стоимость продуктов.", + "task_text": "Программа для определения стоимости продукта за сантиметр квадратный. Пользователь должен вводить название продукта, его вес, и цену а программа должна выводить его название и цену за сантиметр квадратный", + "solve": "В этой программе пользователь сначала вводит вес продукта (в граммах) и цену (за упаковку). Затем программа вычисляет площадь продукта (предполагая, что она равна весу в граммах, деленному на 10), а затем вычисляет стоимость за квадратный сантиметр, разделив цену на площадь. Результат выводится на экран в виде сообщения пользователю.", + "code": "product_weight = float(input()) /nproduct_price = float(input()) \nproduct_area = product_weight / 10 \nprice_per_cm2 = product_price / product_area \nprint(round(price_per_cm2, 2))", + "difficulty":1 + }, + "27": { + "title": "Закупаем продукты.", + "task_text": "Программа для определения продуктов, которые необходимо купить на неделю. Пользователь должен ввести список продуктов, которые есть в холодильнике, и список блюд на неделю. Программа должна вывести список продуктов, которые необходимо купить для приготовления блюд.", + "solve": "В этой программе мы сначала запрашиваем у пользователя список продуктов в холодильнике и список блюд на неделю. Затем мы преобразуем строки в списки с помощью метода `split`. Затем мы создаем пустой список `shopping_list` для продуктов, которые необходимо купить. Затем мы проходим по каждому блюду в списке `menu_list` и проверяем каждый ингредиент в блюде. Если ингредиент не находится в списке продуктов в холодильнике и еще не добавлен в список `shopping_list`, мы добавляем его в список `shopping_list`. Наконец, мы выводим результат на экран. Если список `shopping_list` не пустой, мы выводим список продуктов, которые необходимо купить, в противном случае выводим сообщение, что продуктов для покупки не требуется.", + "code": "fridge = input() \nfridge_list = fridge.split(',') /nmenu = input('Введите список блюд на неделю через запятую: ') \nmenu_list = menu.split(',') /nshopping_list = [] \nfor dish in menu_list: \n for ingredient in dish.split(): \n if ingredient not in fridge_list and ingredient not in shopping_list: \n shopping_list.append(ingredient) /nif shopping_list: \n print(', '.join(shopping_list)) /nelse: \n print('Продуктов для покупки не требуется.')", + "difficulty":2 + } +} \ No newline at end of file From 5a216545fe81a4629f5ce646960c1c53ab7ce011 Mon Sep 17 00:00:00 2001 From: TchTech <67865526+TchTech@users.noreply.github.com> Date: Sat, 25 Mar 2023 23:47:39 +0300 Subject: [PATCH 11/31] consultant plus --- consultant.py | 26 ++++++++++++++++++++++++++ main3.py | 24 +++++++++++------------- 2 files changed, 37 insertions(+), 13 deletions(-) create mode 100644 consultant.py diff --git a/consultant.py b/consultant.py new file mode 100644 index 0000000..760ebd5 --- /dev/null +++ b/consultant.py @@ -0,0 +1,26 @@ +from sklearn.feature_extraction.text import TfidfVectorizer +from sklearn.metrics.pairwise import cosine_similarity +from nltk.corpus import stopwords +import json +def index_of_max(lst): + maxi = 0 + for i in range(len(lst)): + if lst[i] > lst[maxi]: + maxi = i + return maxi +class ArtificialIntelligence: + def __init__(self, name_of_file): + russian_stopwords = stopwords.words("russian") + with open(name_of_file, "r", encoding="utf-8") as f: + doc = dict(json.load(f)) + self.base = [] + [self.base.extend(i) for i in [list(i.values()) for i in list(doc.values())]] + self.vectorizer = TfidfVectorizer(stop_words=russian_stopwords) + self.docs_tfidf = self.vectorizer.fit_transform(b) + def get_similarity(self, query): + query_tfidf = self.vectorizer.transform([query]) + return self.base[index_of_max(list(cosine_similarity(query_tfidf, self.docs_tfidf).flatten()))] + +# q = input() +# a = ArtificialIntelligence("course.json") +# print("Найдено:", a.get_similarity(q)) \ No newline at end of file diff --git a/main3.py b/main3.py index 93a02ee..beeffbc 100644 --- a/main3.py +++ b/main3.py @@ -7,6 +7,7 @@ from task_getter import TaskGetter from buttons import Buttons from enums import * +from consultant import ArtificialIntelligence from typing import Literal @@ -100,7 +101,11 @@ def _working_with_user_in_main_menu (self) -> None: self._TEXT_TO_SPEECH += ", ".join (self._difficulty_levels_of_course) self._BUTTONS.add_buttons (*self._difficulty_levels_of_course, hide_all = False) self._BUTTONS.add_buttons ("Узнать мои результаты", "На главное меню", "Пока", hide_all = True) - + elif self._has_one_word_in_text_in_lower( + "консультант", "консультанту", "консультанта", "консультанты", "консультанте", "консультация", "консультацию", "консультации", "консультацией", "консультантом" + ): + self._SESSIONAL_DATA["state"] = "consulting" + self._OUTPUT_TEXT = "Я готова подобрать вам справку по теме вашей проблемы. С чем вам помочь?\n" elif self._has_one_word_in_text_in_lower ( "квест", "квеста", "квесту", "квестом", "квесте", "квесты", "квестов", "квестам", "квестами", "квестах"): @@ -614,23 +619,16 @@ def _viewing_quest_results (self) -> None: def _sending_report (self) -> None: # Доработать # FIXME self._BUTTONS.add_buttons ("На главное меню", "Пока!", hide_all = True) - if self._user_wants_to_go_to_main_menu: - self._go_to_main_menu ( ) - elif self._user_wants_to_end_session: - self._end_the_session ( ) - else: - self._OUTPUT_TEXT = get_apology_text ( ) + self._WORDS_OF_TEXT_IN_LOWER def _consulting (self) -> None: # Доработать # FIXME + + ai = ArtificialIntelligence("lessons.json") + self._BUTTONS.add_buttons ("На главное меню", "Пока!", hide_all = True) - if self._user_wants_to_go_to_main_menu: - self._go_to_main_menu ( ) - elif self._user_wants_to_end_session: - self._end_the_session ( ) - else: - self._OUTPUT_TEXT = get_apology_text ( ) + self._OUTPUT_TEXT = "Итак, я нашла что-то, что может вам помочь, послушайте: " + ai.get_similarity(self._WORDS_OF_TEXT_IN_LOWER) def _has_all_words_in_text_in_lower (self, *words) -> bool: From 7777c5f4ac17f2ba1a67d8d88343850ccbaa6dfe Mon Sep 17 00:00:00 2001 From: TchTech <67865526+TchTech@users.noreply.github.com> Date: Sun, 26 Mar 2023 12:25:58 +0300 Subject: [PATCH 12/31] Update consultant.py --- consultant.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/consultant.py b/consultant.py index 760ebd5..a7103d5 100644 --- a/consultant.py +++ b/consultant.py @@ -1,5 +1,7 @@ from sklearn.feature_extraction.text import TfidfVectorizer from sklearn.metrics.pairwise import cosine_similarity +import nltk +nltk.download('stopwords') from nltk.corpus import stopwords import json def index_of_max(lst): From 2ea9616c1697b288985295d8fef1ceb59e5fc234 Mon Sep 17 00:00:00 2001 From: TchTech <67865526+TchTech@users.noreply.github.com> Date: Sun, 26 Mar 2023 12:33:15 +0300 Subject: [PATCH 13/31] Update consultant.py --- consultant.py | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/consultant.py b/consultant.py index a7103d5..8eaddb4 100644 --- a/consultant.py +++ b/consultant.py @@ -1,8 +1,5 @@ from sklearn.feature_extraction.text import TfidfVectorizer from sklearn.metrics.pairwise import cosine_similarity -import nltk -nltk.download('stopwords') -from nltk.corpus import stopwords import json def index_of_max(lst): maxi = 0 @@ -12,13 +9,12 @@ def index_of_max(lst): return maxi class ArtificialIntelligence: def __init__(self, name_of_file): - russian_stopwords = stopwords.words("russian") with open(name_of_file, "r", encoding="utf-8") as f: doc = dict(json.load(f)) self.base = [] [self.base.extend(i) for i in [list(i.values()) for i in list(doc.values())]] - self.vectorizer = TfidfVectorizer(stop_words=russian_stopwords) - self.docs_tfidf = self.vectorizer.fit_transform(b) + self.vectorizer = TfidfVectorizer() + self.docs_tfidf = self.vectorizer.fit_transform(self.base) def get_similarity(self, query): query_tfidf = self.vectorizer.transform([query]) return self.base[index_of_max(list(cosine_similarity(query_tfidf, self.docs_tfidf).flatten()))] From 4307c7220b711857fe5b58cd35c2c24f5e030efb Mon Sep 17 00:00:00 2001 From: TchTech <67865526+TchTech@users.noreply.github.com> Date: Sun, 26 Mar 2023 12:46:11 +0300 Subject: [PATCH 14/31] consultant plus plus --- consultant.py | 2 +- main3.py | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/consultant.py b/consultant.py index 8eaddb4..b6539f4 100644 --- a/consultant.py +++ b/consultant.py @@ -20,5 +20,5 @@ def get_similarity(self, query): return self.base[index_of_max(list(cosine_similarity(query_tfidf, self.docs_tfidf).flatten()))] # q = input() -# a = ArtificialIntelligence("course.json") +# a = ArtificialIntelligence("lessons.json") # print("Найдено:", a.get_similarity(q)) \ No newline at end of file diff --git a/main3.py b/main3.py index beeffbc..8a76c04 100644 --- a/main3.py +++ b/main3.py @@ -619,7 +619,7 @@ def _viewing_quest_results (self) -> None: def _sending_report (self) -> None: # Доработать # FIXME self._BUTTONS.add_buttons ("На главное меню", "Пока!", hide_all = True) - self._WORDS_OF_TEXT_IN_LOWER + # self._WORDS_OF_TEXT_IN_LOWER def _consulting (self) -> None: @@ -628,7 +628,7 @@ def _consulting (self) -> None: ai = ArtificialIntelligence("lessons.json") self._BUTTONS.add_buttons ("На главное меню", "Пока!", hide_all = True) - self._OUTPUT_TEXT = "Итак, я нашла что-то, что может вам помочь, послушайте: " + ai.get_similarity(self._WORDS_OF_TEXT_IN_LOWER) + self._OUTPUT_TEXT = "Итак, я нашла что-то, что может вам помочь, послушайте: " + ai.get_similarity(" ".join(self._WORDS_OF_TEXT_IN_LOWER)) def _has_all_words_in_text_in_lower (self, *words) -> bool: From fe55a54425183728a68d9b939122f5ad7e30d892 Mon Sep 17 00:00:00 2001 From: TchTech <67865526+TchTech@users.noreply.github.com> Date: Sun, 26 Mar 2023 13:13:28 +0300 Subject: [PATCH 15/31] Update consultant.py --- consultant.py | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/consultant.py b/consultant.py index b6539f4..168da6c 100644 --- a/consultant.py +++ b/consultant.py @@ -16,9 +16,13 @@ def __init__(self, name_of_file): self.vectorizer = TfidfVectorizer() self.docs_tfidf = self.vectorizer.fit_transform(self.base) def get_similarity(self, query): + query = self.filter_of_query(query) query_tfidf = self.vectorizer.transform([query]) return self.base[index_of_max(list(cosine_similarity(query_tfidf, self.docs_tfidf).flatten()))] + def filter_of_query(self, query): + stop_words = ["не", "без", "через", "у", "но", "о", "и", "как", "python", "а", "к", "в", "с", "за", "или", "либо", "же", "ж", "совсем", "ничуть", "отнюдь", "перед", "при", "про", "под", "по", "до", "чуть", "чуть-чуть"] + return " ".join([i for i in query.split(" ") if not i in stop_words]) -# q = input() -# a = ArtificialIntelligence("lessons.json") -# print("Найдено:", a.get_similarity(q)) \ No newline at end of file +q = input() +a = ArtificialIntelligence("lessons.json") +print("Найдено:", a.get_similarity(q)) \ No newline at end of file From dd37d64178db5ef04f684a974034d9b422038d56 Mon Sep 17 00:00:00 2001 From: TchTech <67865526+TchTech@users.noreply.github.com> Date: Sun, 26 Mar 2023 13:52:57 +0300 Subject: [PATCH 16/31] Update consultant.py --- consultant.py | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-) diff --git a/consultant.py b/consultant.py index 168da6c..e727299 100644 --- a/consultant.py +++ b/consultant.py @@ -1,6 +1,9 @@ from sklearn.feature_extraction.text import TfidfVectorizer from sklearn.metrics.pairwise import cosine_similarity import json +import pymorphy2 +morph = pymorphy2.MorphAnalyzer() + def index_of_max(lst): maxi = 0 for i in range(len(lst)): @@ -16,13 +19,21 @@ def __init__(self, name_of_file): self.vectorizer = TfidfVectorizer() self.docs_tfidf = self.vectorizer.fit_transform(self.base) def get_similarity(self, query): - query = self.filter_of_query(query) + query = self.lemmatize(self.filter_of_query(query)) query_tfidf = self.vectorizer.transform([query]) return self.base[index_of_max(list(cosine_similarity(query_tfidf, self.docs_tfidf).flatten()))] def filter_of_query(self, query): stop_words = ["не", "без", "через", "у", "но", "о", "и", "как", "python", "а", "к", "в", "с", "за", "или", "либо", "же", "ж", "совсем", "ничуть", "отнюдь", "перед", "при", "про", "под", "по", "до", "чуть", "чуть-чуть"] return " ".join([i for i in query.split(" ") if not i in stop_words]) + def lemmatize(self, text): + words = text.split() # разбиваем текст на слова + res = list() + for word in words: + p = morph.parse(word)[0] + res.append(p.normal_form) + + return res -q = input() -a = ArtificialIntelligence("lessons.json") -print("Найдено:", a.get_similarity(q)) \ No newline at end of file +# q = input() +# a = ArtificialIntelligence("lessons.json") +# print("Найдено:", a.get_similarity(q)) \ No newline at end of file From ba95582009e4f722efe116b8cf71c1a4c33e5704 Mon Sep 17 00:00:00 2001 From: TchTech <67865526+TchTech@users.noreply.github.com> Date: Sun, 26 Mar 2023 13:54:01 +0300 Subject: [PATCH 17/31] Update consultant.py --- consultant.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/consultant.py b/consultant.py index e727299..797e1a7 100644 --- a/consultant.py +++ b/consultant.py @@ -32,7 +32,7 @@ def lemmatize(self, text): p = morph.parse(word)[0] res.append(p.normal_form) - return res + return " ".join(res) # q = input() # a = ArtificialIntelligence("lessons.json") From 4bcac7506298b9baa23f73e3f110e9e47c27873a Mon Sep 17 00:00:00 2001 From: Alexonys1 <107358560+Alexonys1@users.noreply.github.com> Date: Sun, 26 Mar 2023 14:29:35 +0300 Subject: [PATCH 18/31] =?UTF-8?q?=D0=9E=D0=B1=D0=BD=D0=BE=D0=B2=D0=BB?= =?UTF-8?q?=D0=B5=D0=BD=D0=B8=D0=B5=203-=D0=B9=20=D0=B2=D0=B5=D1=80=D1=81?= =?UTF-8?q?=D0=B8=D0=B8=20=D0=BD=D0=B0=D0=B2=D1=8B=D0=BA=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Добавил звуки, пофиксил некоторые недочёты. --- json_manager.py | 15 ++- lessons.json | 296 +++++++++++++++++++++---------------------- main3.py | 118 ++++++++++++++--- tasks.json | 288 ++++++++++++++--------------------------- texts_for_users.json | 18 +++ useful_functions.py | 2 + 6 files changed, 381 insertions(+), 356 deletions(-) diff --git a/json_manager.py b/json_manager.py index 746a0fe..074b563 100644 --- a/json_manager.py +++ b/json_manager.py @@ -77,4 +77,17 @@ def get_farewell_text ( ) -> str: body_of_farewell: str = random.choice (texts_for_users["body_of_farewell"]) return head_of_farewell + body_of_farewell # Достаётся начало прощания, например: "До свидания"; - # а потом тело прощания, например: ", хорошего дня!" \ No newline at end of file + # а потом тело прощания, например: ", хорошего дня!" + + +def get_random_win_sound ( ) -> str: + return random.choice (texts_for_users["win_sounds"]) + +def get_random_lose_sound ( ) -> str: + return random.choice (texts_for_users["lose_sounds"]) + +def get_random_sound_of_looking_results ( ) -> str: + return random.choice (texts_for_users["sound_of_looking_results"]) + +def get_introduction_sound ( ) -> str: + return "" \ No newline at end of file diff --git a/lessons.json b/lessons.json index 2fdc72e..bb93462 100644 --- a/lessons.json +++ b/lessons.json @@ -1,162 +1,160 @@ - { - "Урок 0: Введение в Python": { - "0": "**Предисловие** \n\nPython – простой и минималистичный язык. Чтение хорошей программы на Python очень напоминает чтение английского текста, хотя и достаточно строгого! Такая псевдо-кодовая природа Python является одной из его самых сильных сторон. Она позволяет вам сосредоточиться на решении задачи, а не на самом языке.", - "1": "**Python - Язык высокого уровня** \n\nПри написании программы на Python вам никогда не придётся отвлекаться на такие низкоуровневые детали, как управление памятью, используемой вашей программой, и т.п.", - "2": "Python - Язык объектно-ориентированный \n\nPython поддерживает как процедурно-ориентированное, так и объектноориентированное программирование. В процедурно-ориентированных языках программы строятся на основе процедур или функций, которые представляют собой просто-напросто многократно используемые фрагменты программы. В объектно-ориентированных языках программирования программы строятся на основе объектов, объединяющих в себе данные и функционал. \n\n__Python предоставляет простые, но мощные средства для ООП, особенно в сравнении с такими большими языками программирования, как C++ или Java.__" , - "3": "Python - Язык встраиваемый \n\nВ Python можно встраивать в программы на C/C++, чтобы предоставлять возможности написания сценариев их пользователям." + "Урок 1: Введение в Python": { + "Предисловие": "Python – простой и минималистичный язык. Чтение хорошей программы на Python очень напоминает чтение английского текста, хотя и достаточно строгого! Такая псевдо-кодовая природа Python является одной из его самых сильных сторон. Она позволяет вам сосредоточиться на решении задачи, а не на самом языке.", + "Python - Язык высокого уровня": "При написании программы на Python вам никогда не придётся отвлекаться на такие низкоуровневые детали, как управление памятью, используемой вашей программой, и т.п.", + "Python - Язык объектно-ориентированный": "Python поддерживает как процедурно-ориентированное, так и объектноориентированное программирование. В процедурно-ориентированных языках программы строятся на основе процедур или функций, которые представляют собой просто-напросто многократно используемые фрагменты программы. В объектно-ориентированных языках программирования программы строятся на основе объектов, объединяющих в себе данные и функционал. \n\n__Python предоставляет простые, но мощные средства для ООП, особенно в сравнении с такими большими языками программирования, как C++ или Java.__" , + "Python - Язык встраиваемый": "В Python можно встраивать в программы на C/C++, чтобы предоставлять возможности написания сценариев их пользователям." }, - "Урок 1: Установка Python": { - "0": "**Предисловие** \n\nИтак для того чтобы нам начать писать код нужно установть сам Python, а так же редактор для него ", - "1": "**Установка в Windows** \n\nПосетите страницу http://www.python.org/download/ и загрузите последнюю версию. Установка производится так же, как и для любых других программ для Windows.", - "2": "**Выбор редактора** \n\nПоскольку мы не можем набирать программу в командной т.к, нам понадобится сохранять программы в файлах. \n\nИтак нам нужен редактор для работы с файлами программ. Выбор редактора крайне важен. Хороший редактор поможет вам легко писать программы на Python, делая ваше путешествие более комфортным, а также позволяя быстрее и безопаснее достичь вашей цели. \n\nОдно из самых основных требований – это __подсветка синтаксиса__, когда разные элементы программы на Python раскрашены так, чтобы вы могли легко видеть вашу программу и ход её выполнения. \n\nЕсли вы не знаете, с чего начать, мы бы порекомендовали вам пользоваться программой PyCharm", - "3": "**Создание проекта** \n\nЗапустите выбранный вами редактор, введите следующую программу и сохраните её под именем helloworld.py . \n\nЕсли вы пользуетесь PyCharm, нажмите «New Project» → «выберете путь где будут хранится ваши программы» → «создавайте проект!»" + "Урок 2: Установка Python": { + "Предисловие": "Итак для того чтобы нам начать писать код нужно установть сам Python, а так же редактор для него ", + "Установка в Windows": "Посетите страницу http://www.python.org/download/ и загрузите последнюю версию. Установка производится так же, как и для любых других программ для Windows.", + "Выбор редактора": "Поскольку мы не можем набирать программу в командной т.к, нам понадобится сохранять программы в файлах. \n\nИтак нам нужен редактор для работы с файлами программ. Выбор редактора крайне важен. Хороший редактор поможет вам легко писать программы на Python, делая ваше путешествие более комфортным, а также позволяя быстрее и безопаснее достичь вашей цели. \n\nОдно из самых основных требований – это __подсветка синтаксиса__, когда разные элементы программы на Python раскрашены так, чтобы вы могли легко видеть вашу программу и ход её выполнения. \n\nЕсли вы не знаете, с чего начать, мы бы порекомендовали вам пользоваться программой PyCharm", + "Создание проекта": "Запустите выбранный вами редактор, введите следующую программу и сохраните её под именем helloworld.py . \n\nЕсли вы пользуетесь PyCharm, нажмите «New Project» → «выберете путь где будут хранится ваши программы» → «создавайте проект!»" }, - "Урок 2: Основы": { - "0": "**Предисловие** \n\nPython – это, один из немногих языков программирования, простых в освоении и одновременно мощных. \n\nЭто очень важно и для начинающих, и для специалистов, но что ещё важнее – на нём приятно программировать.", - "1": "**Комментарии** \n\nКомментарии – это то, что пишется после символа #, и представляет интерес лишь как заметка для читающего программу. \n\nНапример: \nprint(Привет, Мир!) # print -- это функция", - "2": "**Строка** \n\nСтрока – это последовательность символов. Чаще всего строки – это просто некоторые наборы слов. \n\nСлова могут быть как на английском языке, так и на любом другом, поддерживаемом стандартом Unicode, что означает почти на любом языке мира.", - "3": "**Одинарные кавычки** \n\nСтроку можно указать, используя одинарные кавычки, как например, 'Фраза в кавычках'. Все пробелы и знаки табуляции сохранятся, как есть.", - "4": "**Двойные кавычки** \n\nСтроки в двойных кавычках работают точно так же, как и в одинарных. Например,\"Как тебя зовут?\".", - "5": "**Типы данных** \n\nПеременные могут хранить значения разных типов, называемых типами данных. Основными типами являются числа и строки, о которых мы уже говорили. В дальнейших главах мы увидим, как создавать свои собственные типы при помощи классов.", - "6": "**Переменные** \n\nИспользование одних лишь литеральных констант может скоро наскучить – нам ведь нужен способ хранения любой информации и манипулирования ею. Вот здесь на сцену выходят переменные. Слово «переменные» говорит само за себя – их значение может меняться, а значит, вы можете хранить в переменной всё, что угодно. \n\nПеременные – это просто области памяти компьютера, в которых вы храните некоторую информацию. В отличие от констант, к такой информации нужно каким-то образом получать доступ, поэтому переменным даются имена." + "Урок 3: Основы": { + "Предисловие": "Python – это, один из немногих языков программирования, простых в освоении и одновременно мощных. \n\nЭто очень важно и для начинающих, и для специалистов, но что ещё важнее – на нём приятно программировать.", + "Комментарии": "Комментарии – это то, что пишется после символа #, и представляет интерес лишь как заметка для читающего программу. \n\nНапример: \nprint(Привет, Мир!) # print -- это функция", + "Строка": "Строка – это последовательность символов. Чаще всего строки – это просто некоторые наборы слов. \n\nСлова могут быть как на английском языке, так и на любом другом, поддерживаемом стандартом Unicode, что означает почти на любом языке мира.", + "Одинарные кавычки": "Строку можно указать, используя одинарные кавычки, как например, 'Фраза в кавычках'. Все пробелы и знаки табуляции сохранятся, как есть.", + "Двойные кавычки": "Строки в двойных кавычках работают точно так же, как и в одинарных. Например,\"Как тебя зовут?\".", + "Типы данных": "Переменные могут хранить значения разных типов, называемых типами данных. Основными типами являются числа и строки, о которых мы уже говорили. В дальнейших главах мы увидим, как создавать свои собственные типы при помощи классов.", + "Переменные": "Использование одних лишь литеральных констант может скоро наскучить – нам ведь нужен способ хранения любой информации и манипулирования ею. Вот здесь на сцену выходят переменные. Слово «переменные» говорит само за себя – их значение может меняться, а значит, вы можете хранить в переменной всё, что угодно. \n\nПеременные – это просто области памяти компьютера, в которых вы храните некоторую информацию. В отличие от констант, к такой информации нужно каким-то образом получать доступ, поэтому переменным даются имена." }, - "Урок 3:Операторы и выражения": { - "0": "**Предисловие** \n\nБольшинство предложений (логических строк) в программах содержат выражения. Простой пример выражения: 2 + 3. Выражение можно разделить на операторы и операнды. Операторы – это некий функционал, производящий какие-либо действия, который может быть представлен в виде символов, как например +, или специальных зарезервированных слов. Операторы могут производить некоторые действия над данными, и эти данные называются операндами. В нашем случае 2 и 3 – это операнды.", - "1": "**Оператор сложение** \"+\" \n\nОбъяснение: суммирует два объекта. \n\nПример: 3 + 5 даст 8; 'a' + 'b' даст 'ab'", - "2": "**Оператор вычитание** \"-\" \n\nОбъяснение: Даёт разность двух чисел; если первый операнд отсутствует, он считается равным нулю. \n\nПример: -5.2 даст отрицательное число, а 50 - 24 даст 26.", - "3": "**Оператор умножение** \"*\" \n\nОбъяснение: Даёт произведение двух чисел или возвращает строку, повторённую заданное число раз. \n\nПример: 2 * 3 даст 6. 'la' * 3 даст 'lalala'", - "4": "**Оператор деление** \"/\" \n\nОбъяснение: Возвращает частное от деления x на y. \n\nПример: 4 / 2 даст 2", - "5": "**Оператор меньше** \"<\" \n\nОбъяснение: Определяет, верно ли, что x меньше y. Все операторы сравнения возвращают True или False. Обратите внимание на заглавные буквы в этих словах. \n\nПример: 5 < 3 даст False", - "6": "**Оператор больше** \">\" \n\nОбъяснение: Определяет, верно ли, что x больше y. \n\nПример: 5 > 3 даст True", - "7": "**Оператор равно** \"==\" \n\nОбъяснение: Проверяет,одинаковы ли объекты. \n\nПример: x = 2; y = 2; x == y даёт True", - "8": "**Оператор не равно** \"!=\" \n\nОбъяснение: Проверяет, верно ли, что объекты не равны. \n\nПример: x = 2; y = 3; x != y даёт True", - "9": "**Оператор логическое НЕ** \"not\" \n\nОбъяснение: Если x равно True, оператор вернёт False. Если же x равно False, получим True. \n\nПример: x = True; not x даёт False", - "10": "**Оператор логическое И** \"and\" \n\nОбъяснение: x and y даёт False, если x равно False , в противном случае возвращает значение y. \n\nПример: x = False; y = True; x and y возвращает False, поскольку x равно False", - "11": "**Оператор логическое ИЛИ** \"or\" \n\nОбъяснение: Если x равно True, в результате получим True, в противном случае получим значение y. \n\nПример: x = True; y = False; x or y даёт True" + "Урок 4:Операторы и выражения": { + "Предисловие": "Большинство предложений (логических строк) в программах содержат выражения. Простой пример выражения: 2 + 3. Выражение можно разделить на операторы и операнды. Операторы – это некий функционал, производящий какие-либо действия, который может быть представлен в виде символов, как например +, или специальных зарезервированных слов. Операторы могут производить некоторые действия над данными, и эти данные называются операндами. В нашем случае 2 и 3 – это операнды.", + "Оператор сложение": "Объяснение: суммирует два объекта. \n\nПример: 3 + 5 даст 8; 'a' + 'b' даст 'ab'", + "Оператор вычитание": "Объяснение: Даёт разность двух чисел; если первый операнд отсутствует, он считается равным нулю. \n\nПример: -5.2 даст отрицательное число, а 50 - 24 даст 26.", + "Оператор умножение": "Объяснение: Даёт произведение двух чисел или возвращает строку, повторённую заданное число раз. \n\nПример: 2 * 3 даст 6. 'la' * 3 даст 'lalala'", + "Оператор деление": "Объяснение: Возвращает частное от деления x на y. \n\nПример: 4 / 2 даст 2", + "Оператор меньше": "Объяснение: Определяет, верно ли, что x меньше y. Все операторы сравнения возвращают True или False. Обратите внимание на заглавные буквы в этих словах. \n\nПример: 5 < 3 даст False", + "Оператор больше": "Объяснение: Определяет, верно ли, что x больше y. \n\nПример: 5 > 3 даст True", + "Оператор равно": "Объяснение: Проверяет,одинаковы ли объекты. \n\nПример: x = 2; y = 2; x == y даёт True", + "Оператор не равно": "Объяснение: Проверяет, верно ли, что объекты не равны. \n\nПример: x = 2; y = 3; x != y даёт True", + "Оператор логическое НЕ": "Объяснение: Если x равно True, оператор вернёт False. Если же x равно False, получим True. \n\nПример: x = True; not x даёт False", + "Оператор логическое И": "Объяснение: x and y даёт False, если x равно False , в противном случае возвращает значение y. \n\nПример: x = False; y = True; x and y возвращает False, поскольку x равно False", + "Оператор логическое ИЛИ": "Объяснение: Если x равно True, в результате получим True, в противном случае получим значение y. \n\nПример: x = True; y = False; x or y даёт True" }, - "Урок 4: Поток команд": { - "0": "**Предисловие** \n\nВ программах, которые мы до сих пор рассматривали, последовательность команд всегда выполнялась Python по порядку строго сверху вниз. А что, если нам необходимо изменить поток выполняющихся команд? Например, если требуется, чтобы программа принимала некоторое решение и выполняла различные действия в зависимости от ситуации; скажем, печатала «Доброе утро» или «Добрый вечер» в зависимости от времени суток. \n\nКак вы уже, наверное, догадались, этого можно достичь при помощи операторов управления потоком. В Python есть три оператора управления потоком: if, for и while.", - "1": "**Оператор if** \n\nОператор if используется для проверки условий: если условие верно, выполняется блок выражений (называемый «if-блок»), иначе выполняется другой блок выражений (называемый «else-блок»). Блок «else» является необязательным.", - "2": "**Пример:** \n\nnumber = 23\nguess = int(input('Введите целое число : '))\n\nif guess == number:\n print('Поздравляю, вы угадали,') # Начало нового блока\n print('(хотя и не выиграли никакого приза!)') # Конец нового блока\nelif guess < number:\n print('Нет, загаданное число немного больше этого.') # Ещё один блок\nelse:\n print('Нет, загаданное число немного меньше этого.')", - "3": "**Оператор while** \n\nОператор while позволяет многократно выполнять блок команд до тех пор, пока выполняется некоторое условие. Это один из так называемых операторов цикла. Он также может иметь необязательный пункт else.", - "4": "**Пример:** \n\nnumber = 23\nrunning = True\n\nwhile running:\n guess = int(input('Введите целое число : '))\n\n if guess == number:\n print('Поздравляю, вы угадали.')\n running = False # это останавливает цикл while\n elif guess < number:\n print('Нет, загаданное число немного больше этого.')\n else:\n print('Нет, загаданное число немного меньше этого.')\nelse:\n print('Цикл while закончен.')", - "5": "**Цикл for** \n\nОператор for..in также является оператором цикла, который осуществляет итерацию по последовательности объектов, т.е. проходит через каждый элемент в последовательности. __Мы узнаем больше о последовательностях в дальнейших главах, а пока просто запомните, что последовательность – это упорядоченный набор элементов.__", - "6": "**Пример:** \n\nfor i in range(1, 5):\n print(i)\nelse:\n print('Цикл for закончен')", - "7": "**Оператор break** \n\nОператор break служит для прерывания цикла, т.е. остановки выполнения команд даже если условие выполнения цикла ещё не приняло значения False или последовательность элементов не закончилась.\n\n__Важно отметить, что если циклы for или while прервать оператором break, соответствующие им блоки else выполняться не будут.__", - "8": "**Пример:** \n\nwhile True:\n s = input('Введите что-нибудь : ')\n if s == 'выход':\n break\n print('Длина строки:', len(s))", - "9": "**Оператор continue** \n\nОператор continue используется для указания Python, что необходимо пропустить все оставшиеся команды в текущем блоке цикла и продолжить со следующей итерации цикла", - "10": "**Пример:** \n\nwhile True:\n s = input('Введите что-нибудь : ')\n if s == 'выход':\n break\n if len(s) < 3:\n print('Слишком мало')\n continue\n print('Введённая строка достаточной длины')" + "Урок 5: Поток команд": { + "Предисловие": "В программах, которые мы до сих пор рассматривали, последовательность команд всегда выполнялась Python по порядку строго сверху вниз. А что, если нам необходимо изменить поток выполняющихся команд? Например, если требуется, чтобы программа принимала некоторое решение и выполняла различные действия в зависимости от ситуации; скажем, печатала «Доброе утро» или «Добрый вечер» в зависимости от времени суток. \n\nКак вы уже, наверное, догадались, этого можно достичь при помощи операторов управления потоком. В Python есть три оператора управления потоком: if, for и while.", + "Оператор if": "Оператор if используется для проверки условий: если условие верно, выполняется блок выражений (называемый «if-блок»), иначе выполняется другой блок выражений (называемый «else-блок»). Блок «else» является необязательным.", + "Пример оператора if": "`number = 23`\n`guess = int(input('Введите целое число : '))`\n\n`if guess == number:`\n `print('Поздравляю, вы угадали,') # Начало нового блока`\n `print('(хотя и не выиграли никакого приза!)')`\n`elif guess < number:`\n `print('Нет, загаданное число немного больше этого.') # Ещё один блок`\n`else:`\n `print('Нет, загаданное число немного меньше этого.')`", + "Оператор while": "Оператор while позволяет многократно выполнять блок команд до тех пор, пока выполняется некоторое условие. Это один из так называемых операторов цикла. Он также может иметь необязательный пункт else.", + "Пример оператора while": "`number = 23`\n`running = True`\n\n`while running:`\n `guess = int(input('Введите целое число : '))`\n\n `if guess == number:`\n `print('Поздравляю, вы угадали.')`\n `running = False`\n `elif guess < number:`\n `print('Нет, загаданное число немного больше этого.')`\n `else:`\n `print('Нет, загаданное число немного меньше этого.')`\n`else:`\n `print('Цикл while закончен.')`", + "Цикл for": "Оператор for..in также является оператором цикла, который осуществляет итерацию по последовательности объектов, т.е. проходит через каждый элемент в последовательности. __Мы узнаем больше о последовательностях в дальнейших главах, а пока просто запомните, что последовательность – это упорядоченный набор элементов.__", + "Пример цикла for": "`for i in range(1, 5):`\n `print(i)\nelse:`\n `print('Цикл for закончен')`", + "Оператор break": "Оператор break служит для прерывания цикла, т.е. остановки выполнения команд даже если условие выполнения цикла ещё не приняло значения False или последовательность элементов не закончилась.\n\n__Важно отметить, что если циклы for или while прервать оператором break, соответствующие им блоки else выполняться не будут.__", + "Пример оператора break": "`while True:`\n `s = input('Введите что-нибудь : ')`\n `if s == 'выход'`:\n `break`\n `print('Длина строки:', len(s))`", + "Оператор continue": "Оператор continue используется для указания Python, что необходимо пропустить все оставшиеся команды в текущем блоке цикла и продолжить со следующей итерации цикла", + "Пример оператора continue": "`while True:`\n `s = input('Введите что-нибудь : ')`\n `if s == 'выход':`\n `break`\n `if len(s) < 3:`\n `print('Слишком мало')`\n `continue`\n `print('Введённая строка достаточной длины')`" }, - "Урок 5: Функции": { - "0": "**Предисловие** \n\nФункции – это многократно используемые фрагменты программы. Они позволяют дать имя определённому блоку команд с тем, чтобы впоследствии запускать этот блок по указанному имени в любом месте программы и сколь угодно много раз. Это называется вызовом функции. Мы уже использовали много встроенных функций, как то len и range.\n\nФункции определяются при помощи зарезервированного слова def. После этого слова указывается имя функции, за которым следует пара скобок, в которых можно указать имена некоторых переменных, и заключительное двоеточие в конце строки. Далее следует блок команд, составляющих функцию.", - "1": "**Пример:** \n\ndef sayHello():\n print('Привет, Мир!') # блок, принадлежащий функции\n# Конец функции\n\nsayHello() # вызов функции\nsayHello() # ещё один вызов функции", - "2": "**Как это работает:** \n\nМы определили функцию с именем sayHello, используя описанный выше синтаксис. Эта функция не принимает параметров, поэтому в скобках не объявлены какие-либо переменные. Параметры функции – это некие входные данные, которые мы можем передать функции, чтобы получить соответствующий им результат.", - "3": "**Параметры функций** \n\nФункции могут принимать параметры, т.е. некоторые значения, передаваемые функции для того, чтобы она что-либо сделала с ними. Эти параметры похожи на переменные, за исключением того, что значение этих переменных указывается при вызове функции, и во время работы функции им уже присвоены их значения.\n\nПараметры указываются в скобках при объявлении функции и разделяются запятыми. Аналогично мы передаём значения, когда вызываем функцию. __Обратите внимание на терминологию: имена, указанные в объявлении функции, называются параметрами, тогда как значения, которые вы передаёте в функцию при её вызове, – аргументами.__", - "4": "**Пример:** \n\ndef printMax(a, b):\n if a > b:\n print(a, 'максимально')\n elif a == b:\n print(a, 'равно', b)\n else:\n print(b, 'максимально')\n\nprintMax(3, 4) # прямая передача значений\n\nx = 5\ny = 7\n\nprintMax(x, y) # передача переменных в качестве аргументов", - "5": "**Как это работает:** \n\nЗдесь мы определили функцию с именем printMax, которая использует два параметра с именами a и b. Мы находим наибольшее число с применением простого оператора if..else и выводим это число.\n\nПри первом вызове функции printMax мы напрямую передаём числа в качестве аргументов. Во втором случае мы вызываем функцию с переменными в качестве аргументов. printMax(x, y) назначает значение аргумента x параметру a, а значение аргумента y – параметру b. В обоих случаях функция printMax работает одинаково.", - "6": "**Локальные переменные** \n\nПри объявлении переменных внутри определения функции, они никоим образом не связаны с другими переменными с таким же именем за пределами функции – т.е. имена переменных являются локальными в функции. Это называется областью видимости переменной. Область видимости всех переменных ограничена блоком, в котором они объявлены, начиная с точки объявления имени.", - "7": "**Пример:** \n\nx = 50\n\ndef func(x):\n print('x равен', x\n x = 2\n print('Замена локального x на', x)\n\nfunc(x)\nprint('x по-прежнему', x)", - "8": "**Как это работает:** \n\nПри первом выводе значения, присвоенного имени x, в первой строке функции Python использует значение параметра, объявленного в основном блоке, выше определения функции.\n\nДалее мы назначаем x значение 2. Имя x локально для нашей функции. Поэтому когда мы заменяем значение x в функции, x, объявленный в основном блоке, остаётся незатронутым.\n\nПоследним вызовом функции print мы выводим значение x, указанное в основном блоке, подтверждая таким образом, что оно не изменилось при локальном присваивании значения в ранее вызванной функции.", - "9": "**Зарезервированное слово global** \n\nЧтобы присвоить некоторое значение переменной, определённой на высшем уровне программы необходимо указать глобально. Сделаем это при помощи зарезервированного слова global. Без применения global невозможно присвоить значение переменной, определённой за пределами функции.\n\nИспользование зарезервированного слова global достаточно ясно показывает, что переменная объявлена в самом внешнем блоке.", - "10": "**Пример:** \n\nx = 50\n\ndef func():\n global x\n\n print('x равно', x)\n x = 2\n print('Заменяем глобальное значение x на', x)\n\nfunc()\nprint('Значение x составляет', x)", - "11": "**Как это работает:** \n\nЗарезервированное слово global используется для того, чтобы объявить, что x – это глобальная переменная, а значит, когда мы присваиваем значение имени x внутри функции, это изменение отразится на значении переменной x в основном блоке программы.\n\n__Используя одно зарезервированное слово global, можно объявить сразу несколько переменных: global x, y, z.__", - "12": "**Зарезервированное слово nonlocal**\n\nМы увидели, как получать доступ к переменным в локальной и глобальной области видимости. Есть ещё один тип области видимости, называемый «нелокальной» (nonlocal) областью видимости, который представляет собой нечто среднее между первыми двумя. Нелокальные области видимости встречаются, когда вы определяете функции внутри функций.", - "13": "**Пример:** \n\ndef func_outer():\n x = 2\n print('x равно', x)\n\n def func_inner():\n nonlocal x\n x = 5\n\n func_inner()\n print('Локальное x сменилось на', x)\n\nfunc_outer()", - "14": "**Как это работает:** \n\nКогда мы находимся внутри func_inner, переменная x, определённая в первой строке func_outer находится ни в локальной области видимости (определение переменной не входит в блок func_inner), ни в глобальной области видимости (она также и не в основном блоке программы). Мы объявляем, что хотим использовать именно эту переменную x, следующим образом: nonlocal x.", - "15": "**Значения аргументов по умолчанию** \n\nЗачастую часть параметров функций могут быть необязательными, и для них будут использоваться некоторые заданные значения по умолчанию, если пользователь не укажет собственных. Этого можно достичь с помощью значений аргументов по умолчанию. Их можно указать, добавив к имени параметра в определении функции оператор присваивания (=) с последующим значением.", - "16": "**Пример:** \n\ndef say(message, times = 1):\n print(message * times)\n\nsay('Привет')\nsay('Мир', 5)", - "17": "**Как это работает:** \n\nФункция под именем say используется для вывода на экран строки указанное число раз. Если мы не указываем значения, по умолчанию строка выводится\nодин раз. Мы достигаем этого указанием значения аргумента по умолчанию, равного 1 для параметра times.\n\nПри первом вызове say мы указываем только строку, и функция выводит её один раз. При втором вызове say мы указываем также и аргумент 5, обозначая таким образом, что мы хотим сказать фразу 5 раз.", - "18": "**Ключевые аргументы** \n\nЕсли имеется некоторая функция с большим числом параметров, и при её вызове требуется указать только некоторые из них, значения этих параметров могут задаваться по их имени – это называется ключевые параметры. В этом случае для передачи аргументов функции используется имя (ключ) вместо позиции (как было до сих пор).\n\nЕсть два преимущества такого подхода: во-первых, использование функции становится легче, поскольку нет необходимости отслеживать порядок аргументов; во-вторых, можно задавать значения только некоторым избранным аргументам, при условии, что остальные параметры имеют значения аргумента по умолчанию.", - "19": "**Пример:** \n\ndef func(a, b=5, c=10):\n print('a равно', a, ', b равно', b, ', а c равно', c)\n\nfunc(3, 7)\nfunc(25, c=24)\nfunc(c=50, a=100)", - "20": "**Как это работает:** \n\nФункция с именем func имеет один параметр без значения по умолчанию, за которым следуют два параметра со значениями по умолчанию.\n\nПри первом вызове, func(3, 7), параметр a получает значение 3, параметр b получает значение 7, а c получает своё значение по умолчанию, равное 10.\n\nПри втором вызове func(25, c=24) переменная a получает значение 25 в силу позиции аргумента. После этого параметр c получает значение 24 по имени, т.е. как ключевой параметр. Переменная b получает значение по умолчанию, равное 5.\n\nПри третьем обращении func(c=50, a=100) мы используем ключевые аргументы для всех указанных значений. Обратите внимание на то, что мы указываем значение для параметра c перед значением для a, даже несмотря на то, что в определении функции параметр a указан раньше c.", - "21": "**Переменное число параметров** \n\nИногда бывает нужно определить функцию, способную принимать любое число параметров. Этого можно достичь при помощи звёздочек", - "22": "**Пример:** \n\ndef total(a=5, *numbers, **phonebook):\n print('a', a)\n\n #проход по всем элементам кортежа\n for single_item in numbers:\n print('single_item', single_item)\n\n #проход по всем элементам словаря\n for first_part, second_part in phonebook.items():\n print(first_part,second_part)\n\nprint(total(10,1,2,3,Jack=1123,John=2231,Inge=1560))", - "23": "**Как это работает:** \n\nКогда мы объявляем параметр со звёздочкой (например, *param), все позиционные аргументы начиная с этой позиции и до конца будут собраны в кортеж под именем param.\n\nАналогично, когда мы объявляем параметры с двумя звёздочками (**param), все ключевые аргументы начиная с этой позиции и до конца будут собраны в словарь под именем param.", - "24": "**Оператор return** \n\nОператор return используется для возврата5 из функции, т.е. для прекращения её работы и выхода из неё. При этом можно также вернуть некоторое значение из функции.", - "25": "**Пример:** \n\ndef maximum(x, y):\n if x > y:\n return x\n elif x == y:\n return 'Числа равны.'\n else:\n return y\n\nprint(maximum(2, 3))", - "26": "**Как это работает:** \n\nФункция maximum возвращает максимальный из двух параметров, которые в\nданном случае передаются ей при вызове. Она использует обычный условный оператор if..else для определения наибольшего числа, а затем возвращает это число." + "Урок 6: Функции": { + "Предисловие": "Функции – это многократно используемые фрагменты программы. Они позволяют дать имя определённому блоку команд с тем, чтобы впоследствии запускать этот блок по указанному имени в любом месте программы и сколь угодно много раз. Это называется вызовом функции. Мы уже использовали много встроенных функций, как то len и range.\n\nФункции определяются при помощи зарезервированного слова def. После этого слова указывается имя функции, за которым следует пара скобок, в которых можно указать имена некоторых переменных, и заключительное двоеточие в конце строки. Далее следует блок команд, составляющих функцию.", + "Пример применения функций": "`def sayHello():`\n `print('Привет, Мир!')`\n`sayHello() # вызов функции`", + "Как это работают функции": "Мы определили функцию с именем sayHello, используя описанный выше синтаксис. Эта функция не принимает параметров, поэтому в скобках не объявлены какие-либо переменные. Параметры функции – это некие входные данные, которые мы можем передать функции, чтобы получить соответствующий им результат.", + "Параметры функций": "Функции могут принимать параметры, т.е. некоторые значения, передаваемые функции для того, чтобы она что-либо сделала с ними. Эти параметры похожи на переменные, за исключением того, что значение этих переменных указывается при вызове функции, и во время работы функции им уже присвоены их значения.\n\nПараметры указываются в скобках при объявлении функции и разделяются запятыми. Аналогично мы передаём значения, когда вызываем функцию. __Обратите внимание на терминологию: имена, указанные в объявлении функции, называются параметрами, тогда как значения, которые вы передаёте в функцию при её вызове, – аргументами.__", + "Пример": "`def printMax(a, b):`\n `if a > b:`\n `print(a, 'максимально')`\n `elif a == b:`\n `print(a, 'равно', b)`\n `else:`\n `print(b, 'максимально')`\n\n`printMax(3, 4) # прямая передача значений`\n\n`x = 5`\n`y = 7`\n\n`printMax(x, y) # передача переменных в качестве аргументов`", + "Как это работает": "Здесь мы определили функцию с именем printMax, которая использует два параметра с именами a и b. Мы находим наибольшее число с применением простого оператора if..else и выводим это число.\n\nПри первом вызове функции printMax мы напрямую передаём числа в качестве аргументов. Во втором случае мы вызываем функцию с переменными в качестве аргументов. printMax(x, y) назначает значение аргумента x параметру a, а значение аргумента y – параметру b. В обоих случаях функция printMax работает одинаково.", + "Локальные переменные": "При объявлении переменных внутри определения функции, они никоим образом не связаны с другими переменными с таким же именем за пределами функции – т.е. имена переменных являются локальными в функции. Это называется областью видимости переменной. Область видимости всех переменных ограничена блоком, в котором они объявлены, начиная с точки объявления имени.", + "Пример": "`x = 50`\n\n`def func(x):`\n `print('x равен', x`\n `x = 2`\n `print('Замена локального x на', x)`\n\n`func(x)`\n`print('x по-прежнему', x)`", + "Как это работает": "При первом выводе значения, присвоенного имени x, в первой строке функции Python sиспользует значение параметра, объявленного в основном блоке, выше определения функции.\n\nДалее мы назначаем x значение 2. Имя x локально для нашей функции. Поэтому когда мы заменяем значение x в функции, x, объявленный в основном блоке, остаётся незатронутым.\n\nПоследним вызовом функции print мы выводим значение x, указанное в основном блоке, подтверждая таким образом, что оно не изменилось при локальном присваивании значения в ранее вызванной функции.", + "Зарезервированное слово global": "Чтобы присвоить некоторое значение переменной, определённой на высшем уровне программы необходимо указать глобально. Сделаем это при помощи зарезервированного слова global. Без применения global невозможно присвоить значение переменной, определённой за пределами функции.\n\nИспользование зарезервированного слова global достаточно ясно показывает, что переменная объявлена в самом внешнем блоке.", + "Пример": "`x = 50`\n\n`def func():`\n `global x`\n\n `print('x равно', x)`\n `x = 2`\n `print('Заменяем глобальное значение x на', x)`\n\n`func()`\n`print('Значение x составляет', x)`", + "Как это работает": "Зарезервированное слово global используется для того, чтобы объявить, что x – это глобальная переменная, а значит, когда мы присваиваем значение имени x внутри функции, это изменение отразится на значении переменной x в основном блоке программы.\n\n__Используя одно зарезервированное слово global, можно объявить сразу несколько переменных: global x, y, z.__", + "Зарезервированное слово nonlocal": "****\n\nМы увидели, как получать доступ к переменным в локальной и глобальной области видимости. Есть ещё один тип области видимости, называемый «нелокальной» (nonlocal) областью видимости, который представляет собой нечто среднее между первыми двумя. Нелокальные области видимости встречаются, когда вы определяете функции внутри функций.", + "Пример": "`def func_outer():`\n `x = 2`\n `print('x равно', x)`\n\n `def func_inner():`\n `nonlocal x`\n `x = 5`\n\n `func_inner()`\n `print('Локальное x сменилось на', x)`\n\n`func_outer()`", + "Как это работает": "Когда мы находимся внутри func_inner, переменная x, определённая в первой строке func_outer находится ни в локальной области видимости (определение переменной не входит в блок func_inner), ни в глобальной области видимости (она также и не в основном блоке программы). Мы объявляем, что хотим использовать именно эту переменную x, следующим образом: nonlocal x.", + "Значения аргументов по умолчанию": "Зачастую часть параметров функций могут быть необязательными, и для них будут использоваться некоторые заданные значения по умолчанию, если пользователь не укажет собственных. Этого можно достичь с помощью значений аргументов по умолчанию. Их можно указать, добавив к имени параметра в определении функции оператор присваивания (=) с последующим значением.", + "Пример": "`def say(message, times = 1):`\n `print(message * times)`\n\n`say('Привет')`\n`say('Мир', 5)`", + "Как это работает": "Функция под именем say используется для вывода на экран строки указанное число раз. Если мы не указываем значения, по умолчанию строка выводится\nодин раз. Мы достигаем этого указанием значения аргумента по умолчанию, равного 1 для параметра times.\n\nПри первом вызове say мы указываем только строку, и функция выводит её один раз. При втором вызове say мы указываем также и аргумент 5, обозначая таким образом, что мы хотим сказать фразу 5 раз.", + "Ключевые аргументы": "Если имеется некоторая функция с большим числом параметров, и при её вызове требуется указать только некоторые из них, значения этих параметров могут задаваться по их имени – это называется ключевые параметры. В этом случае для передачи аргументов функции используется имя (ключ) вместо позиции (как было до сих пор).\n\nЕсть два преимущества такого подхода: во-первых, использование функции становится легче, поскольку нет необходимости отслеживать порядок аргументов; во-вторых, можно задавать значения только некоторым избранным аргументам, при условии, что остальные параметры имеют значения аргумента по умолчанию.", + "Пример": "`def func(a, b=5, c=10):`\n `print('a равно', a, ', b равно', b, ', а c равно', c)`\n\n`func(3, 7)`\n`func(25, c=24)`\n`func(c=50, a=100)`", + "Как это работает": "Функция с именем func имеет один параметр без значения по умолчанию, за которым следуют два параметра со значениями по умолчанию.\n\nПри первом вызове, func(3, 7), параметр a получает значение 3, параметр b получает значение 7, а c получает своё значение по умолчанию, равное 10.\n\nПри втором вызове func(25, c=24) переменная a получает значение 25 в силу позиции аргумента. После этого параметр c получает значение 24 по имени, т.е. как ключевой параметр. Переменная b получает значение по умолчанию, равное 5.\n\nПри третьем обращении func(c=50, a=100) мы используем ключевые аргументы для всех указанных значений. Обратите внимание на то, что мы указываем значение для параметра c перед значением для a, даже несмотря на то, что в определении функции параметр a указан раньше c.", + "Переменное число параметров": "Иногда бывает нужно определить функцию, способную принимать любое число параметров. Этого можно достичь при помощи звёздочек", + "Пример": "`def total(a=5, *numbers, **phonebook):`\n `print('a', a)`\n\n `#проход по всем элементам кортежа`\n `for single_item in numbers:`\n `print('single_item', single_item)`\n\n `#проход по всем элементам словаря`\n `for first_part, second_part in phonebook.items():`\n `print(first_part,second_part)`\n\n`print(total(10,1,2,3,Jack=1123,John=2231,Inge=1560))`", + "Как это работает": "Когда мы объявляем параметр со звёздочкой (например, *param), все позиционные аргументы начиная с этой позиции и до конца будут собраны в кортеж под именем param.\n\nАналогично, когда мы объявляем параметры с двумя звёздочками (**param), все ключевые аргументы начиная с этой позиции и до конца будут собраны в словарь под именем param.", + "Оператор return": "Оператор return используется для возврата5 из функции, т.е. для прекращения её работы и выхода из неё. При этом можно также вернуть некоторое значение из функции.", + "Пример": "`def maximum(x, y):`\n `if x > y:`\n `return x`\n `elif x == y:`\n `return 'Числа равны.'`\n `else:`\n `return y`\n\n`print(maximum(2, 3))`", + "Как это работает": "Функция maximum возвращает максимальный из двух параметров, которые в\nданном случае передаются ей при вызове. Она использует обычный условный оператор if..else для определения наибольшего числа, а затем возвращает это число." }, - "Урок 6: Модули": { - "0": "**Предисловие** \n\nКак можно использовать код повторно, помещая его в функции, мы уже видели. А что, если нам понадобится повторно использовать различные функции в других наших программах? Как вы уже, наверное, догадались, ответ – модули.\n\nСуществуют разные способы составления модулей, но самый простой – это создать файл с расширением .py, содержащий функции и переменные.\n\nДругой способ – написать модуль на том языке программирования, на котором написан сам интерпретатор Python. Например, можно писать модули на языке программирования C, которые после компиляции могут использоваться стандартным интерпретатором Python\n\nСперва посмотрим, как использовать модули стандартной библиотеки.", - "1": "**Пример:** \n\nimport sys\n\nprint('Аргументы командной строки:')\nfor i in sys.argv:\n print(i)\n\nprint('\\n\\nПеременная PYTHONPATH содержит', sys.path, '\\n')", - "2": "**Как это работает:** \n\nМы импортируем модуль sys.\n\nКогда выполняется команда import sys, идёт поиск модуля sys.\n\nДоступ к переменной argv в модуле sys предоставляется при помощи точки, т.е. sys.argv. Это явно показывает, что это имя является частью модуля sys.\n\nКогда мы запускаем «python using_sys.py we are arguments», мы запускаем модуль using_sys.py командой python, а всё, что следует далее – аргументы, передаваемые программе. Python сохраняет аргументы командной строки в переменной sys.argv для дальнейшего использования.", - "3": "**Файлы байткода .pyc** \n\nИмпорт модуля – относительно дорогостоящее мероприятие, поэтому Python предпринимает некоторые трюки для ускорения этого процесса. Один из способов – создать байткомпилированные файлы (или байткод) с расширением .pyc, которые являются некой промежуточной формой, в которую Python переводит программу (помните раздел «Введение» о том, как работает Python?). Такой файл .pyc полезен при импорте модуля в следующий раз в другую программу – это произойдёт намного быстрее, поскольку значительная часть обработки, требуемой при импорте модуля, будет уже проделана. Этот байткод также является платформо-независимым.", - "4": "**Оператор from... import...** \n\nЧтобы импортировать переменную argv прямо в программу и не писать всякий раз sys. При обращении к ней, можно воспользоваться выражением «from sys import argv».\n\nДля импорта всех имён, использующихся в модуле sys, можно выполнить команду «from sys import *». Это работает для любых модулей.\n\nВ общем случае вам следует избегать использования этого оператора и использовать вместо этого оператор import, чтобы предотвратить конфликты имён и не затруднять чтение программы.", - "5": "**Создание собственных модулей** \n\nСоздать собственный модуль очень легко. Да вы всё время делали это! Ведь каждая программа на Python также является и модулем. Необходимо лишь убедиться, что у неё установлено расширение .py.", - "6": "**Пример:** \n\ndef sayhi():\n print('Привет! Это говорит мой модуль.')\n\n__version__ = '0.1'\n\n# Конец модуля mymodule.py", - "7": "**Функция dir** \n\nВстроенная функция dir() возвращает список имён, определяемых объектом. Например, для модуля в этот список входят функции, классы и переменные, определённые в этом модуле.\n\nЭта функция может принимать аргументы. Если в качестве аргумента указано имя модуля, она возвращает список имён, определённых в этом модуле. Если никакого аргумента не передавать, она вернёт список имён, определённых в текущем модуле.", - "8": "**Пример:** \n\n$ python3\n\n>>> import sys # получим список атрибутов модуля 'sys'\n\n>>> dir(sys)\n['getfilesystemencoding', 'getprofile', 'getrecursionlimit', 'getrefcount', 'getsizeof', 'gettrace', porter_cache', 'platform', 'prefix', 'ps1', 'ps2', 'setcheckinterval', 'setprofile', 'setrecursionlimit', 'settrace', 'stderr', 'stdin', 'stdout', 'subversion', 'version', 'version_info', 'warnoptions', 'winver']\n\n>>> dir() # получим список атрибутов текущего модуля\n['__builtins__', '__doc__', '__name__', '__package__', 'sys']\n\n>>> a = 5 # создадим новую переменную 'a'\n\n>>> dir()\n['__builtins__', '__doc__', '__name__', '__package__', 'a', 'sys']\n\n>>> del a # удалим имя 'a'\n\n>>> dir()\n['__builtins__', '__doc__', '__name__', '__package__', 'sys']\n\n>>>", - "9": "**Как это работает:** \n\nМы вызываем функцию dir, не передавая ей параметров. По умолчанию, она возвращает список атрибутов текущего модуля. __Обратите внимание, что список импортированных модулей также входит туда.__\n\nЧтобы пронаблюдать за действием dir, мы определяем новую переменную a и присваиваем ей значение, а затем снова вызываем dir. Видим, что в полученном списке появилось дополнительное значение. Удалим переменную/атрибут из текущего модуля при помощи оператора del, и изменения вновь отобразятся на выводе функции dir.\n\nЗамечание по поводу del: этот оператор используется для удаления переменной/имени, и после его выполнения, в данном случае – del a, к переменной a больше невозможно обратиться – её как будто никогда и не было.", - "10": "**Пакеты** \n\nК настоящему времени вы, вероятно, начали наблюдать некоторую иерархию в организации ваших программ. Переменные обычно находятся в функциях. Функции и глобальные переменные обычно находятся в модулях. А что, если возникнет необходимость как-то организовать модули? Вот здесь-то и выходят на сцену пакеты.\n\nПакеты – это просто каталоги с модулями и специальным файлом __init__.py, который показывает Python, что этот каталог особый, так как содержит модули Python.\n\nПредставим, что мы хотим создать пакет под названием «world» с субпакетами «asia», «africa» и т.д., которые, в свою очередь, будут содержать модули «india», «madagascar» и т.д.", - "11": "**Пример:** \n\nПредставим, что мы хотим создать пакет под названием «world» с субпакетами «asia», «africa» и т.д., которые, в свою очередь, будут содержать модули «india», «madagascar» и т.д.\n\nДля этого следовало бы создать следующую структуру каталогов:\n\n| - <некоторый каталог из sys.path>/\n| |---- world/\n| |---- __init__.py\n| |---- asia/\n| | |---- __init__.py\n| | |---- india/\n| | |---- __init__.py\n| | |---- foo.py\n| |---- africa/\n| |---- __init__.py\n| |---- madagascar/\n| |---- __init__.py\n| |---- bar.py" + "Урок 7: Модули": { + "Предисловие": "Как можно использовать код повторно, помещая его в функции, мы уже видели. А что, если нам понадобится повторно использовать различные функции в других наших программах? Как вы уже, наверное, догадались, ответ – модули.\n\nСуществуют разные способы составления модулей, но самый простой – это создать файл с расширением .py, содержащий функции и переменные.\n\nДругой способ – написать модуль на том языке программирования, на котором написан сам интерпретатор Python. Например, можно писать модули на языке программирования C, которые после компиляции могут использоваться стандартным интерпретатором Python\n\nСперва посмотрим, как использовать модули стандартной библиотеки.", + "Пример": "`import sys`\n\n`print('Аргументы командной строки:')`\n`for i in sys.argv:`\n `print(i)`\n\n`print('\\n\\nПеременная PYTHONPATH содержит', sys.path, '\\n')`", + "Как это работает": "Мы импортируем модуль sys.\n\nКогда выполняется команда import sys, идёт поиск модуля sys.\n\nДоступ к переменной argv в модуле sys предоставляется при помощи точки, т.е. sys.argv. Это явно показывает, что это имя является частью модуля sys.\n\nКогда мы запускаем «python using_sys.py we are arguments», мы запускаем модуль using_sys.py командой python, а всё, что следует далее – аргументы, передаваемые программе. Python сохраняет аргументы командной строки в переменной sys.argv для дальнейшего использования.", + "Файлы байткода .pyc": "Импорт модуля – относительно дорогостоящее мероприятие, поэтому Python предпринимает некоторые трюки для ускорения этого процесса. Один из способов – создать байткомпилированные файлы (или байткод) с расширением .pyc, которые являются некой промежуточной формой, в которую Python переводит программу (помните раздел «Введение» о том, как работает Python?). Такой файл .pyc полезен при импорте модуля в следующий раз в другую программу – это произойдёт намного быстрее, поскольку значительная часть обработки, требуемой при импорте модуля, будет уже проделана. Этот байткод также является платформо-независимым.", + "Оператор from... import...": "Чтобы импортировать переменную argv прямо в программу и не писать всякий раз sys. При обращении к ней, можно воспользоваться выражением «from sys import argv».\n\nДля импорта всех имён, использующихся в модуле sys, можно выполнить команду «from sys import *». Это работает для любых модулей.\n\nВ общем случае вам следует избегать использования этого оператора и использовать вместо этого оператор import, чтобы предотвратить конфликты имён и не затруднять чтение программы.", + "Создание собственных модулей": "Создать собственный модуль очень легко. Да вы всё время делали это! Ведь каждая программа на Python также является и модулем. Необходимо лишь убедиться, что у неё установлено расширение .py.", + "Пример": "`def sayhi():`\n `print('Привет! Это говорит мой модуль.')`\n\n`__version__ = '0.1'`\n\n`# Конец модуля mymodule.py`", + "Функция dir": "Встроенная функция dir() возвращает список имён, определяемых объектом. Например, для модуля в этот список входят функции, классы и переменные, определённые в этом модуле.\n\nЭта функция может принимать аргументы. Если в качестве аргумента указано имя модуля, она возвращает список имён, определённых в этом модуле. Если никакого аргумента не передавать, она вернёт список имён, определённых в текущем модуле.", + "Пример": "`$ python3`\n\n`>>> import sys # получим список атрибутов модуля 'sys'`\n\n`>>> dir(sys)`\n`['getfilesystemencoding', 'getprofile', 'getrecursionlimit', 'getrefcount', 'getsizeof', 'gettrace', porter_cache', 'platform', 'prefix', 'ps1', 'ps2', 'setcheckinterval', 'setprofile', 'setrecursionlimit', 'settrace', 'stderr', 'stdin', 'stdout', 'subversion', 'version', 'version_info', 'warnoptions', 'winver']`\n\n`>>> dir() # получим список атрибутов текущего модуля`\n`['__builtins__', '__doc__', '__name__', '__package__', 'sys']`\n\n`>>> a = 5 # создадим новую переменную 'a'`\n\n`>>> dir()`\n`['__builtins__', '__doc__', '__name__', '__package__', 'a', 'sys']`\n\n`>>> del a # удалим имя 'a'`\n\n`>>> dir()`\n`['__builtins__', '__doc__', '__name__', '__package__', 'sys']`\n\n`>>>`", + "Как это работает": "Мы вызываем функцию dir, не передавая ей параметров. По умолчанию, она возвращает список атрибутов текущего модуля. __Обратите внимание, что список импортированных модулей также входит туда.__\n\nЧтобы пронаблюдать за действием dir, мы определяем новую переменную a и присваиваем ей значение, а затем снова вызываем dir. Видим, что в полученном списке появилось дополнительное значение. Удалим переменную/атрибут из текущего модуля при помощи оператора del, и изменения вновь отобразятся на выводе функции dir.\n\nЗамечание по поводу del: этот оператор используется для удаления переменной/имени, и после его выполнения, в данном случае – del a, к переменной a больше невозможно обратиться – её как будто никогда и не было.", + "Пакеты": "К настоящему времени вы, вероятно, начали наблюдать некоторую иерархию в организации ваших программ. Переменные обычно находятся в функциях. Функции и глобальные переменные обычно находятся в модулях. А что, если возникнет необходимость как-то организовать модули? Вот здесь-то и выходят на сцену пакеты.\n\nПакеты – это просто каталоги с модулями и специальным файлом __init__.py, который показывает Python, что этот каталог особый, так как содержит модули Python.\n\nПредставим, что мы хотим создать пакет под названием «world» с субпакетами «asia», «africa» и т.д., которые, в свою очередь, будут содержать модули «india», «madagascar» и т.д.", + "Пример": "Представим, что мы хотим создать пакет под названием «world» с субпакетами «asia», «africa» и т.д., которые, в свою очередь, будут содержать модули «india», «madagascar» и т.д.\n\nДля этого следовало бы создать следующую структуру каталогов:\n\n`| - <некоторый каталог из sys.path>/`\n`| |---- world/`\n`| |---- __init__.py`\n`| |---- asia/`\n`| | |---- __init__.py`\n`| | |---- india/`\n`| | |---- __init__.py`\n`| | |---- foo.py`\n`| |---- africa/`\n`| |---- __init__.py`\n`| |---- madagascar/`\n`| |---- __init__.py`\n`| |---- bar.py`" }, - "Урок 7: Структуры данных": { - "0": "**Предисловие** \n\nСтруктуры данных – это, по сути, и есть структуры, которые могут хранить некоторые данные вместе. Другими словами, они используются для хранения связанных данных.\n\nВ Python существуют четыре встроенных структуры данных: список, кортеж, словарь и множество. Посмотрим, как ими пользоваться, и как они могут облегчить нам жизнь.", - "1": "**Список** \n\nСписок – это структура данных, которая содержит упорядоченный набор элементов, т.е. хранит последовательность элементов. Это легко представить, если вспомнить список покупок, в котором перечисляется, что нужно купить, с тем лишь исключением, что в списке покупок каждый элемент обычно размещается на отдельной строке, тогда как в Python они разделяются запятыми.\n\nСписок элементов должен быть заключён в квадратные скобки, чтобы Python понял, что это список. Как только список создан, можно добавлять, удалять или искать элементы в нём. Поскольку элементы можно добавлять и удалять, мы говорим, что список – это изменяемый тип данных, т.е. его можно модифицировать.", - "2": "**Краткое введение в объекты и классы** \n\nСписок – это один из примеров использования объектов и классов. Когда мы назначаем некоторой переменной i значение, скажем, целое число 5, это можно представить себе как создание объекта (т.е. экземпляра) i класса (т.е. типа) int. Чтобы лучше понять это, прочитайте help(int).\n\nКласс может также иметь методы, т.е. функции, определённые для использования только применительно к данному классу. Этот функционал будет доступен только когда имеется объект данного класса. Например, Python предоставляет метод append для класса list, который позволяет добавлять элемент к концу списка. Так mylist.append('and item') добавит эту строку к списку mylist. Обратите внимание на обозначение точкой для доступа к методам объектов.", - "3": "**Пример:** \n\nshoplist = ['яблоки', 'манго', 'морковь', 'бананы']\n\nprint('Я должен сделать', len(shoplist), 'покупки.')\n\nprint('Покупки:', end=' ')\nfor item in shoplist:\n print(item, end=' ')\n\nprint('\\nТакже нужно купить риса.')\nshoplist.append('рис')\nprint('Теперь мой список покупок таков:', shoplist)\n\nprint('Отсортирую-ка я свой список')\nshoplist.sort()\nprint('Отсортированный список покупок выглядит так:', shoplist)\n\nprint('Первое, что мне нужно купить, это', shoplist[0])\nolditem = shoplist[0]\ndel shoplist[0]\nprint('Я купил', olditem)\nprint('Теперь мой список покупок:', shoplist)", - "4": "**Как это работает:** \n\nВ shoplist мы храним только строки с названиями того, что нужно купить.\n\nДалее мы добавляем элемент к списку при помощи append – метода объекта списка. Затем мы проверяем, действительно ли элемент был добавлен к списку, выводя содержимое списка на экран.\n\nЗатем мы сортируем список, используя метод sort объекта списка.\n\nДалее после совершения покупки мы хотим удалить её из списка. Это достигается применением оператора del.", - "5": "**Кортеж** \n\nКортежи служат для хранения нескольких объектов вместе. Их можно рассматривать как аналог списков, но без такой обширной функциональности, которую предоставляет класс списка. Одна из важнейших особенностей кортежей заключается в том, что они неизменяемы, так же, как и строки. Т.е. модифицировать кортежи невозможно.\n\nКортежи обозначаются указанием элементов, разделённых запятыми; по желанию их можно ещё заключить в круглые скобки.\n\nКортежи обычно используются в тех случаях, когда оператор или пользовательская функция должны наверняка знать, что набор значений, т.е. кортеж значений, не изменится.", - "6": "**Пример:** \n\nzoo = ('питон', 'слон', 'пингвин') # помните, что скобки не обязательны\nprint('Количество животных в зоопарке -', len(zoo))\n\nnew_zoo = 'обезьяна', 'верблюд', zoo\nprint('Количество клеток в зоопарке -', len(new_zoo))\nprint('Все животные в новом зоопарке:', new_zoo)\nprint('Животные, привезённые из старого зоопарка:', new_zoo[2])\nprint('Последнее животное, привезённое из старого зоопарка -', new_zoo[2][2])\nprint('Количество животных в новом зоопарке -', len(new_zoo)-1 + \\\n len(new_zoo[2]))", - "7": "**Как это работает:** \n\nПеременная zoo обозначает кортеж элементов. Функция len позволяет получить длину кортежа.\n\nТеперь мы перемещаем этих животных в новый зоопарк. Поэтому кортеж new_zoo содержит тех животных, которые уже там, наряду с привезёнными из старого зоопарка.\n\nДоступ к элементам кортежа осуществляется указанием позиции элемента, заключённой в квадратные скобки. Это называется оператором индексирования. Доступ к третьему элементу в new_zoo мы получаем, указывая new_zoo[2], а доступ к третьему элементу внутри третьего элемента в кортеже new_zoo – указывая new_zoo[2][2].", - "8": "**Словарь** \n\nСловарь – это некий аналог адресной книги, в которой можно найти адрес или контактную информацию о человеке, зная лишь его имя; т.е. некоторые ключи связаны со значениями.\n\nПары ключ-значение указываются в словаре следующим образом: «d = {key1 : value1, key2 : value2 }». Обратите внимание, что ключ и значение разделяются двоеточием, а пары друг от друга отделяются запятыми, а затем всё это заключается в фигурные скобки.", - "9": "**Пример:** \n\nab = { 'Swaroop' : 'swaroop@swaroopch.com',\n 'Larry' : 'larry@wall.org',\n 'Matsumoto' : 'matz@ruby-lang.org',\n 'Spammer' : 'spammer@hotmail.com'\n }\n\nprint(\"Адрес Swaroop'а:\", ab['Swaroop'])\n\n# Удаление пары ключ-значение\ndel ab['Spammer']\n\nprint('\\nВ адресной книге {0} контакта\\n'.format(len(ab)))\n print('Контакт {0} с адресом {1}'.format(name, address))\n\n# Добавление пары ключ-значение\nab['Guido'] = 'guido@python.org'\n\nif 'Guido' in ab:\n print(\"\\nАдрес Guido:\", ab['Guido'])", - "10": "**Как это работает:** \n\nМы создаём словарь ab. Затем мы обращаемся к парам ключ-значение. Как видите, синтаксис прост.\n\nУдалять пары ключ-значение можно при помощи оператора del. Мы указываем имя словаря и оператор индексирования для удаляемого ключа, после чего передаём это оператору del.\n\nДалее мы обращаемся ко всем парам ключ-значение нашего словаря, используя метод items, который возвращает список кортежей, каждый из которых содержит пару элементов: ключ и значение. Мы получаем эту пару и присваиваем её значение переменным name и address соответственно в цикле for..in, а затем выводим эти значения на экран в блоке for.", - "11": "**Последовательности** \n\nСписки, кортежи и строки являются примерами последовательностей. Но что такое последовательности и что в них такого особенного?\n\nОсновные возможности – это проверка принадлежности (т.е. выражения «in» и «not in») и оператор индексирования, позволяющий получить напрямую некоторый элемент последовательности.\n\nВсе три типа последовательностей, упоминавшиеся выше (списки, кортежи и строки), также предоставляют операцию получения вырезки, которая позволяет получить вырезку последовательности, т.е. её фрагмент.", - "12": "**Пример:** \n\nshoplist = ['яблоки', 'манго', 'морковь', 'бананы']\nname = 'swaroop'\n\n# Операция индексирования\nprint('Элемент 0 -', shoplist[0])\nprint('Элемент 1 -', shoplist[1])\nprint('Элемент 2 -', shoplist[2])\nprint('Элемент 3 -', shoplist[3])\nprint('Элемент -1 -', shoplist[-1])\nprint('Элемент -2 -', shoplist[-2])\nprint('Символ 0 -', name[0])\n\n# Вырезка из списка\nprint('Элементы с 1 по 3:', shoplist[1:3])\nprint('Элементы с 2 до конца:', shoplist[2:])\nprint('Элементы с 1 по -1:', shoplist[1:-1])\nprint('Элементы от начала до конца:', shoplist[:])\n\n# Вырезка из строки\nprint('Символы с 1 по 3:', name[1:3])\nprint('Символы с 2 до конца:', name[2:])\nprint('Символы с 1 до -1:', name[1:-1])\nprint('Символы от начала до конца:', name[:])" + "Урок 8: Структуры данных": { + "Предисловие": "Структуры данных – это, по сути, и есть структуры, которые могут хранить некоторые данные вместе. Другими словами, они используются для хранения связанных данных.\n\nВ Python существуют четыре встроенных структуры данных: список, кортеж, словарь и множество. Посмотрим, как ими пользоваться, и как они могут облегчить нам жизнь.", + "Список": "Список – это структура данных, которая содержит упорядоченный набор элементов, т.е. хранит последовательность элементов. Это легко представить, если вспомнить список покупок, в котором перечисляется, что нужно купить, с тем лишь исключением, что в списке покупок каждый элемент обычно размещается на отдельной строке, тогда как в Python они разделяются запятыми.\n\nСписок элементов должен быть заключён в квадратные скобки, чтобы Python понял, что это список. Как только список создан, можно добавлять, удалять или искать элементы в нём. Поскольку элементы можно добавлять и удалять, мы говорим, что список – это изменяемый тип данных, т.е. его можно модифицировать.", + "Краткое введение в объекты и классы": "Список – это один из примеров использования объектов и классов. Когда мы назначаем некоторой переменной i значение, скажем, целое число 5, это можно представить себе как создание объекта (т.е. экземпляра) i класса (т.е. типа) int. Чтобы лучше понять это, прочитайте help(int).\n\nКласс может также иметь методы, т.е. функции, определённые для использования только применительно к данному классу. Этот функционал будет доступен только когда имеется объект данного класса. Например, Python предоставляет метод append для класса list, который позволяет добавлять элемент к концу списка. Так mylist.append('and item') добавит эту строку к списку mylist. Обратите внимание на обозначение точкой для доступа к методам объектов.", + "Пример": "`shoplist = ['яблоки', 'манго', 'морковь', 'бананы']`\n\n`print('Я должен сделать', len(shoplist), 'покупки.')`\n\n`print('Покупки:', end=' ')`\n`for item in shoplist:`\n `print(item, end=' ')`\n\n`print('\\nТакже нужно купить риса.')`\n`shoplist.append('рис')`\n`print('Теперь мой список покупок таков:', shoplist)`\n\n`print('Отсортирую-ка я свой список')`\n`shoplist.sort()`\n`print('Отсортированный список покупок выглядит так:', shoplist)`\n\n`print('Первое, что мне нужно купить, это', shoplist[0])`\n`olditem = shoplist[0]`\n`del shoplist[0]`\n`print('Я купил', olditem)`\n`print('Теперь мой список покупок:', shoplist)`", + "Как это работает": "В shoplist мы храним только строки с названиями того, что нужно купить.\n\nДалее мы добавляем элемент к списку при помощи append – метода объекта списка. Затем мы проверяем, действительно ли элемент был добавлен к списку, выводя содержимое списка на экран.\n\nЗатем мы сортируем список, используя метод sort объекта списка.\n\nДалее после совершения покупки мы хотим удалить её из списка. Это достигается применением оператора del.", + "Кортеж": "Кортежи служат для хранения нескольких объектов вместе. Их можно рассматривать как аналог списков, но без такой обширной функциональности, которую предоставляет класс списка. Одна из важнейших особенностей кортежей заключается в том, что они неизменяемы, так же, как и строки. Т.е. модифицировать кортежи невозможно.\n\nКортежи обозначаются указанием элементов, разделённых запятыми; по желанию их можно ещё заключить в круглые скобки.\n\nКортежи обычно используются в тех случаях, когда оператор или пользовательская функция должны наверняка знать, что набор значений, т.е. кортеж значений, не изменится.", + "Пример": "`zoo = ('питон', 'слон', 'пингвин') # помните, что скобки не обязательны`\n`print('Количество животных в зоопарке -', len(zoo))`\n\n`new_zoo = 'обезьяна', 'верблюд', zoo`\n`print('Количество клеток в зоопарке -', len(new_zoo))`\n`print('Все животные в новом зоопарке:', new_zoo)`\n`print('Животные, привезённые из старого зоопарка:', new_zoo[2])`\n`print('Последнее животное, привезённое из старого зоопарка -', new_zoo[2][2])`\n`print('Количество животных в новом зоопарке -', len(new_zoo)-1 + \\`\n `len(new_zoo[2])`", + "Как это работает": "Переменная zoo обозначает кортеж элементов. Функция len позволяет получить длину кортежа.\n\nТеперь мы перемещаем этих животных в новый зоопарк. Поэтому кортеж new_zoo содержит тех животных, которые уже там, наряду с привезёнными из старого зоопарка.\n\nДоступ к элементам кортежа осуществляется указанием позиции элемента, заключённой в квадратные скобки. Это называется оператором индексирования. Доступ к третьему элементу в new_zoo мы получаем, указывая new_zoo[2], а доступ к третьему элементу внутри третьего элемента в кортеже new_zoo – указывая new_zoo[2][2].", + "Словарь": "Словарь – это некий аналог адресной книги, в которой можно найти адрес или контактную информацию о человеке, зная лишь его имя; т.е. некоторые ключи связаны со значениями.\n\nПары ключ-значение указываются в словаре следующим образом: «d = {key1 : value1, key2 : value2 }». Обратите внимание, что ключ и значение разделяются двоеточием, а пары друг от друга отделяются запятыми, а затем всё это заключается в фигурные скобки.", + "Пример": "`ab = { 'Swaroop' : 'swaroop@swaroopch.com',`\n `'Larry' : 'larry@wall.org',`\n `'Matsumoto' : 'matz@ruby-lang.org',`\n `'Spammer' : 'spammer@hotmail.com'`\n `}`\n\n`print(\"Адрес Swaroop'а:\", ab['Swaroop'])`\n\n`# Удаление пары ключ-значение`\n`del ab['Spammer']`\n\n`print('\\nВ адресной книге {0} контакта\\n'.format(len(ab)))`\n `print('Контакт {0} с адресом {1}'.format(name, address))`\n\n`# Добавление пары ключ-значение`\n`ab['Guido'] = 'guido@python.org'`\n\n`if 'Guido' in ab:`\n `print(\"\\nАдрес Guido:\", ab['Guido'])`", + "Как это работает": "Мы создаём словарь ab. Затем мы обращаемся к парам ключ-значение. Как видите, синтаксис прост.\n\nУдалять пары ключ-значение можно при помощи оператора del. Мы указываем имя словаря и оператор индексирования для удаляемого ключа, после чего передаём это оператору del.\n\nДалее мы обращаемся ко всем парам ключ-значение нашего словаря, используя метод items, который возвращает список кортежей, каждый из которых содержит пару элементов: ключ и значение. Мы получаем эту пару и присваиваем её значение переменным name и address соответственно в цикле for..in, а затем выводим эти значения на экран в блоке for.", + "Последовательности": "Списки, кортежи и строки являются примерами последовательностей. Но что такое последовательности и что в них такого особенного?\n\nОсновные возможности – это проверка принадлежности (т.е. выражения «in» и «not in») и оператор индексирования, позволяющий получить напрямую некоторый элемент последовательности.\n\nВсе три типа последовательностей, упоминавшиеся выше (списки, кортежи и строки), также предоставляют операцию получения вырезки, которая позволяет получить вырезку последовательности, т.е. её фрагмент.", + "Пример": "`shoplist = ['яблоки', 'манго', 'морковь', 'бананы']`\n`name = 'swaroop'`\n\n`# Операция индексирования`\n`print('Элемент 0 -', shoplist[0])`\n`print('Элемент 1 -', shoplist[1])`\n`print('Элемент 2 -', shoplist[2])`\n`print('Элемент 3 -', shoplist[3])`\n`print('Элемент -1 -', shoplist[-1])`\n`print('Элемент -2 -', shoplist[-2])`\n`print('Символ 0 -', name[0])`\n\n`# Вырезка из списка`\n`print('Элементы с 1 по 3:', shoplist[1:3])`\n`print('Элементы с 2 до конца:', shoplist[2:])`\n`print('Элементы с 1 по -1:', shoplist[1:-1])`\n`print('Элементы от начала до конца:', shoplist[:])`\n\n`# Вырезка из строки`\n`print('Символы с 1 по 3:', name[1:3])`\n`print('Символы с 2 до конца:', name[2:])`\n`print('Символы с 1 до -1:', name[1:-1])`\n`print('Символы от начала до конца:', name[:])`" }, - "Урок 8: Исключения": { - "0": "**Предисловие** \n\nИсключения возникают тогда, когда в программе возникает некоторая исключительная ситуация. Например, к чему приведёт попытка чтения несуществующего файла? Или если файл был случайно удалён, пока программа работала? Такие ситуации обрабатываются при помощи исключений.\n\nЭто касается и программ, содержащих недействительные команды. В этом случае Python поднимает руки и сообщает, что обнаружил ошибку.", - "1": "**Ошибки** \n\nРассмотрим простой вызов функции print. Что, если мы ошибочно напишем print как Print? Обратите внимание на заглавную букву. В этом случае Python поднимает синтаксическую ошибку.", - "2": "**Пример:** \n\n>>> Print('Привет, Мир!')\nTraceback (most recent call last):\n File \"\", line 1, in \n Print('Привет, Мир!')\nNameError: name 'Print' is not defined\n\nОбратите внимание, что была поднята ошибка NameError, а также указано место, где была обнаружена ошибка. Так в данном случае действует обработчик ошибок.", - "3": "**Исключения** \n\nПопытаемся считать что-либо от пользователя. Нажмите Сtrl-D (или Ctrl+Z в Windows) и посмотрите, что произойдёт.", - "4": "**Пример:** \n\n>>> s = input('Введите что-нибудь --> ')\n\nВведите что-нибудь -->\nTraceback (most recent call last):\n File \"\", line 1, in \n s = input('Введите что-нибудь --> ') \nEOFError: EOF when reading a line\n\nPython поднимает ошибку с именем EOFError, что означает, что он обнаружил символ конца файла (который вводится при помощи Ctrl-D) там, где не ожидал.", - "5": "**Обработка исключений** \n\nОбрабатывать исключения можно при помощи оператора try..except. При этом все обычные команды помещаются внутрь try-блока, а все обработчики исключений – в except-блок.", - "6": "**Пример:** \n\ntry:\n text = input('Введите что-нибудь --> ')\nexcept EOFError:\n print('Ну зачем вы сделали мне EOF?')\nexcept KeyboardInterrupt:\n print('Вы отменили операцию.')\nelse:\n print('Вы ввели {0}'.format(text))", - "7": "**Как это работает:** \n\nЗдесь мы поместили все команды, которые могут вызвать исключения/ошибки, внутрь блока try, а затем поместили обработчики соответствующих ошибок/исключений в блок except. Выражение except может обрабатывать как одиночную ошибку или исключение, так и список ошибок/исключений в скобках. Если не указано имя ошибки или исключения, обрабатываться будут все ошибки и исключения.", - "8": "**Вызов исключения** \n\nИсключение можно поднять при помощи оператора raise, передав ему имя ошибки/исключения, а также объект исключения, который нужно выбросить.\n\nВызываемая ошибка или исключение должна быть классом, который прямо или непрямо является производным от класса Exception.", - "9": "**Пример:** \n\nclass ShortInputException(Exception):\n '''Пользовательский класс исключения.'''\n def __init__(self, length, atleast):\n Exception.__init__(self)\n self.length = length\n self.atleast = atleast\n\ntry:\n text = input('Введите что-нибудь --> ')\n if len(text) < 3:\n raise ShortInputException(len(text), 3)\n # Здесь может происходить обычная работа\nexcept EOFError:\n print('Ну зачем вы сделали мне EOF?')\nexcept ShortInputException as ex:\n print('ShortInputException: Длина введённой строки -- {0}; \\\n ожидалось, как минимум, {1}'.format(ex.length, ex.atleast))\nelse:\n print('Не было исключений.')", - "10": "**Как это работает:** \n\nЗдесь мы создаём наш собственный тип исключения. Этот новый тип исключения называется ShortInputException. Он содержит два поля: length, хранящее длину введённого текста, и atleast, указывающее, какую минимальную длину текста ожидала программа.\n\nВ пункте except мы указываем класс ошибки ShortInputException, который будет сохранён как переменная ex, содержащая соответствующий объект ошибки/исключения. Это аналогично параметрам и аргументам при вызове функции. Внутри этого пункта except мы используем поля length и atleast объекта исключения для вывода необходимых сообщений пользователю.", - "11": "**Try .. Finally** \n\nПредставим, что в программе происходит чтение файла и необходимо убедиться, что объект файла был корректно закрыт и что не возникло никакого исключения. Этого можно достичь с применением блока finally.", - "12": "**Пример:** \n\nimport time\n\ntry:\n f = open('poem.txt')\n while True: # наш обычный способ читать файлы\n line = f.readline()\n if len(line) == 0:\n break\n print(line, end='')\n time.sleep(2) # Пусть подождёт некоторое время\nexcept KeyboardInterrupt:\n print('!! Вы отменили чтение файла.')\nfinally:\n f.close()\n print('(Очистка: Закрытие файла)')", - "13": "**Как это работает:** \n\nЗдесь мы производим обычные операции чтения из файла, но в данном случае добавляем двухсекундный сон после вывода каждой строки при помощи функции time.sleep, чтобы программа выполнялась медленно (ведь Python очень быстр от природы). Во время выполнения программы нажмите ctrl-c, чтобы прервать/отменить выполнение программы.\n\nПронаблюдайте, как при этом выдаётся исключение KeyboardInterrupt, и программа выходит. Однако, прежде чем программа выйдет, выполняется пункт finally, и файловый объект будет всегда закрыт.", - "14": "**Оператор with** \n\nТипичной схемой является запрос некоторого ресурса в блоке try с последующим освобождением этого ресурса в блоке finally. Для того, чтобы сделать это более «чисто»,существует оператор with:", - "15": "**Пример:** \n\nwith open(\"poem.txt\") as f:\n for line in f:\n print(line, end='')", - "16": "**Как это работает:** \n\nСуществует некий протокол, используемый оператором with. Он считывает объект, возвращаемый операторомopen.Назовём его в данном случае «thefile».\n\nПеред запуском блока кода, содержащегося в нём, оператор with всегда вызывает функцию thefile.__enter__, а также всегда вызывает thefile.__exit__ после завершения выполнения этого блока кода.\n\nТак что код, который мы бы написали в блоке finally, будет автоматически обработан методом __exit__. Это избавляет нас от необходимости повторно в явном виде указывать операторы try..finally." + "Урок 9: Исключения": { + "Предисловие": "Исключения возникают тогда, когда в программе возникает некоторая исключительная ситуация. Например, к чему приведёт попытка чтения несуществующего файла? Или если файл был случайно удалён, пока программа работала? Такие ситуации обрабатываются при помощи исключений.\n\nЭто касается и программ, содержащих недействительные команды. В этом случае Python поднимает руки и сообщает, что обнаружил ошибку.", + "Ошибки": "Рассмотрим простой вызов функции print. Что, если мы ошибочно напишем print как Print? Обратите внимание на заглавную букву. В этом случае Python поднимает синтаксическую ошибку.", + "Пример": "`>>> Print('Привет, Мир!')`\n`Traceback (most recent call last):`\n `File \"\", line 1, in `\n `Print('Привет, Мир!')`\n`NameError: name 'Print' is not defined`\n\nОбратите внимание, что была поднята ошибка NameError, а также указано место, где была обнаружена ошибка. Так в данном случае действует обработчик ошибок.", + "Исключения": "Попытаемся считать что-либо от пользователя. Нажмите Сtrl-D (или Ctrl+Z в Windows) и посмотрите, что произойдёт.", + "Пример": "`>>> s = input('Введите что-нибудь --> ')`\n\n`Введите что-нибудь -->`\n`Traceback (most recent call last):`\n `File \"\", line 1, in `\n `s = input('Введите что-нибудь --> ') `\n`EOFError: EOF when reading a line`\n\nPython поднимает ошибку с именем EOFError, что означает, что он обнаружил символ конца файла (который вводится при помощи Ctrl-D) там, где не ожидал.", + "Обработка исключений": "Обрабатывать исключения можно при помощи оператора try..except. При этом все обычные команды помещаются внутрь try-блока, а все обработчики исключений – в except-блок.", + "Пример": "`try:`\n `text = input('Введите что-нибудь --> ')`\n`except EOFError:`\n `print('Ну зачем вы сделали мне EOF?')`\n`except KeyboardInterrupt:`\n `print('Вы отменили операцию.')`\n`else:`\n `print('Вы ввели {0}'.format(text))`", + "Как это работает": "Здесь мы поместили все команды, которые могут вызвать исключения/ошибки, внутрь блока try, а затем поместили обработчики соответствующих ошибок/исключений в блок except. Выражение except может обрабатывать как одиночную ошибку или исключение, так и список ошибок/исключений в скобках. Если не указано имя ошибки или исключения, обрабатываться будут все ошибки и исключения.", + "Вызов исключения": "Исключение можно поднять при помощи оператора raise, передав ему имя ошибки/исключения, а также объект исключения, который нужно выбросить.\n\nВызываемая ошибка или исключение должна быть классом, который прямо или непрямо является производным от класса Exception.", + "Пример": "`class ShortInputException(Exception):`\n `'''Пользовательский класс исключения.'''`\n `def __init__(self, length, atleast):`\n `Exception.__init__(self)`\n `self.length = length`\n `self.atleast = atleast`\n\n`try:`\n `text = input('Введите что-нибудь --> ')`\n `if len(text) < 3:`\n `raise ShortInputException(len(text), 3)`\n `# Здесь может происходить обычная работа`\n`except EOFError:`\n `print('Ну зачем вы сделали мне EOF?')`\n`except ShortInputException as ex:`\n `print('ShortInputException: Длина введённой строки -- {0}; \\`\n `ожидалось, как минимум, {1}'.format(ex.length, ex.atleast))`\n`else:`\n `print('Не было исключений.')`", + "Как это работает": "Здесь мы создаём наш собственный тип исключения. Этот новый тип исключения называется ShortInputException. Он содержит два поля: length, хранящее длину введённого текста, и atleast, указывающее, какую минимальную длину текста ожидала программа.\n\nВ пункте except мы указываем класс ошибки ShortInputException, который будет сохранён как переменная ex, содержащая соответствующий объект ошибки/исключения. Это аналогично параметрам и аргументам при вызове функции. Внутри этого пункта except мы используем поля length и atleast объекта исключения для вывода необходимых сообщений пользователю.", + "Try .. Finally": "Представим, что в программе происходит чтение файла и необходимо убедиться, что объект файла был корректно закрыт и что не возникло никакого исключения. Этого можно достичь с применением блока finally.", + "Пример": "`import time`\n\n`try:`\n `f = open('poem.txt')`\n `while True: # наш обычный способ читать файлы`\n `line = f.readline()`\n `if len(line) == 0:`\n `break`\n `print(line, end='')`\n `time.sleep(2) # Пусть подождёт некоторое время`\n`except KeyboardInterrupt:`\n `print('!! Вы отменили чтение файла.')`\n`finally:`\n `f.close()`\n `print('(Очистка: Закрытие файла)')`", + "Как это работает": "Здесь мы производим обычные операции чтения из файла, но в данном случае добавляем двухсекундный сон после вывода каждой строки при помощи функции time.sleep, чтобы программа выполнялась медленно (ведь Python очень быстр от природы). Во время выполнения программы нажмите ctrl-c, чтобы прервать/отменить выполнение программы.\n\nПронаблюдайте, как при этом выдаётся исключение KeyboardInterrupt, и программа выходит. Однако, прежде чем программа выйдет, выполняется пункт finally, и файловый объект будет всегда закрыт.", + "Оператор with": "Типичной схемой является запрос некоторого ресурса в блоке try с последующим освобождением этого ресурса в блоке finally. Для того, чтобы сделать это более «чисто»,существует оператор with:", + "Пример": "`with open(\"poem.txt\") as f:`\n `for line in f:`\n `print(line, end='')`", + "Как это работает": "Существует некий протокол, используемый оператором with. Он считывает объект, возвращаемый операторомopen.Назовём его в данном случае «thefile».\n\nПеред запуском блока кода, содержащегося в нём, оператор with всегда вызывает функцию thefile.__enter__, а также всегда вызывает thefile.__exit__ после завершения выполнения этого блока кода.\n\nТак что код, который мы бы написали в блоке finally, будет автоматически обработан методом __exit__. Это избавляет нас от необходимости повторно в явном виде указывать операторы try..finally." }, - "Урок 9: Дополнительно": { - "0": "**Предисловие** \n\nК настоящему моменту мы уже рассмотрели большую часть того, что вам придётся использовать при работе с Python. В этой главе мы охватим некоторые дополнительные аспекты, которые помогут отшлифовать ваши знания.", - "1": "**Self** \n\nМетоды класса имеют одно отличие от обычных функций: они должны иметь дополнительно имя, добавляемое к началу списка параметров. Однако, при вызове метода никакого значения этому параметру присваивать не нужно – его укажет Python. Эта переменная указывает на сам объект экземпляра класса, и по традиции она называется self.\n\nХотя этому параметру можно дать любое имя, настоятельно рекомендуется использовать только имя self; использование любого другого имени не приветствуется. Есть много достоинств использования стандартного имени: во-первых, любой человек, просматривающий вашу программу, легко узнает его; во-вторых, некоторые специализированные Интегрированные среды разработки (IDE) изначально рассчитаны на использование self.", - "2": "**Классы** \n\nКлассы предоставляют средства объединения данных и функциональности вместе. Создание нового класса создает объект нового типа, позволяя создавать новые экземпляры этого типа. К каждому экземпляру класса могут быть прикреплены атрибуты для поддержания его состояния. Экземпляры класса также могут иметь методы (определенные его классом) для изменения его состояния.", - "3": "**Пример:** \n\nclass Person:\n pass # Пустой блок\n\np = Person()\nprint(p)", - "4": "**Как это работает:** \n\nМы создаём новый класс при помощи оператора class и имени класса. За этим следует блок выражений, формирующих тело класса. В данном случае блок у нас пуст, на что указывает оператор pass.\n\nДалее мы создаём объект-экземпляр класса, записывая имя класса со скобками. (Мы узнаем больше о реализации в следующем разделе). Для проверки мы выясняем тип переменной, просто выводя её на экран. Так мы видим, что у нас есть экземпляр класса Person в модуле __main__.\n\nОбратите внимание, что выводится также и адрес в памяти компьютера, где хранится ваш объект. На вашем компьютере адрес будет другим, так как Python хранит объекты там, где имеется свободное место.", - "5": "**Методы объектов** \n\nИтак, мы выяснили что классы/объекты могут иметь методы, представляющие собой функции, за исключением дополнительной переменной self. А теперь давайте рассмотрим пример", - "6": "**Пример:** \n\nclass Person:\n def sayHi(self):\n print('Привет! Как дела?')\n\np = Person()\np.sayHi()", - "7": "**Как это работает:** \n\nЗдесь мы видим self в действии. __Обратите внимание, что метод sayHi не принимает параметров, но тем не менее, имеет self в определении функции.__", - "8": "**Блоки в одно выражение** \n\nМы неоднократно говорили, что каждый блок команд отделяется от других своим собственным уровнем отступа. Однако, существует и исключение. Если блок команд содержит только одно выражение, его можно указывать в одной строке с условным оператором или, скажем, оператором цикла. Рассмотрим это на примере:", - "9": "**Пример:** \n\n>>> flag = True\n>>> if flag: print('Да')\nДа\n\nОбратите внимание, что единственный оператор расположен в той же строке, а не отдельным блоком. Этот способ может подкупить тем, что якобы «сокращает» программу, но мы настоятельно рекомендуем избегать его во всех случаях, кроме проверки ошибок. Прежде всего, потому что гораздо легче добавлять команды, когда уже есть необходимый уровень отступа.", - "10": "**Lambda-формы** \n\nКлючевое слово lambda используется для создания функций и возврата их значения во время выполнения программы. lambda принимает параметр, за которым следует одно выражение, которое становится телом функции, а значение этого выражения возвращается новой функцией.", - "11": "**Пример:** \n\npoints = [ { 'x' : 2, 'y' : 3 }, { 'x' : 4, 'y' : 1 } ]\npoints.sort(key=lambda i : i['y'])\nprint(points)", - "12": "**Как это работает:** \n\nОбратите внимание на то, что метод sort класса list может принимать параметр key, определяющий способ сортировки списка (обычно мы думаем только о сортировке по возрастанию или по убыванию). В данном случае мы хотим провести сортировку по собственному принципу, для чего нам необходимо написать соответствующую функцию. Но вместо того, чтобы создавать отдельный блок def для описания функции, которая будет использоваться только в этом месте, мы применяем лямбда-выражение.", - "13": "**Генераторы списков** \n\nГенераторы списков служат для создания новых списков на основе существующих. Представьте, что имеется список чисел, на основе которого требуется получить новый список, состоящий из всех чисел, умноженных на 2, но только при условии, что само число больше 2. Генераторы списков подходят для таких задач как нельзя лучше.", - "14": "**Пример:** \n\nlistone = [2, 3, 4]\nlisttwo = [2*i for i in listone if i > 2]\nprint(listtwo)", - "15": "**Как это работает:** \n\nВ этом примере мы создаём новый список, указав операцию, которую необходимо произвести (2 * i), когда выполняется некоторое условие (if i > 2).Обратите внимание, что исходный список при этом не изменяется.", - "16": "**Передача кортежей и словарей в функции** \n\nДля получения параметров, переданных функции, в виде кортежа или словаря, существуют специальные приставки «*» или «**» соответственно. Это особенно полезно в случаях, когда функция может принимать переменное число параметров.", - "17": "**Пример:** \n\n>>> def powersum(power, *args):\n... '''Возвращает сумму аргументов, возведённых в указанную степень.'''\n... total = 0\n... for i in args:\n... total += pow(i, power)\n... return total\n...\n>>> powersum(2, 3, 4)\n25\n>>> powersum(2, 10)\n100\n\nПоскольку перед переменной args указана приставка «*», все дополнительные аргументы, переданные функции, сохранятся в args в виде кортежа. В случае использования приставки «**» все дополнительные параметры будут рассматриваться как пары ключ/значение в словаре.", - "18": "**exec и eval** \n\nФункция exec служит для выполнения команд Python, содержащихся в строке или файле, в отличие от самого текста программы. Например, во время выполнения программы можно сформировать строку, содержащую текст программы на Python, и запустить его при помощи exec:", - "19": "**Пример:** \n\n>>> exec('print(\"Здравствуй, Мир!\")')\nЗдравствуй, Мир!", - "20": "**Оператор assert** \n\nОператор assert существует для того, чтобы указать, что нечто является истиной. Например, если требуется гарантировать, что в списке будет хотя бы один элемент, и вызвать ошибку, если это не так, то оператор assert идеально подойдёт для такой задачи. Когда заявленное выражение ложно, вызывается ошибка AssertionError. Метод pop() возвращает последний элемент списка, одновременно удаляя его оттуда.", - "21": "**Пример:** \n\n>>> mylist = ['item']\n>>> assert len(mylist) >= 1\n>>> mylist.pop()\n'item'\n>>> mylist\n[]\n>>> assert len(mylist) >= 1\nTraceback (most recent call last):\n File \"\", line 1, in \nAssertionError", - "22": "**Функция repr** \n\nФункция repr используется для получения канонического строкового представления объекта. Любопытно, что в большинстве случаев eval(repr(object)) == object.", - "23": "**Пример:** \n\n>>> i = []\n>>> i.append('item')\n>>> repr(i)\n\"['item']\"\n>>> eval(repr(i))\n['item']\n>>> eval(repr(i)) == i\nTrue\n\nПо большому счёту, функция repr служит для получения печатаемого представления объекта. Определив метод __repr__ в собственном классе, можно указать, что он будет возвращать по вызову функции repr.", - "24": "**Установка библиотек** \n\nВ Каталоге пакетов Python существует колоссальное количество открытых библиотек, которые вы можете использовать в своих программах. Для их установки можно воспользоваться pip.", - "25": "**Графические программы** \n\nДля создания собственной графической программы на Python понадобится какая-нибудь библиотека ГИП (графического интерфейса пользователя) со своими привязками к Python. Привязки позволяют писать программу на Python, используя библиотеки, которые сами по себе написаны на C, C++ или других языках.", - "26": "**Kivy** \n\nhttps://kivy.org", - "27": "**PyGTK** \n\nЭто привязки Python к инструментарию GTK+, на основе которого построен GNOME. У GTK+ есть много своих особенностей, но как только вы освоитесь, вы сможете создавать ГИП очень быстро. Что касается дизайнера графического интерфейса Glade, то он просто незаменим. Документация же всё ещё требует некоторых улучшений. GTK+ хорошо работает в GNU/Linux, но его порт на Windows пока не закончен. При помощи GTK+ можно создавать как свободные, так и проприетарные программы. Для начала прочитайте Учебник по PyGTK.", - "28": "**PyQt** \n\nЭто привязки Python к инструментарию Qt, на основе которого построена KDE. Qt чрезвычайно прост в использовании, особенно благодаря Qt Designer и изумительной документации Qt. PyQt бесплатно, если используется для создания свободных программ (с лицензией GPL). Для создания закрытых проприетарных программ вам придётся его купить. Начиная с Qt 4.5, разрешается создавать при помощи него не только GPL’ные программы.", - "29": "**wxPython** \n\nЭто привязки Python к инструментарию wxWidgets. wxPython не так прост в освоении, но зато он переносим и работает на GNU/Linux, Windows, Mac и даже на встраиваемых платформах. Многие среды разработки для wxPython, такие как SPE (Stani’s Python Editor) и wxGlade включают дизайнеры графического интерфейса. При помощи wxPython можно создавать как свободные, так и проприетарные программы." - + "Урок 10: Дополнительно": { + "Предисловие": "К настоящему моменту мы уже рассмотрели большую часть того, что вам придётся использовать при работе с Python. В этой главе мы охватим некоторые дополнительные аспекты, которые помогут отшлифовать ваши знания.", + "Self": "Методы класса имеют одно отличие от обычных функций: они должны иметь дополнительно имя, добавляемое к началу списка параметров. Однако, при вызове метода никакого значения этому параметру присваивать не нужно – его укажет Python. Эта переменная указывает на сам объект экземпляра класса, и по традиции она называется self.\n\nХотя этому параметру можно дать любое имя, настоятельно рекомендуется использовать только имя self; использование любого другого имени не приветствуется. Есть много достоинств использования стандартного имени: во-первых, любой человек, просматривающий вашу программу, легко узнает его; во-вторых, некоторые специализированные Интегрированные среды разработки (IDE) изначально рассчитаны на использование self.", + "Классы": "Классы предоставляют средства объединения данных и функциональности вместе. Создание нового класса создает объект нового типа, позволяя создавать новые экземпляры этого типа. К каждому экземпляру класса могут быть прикреплены атрибуты для поддержания его состояния. Экземпляры класса также могут иметь методы (определенные его классом) для изменения его состояния.", + "Пример": "`class Person:`\n `pass # Пустой блок`\n\n`p = Person()`\n`print(p)`", + "Как это работает": "Мы создаём новый класс при помощи оператора class и имени класса. За этим следует блок выражений, формирующих тело класса. В данном случае блок у нас пуст, на что указывает оператор pass.\n\nДалее мы создаём объект-экземпляр класса, записывая имя класса со скобками. (Мы узнаем больше о реализации в следующем разделе). Для проверки мы выясняем тип переменной, просто выводя её на экран. Так мы видим, что у нас есть экземпляр класса Person в модуле __main__.\n\nОбратите внимание, что выводится также и адрес в памяти компьютера, где хранится ваш объект. На вашем компьютере адрес будет другим, так как Python хранит объекты там, где имеется свободное место.", + "Методы объектов": "Итак, мы выяснили что классы/объекты могут иметь методы, представляющие собой функции, за исключением дополнительной переменной self. А теперь давайте рассмотрим пример", + "Пример": "`class Person:`\n `def sayHi(self):`\n `print('Привет! Как дела?')`\n\n`p = Person()`\n`p.sayHi()`", + "Как это работает": "Здесь мы видим self в действии. __Обратите внимание, что метод sayHi не принимает параметров, но тем не менее, имеет self в определении функции.__", + "Блоки в одно выражение": "Мы неоднократно говорили, что каждый блок команд отделяется от других своим собственным уровнем отступа. Однако, существует и исключение. Если блок команд содержит только одно выражение, его можно указывать в одной строке с условным оператором или, скажем, оператором цикла. Рассмотрим это на примере:", + "Пример": "`>>> flag = True`\n`>>> if flag: print('Да')`\n`Да`\n\nОбратите внимание, что единственный оператор расположен в той же строке, а не отдельным блоком. Этот способ может подкупить тем, что якобы «сокращает» программу, но мы настоятельно рекомендуем избегать его во всех случаях, кроме проверки ошибок. Прежде всего, потому что гораздо легче добавлять команды, когда уже есть необходимый уровень отступа.", + "Lambda-функции": "Ключевое слово lambda используется для создания функций и возврата их значения во время выполнения программы. lambda принимает параметр, за которым следует одно выражение, которое становится телом функции, а значение этого выражения возвращается новой функцией.", + "Пример": "`points = [ { 'x' : 2, 'y' : 3 }, { 'x' : 4, 'y' : 1 } ]`\n`points.sort(key=lambda i : i['y'])`\n`print(points)`", + "Как это работает": "Обратите внимание на то, что метод sort класса list может принимать параметр key, определяющий способ сортировки списка (обычно мы думаем только о сортировке по возрастанию или по убыванию). В данном случае мы хотим провести сортировку по собственному принципу, для чего нам необходимо написать соответствующую функцию. Но вместо того, чтобы создавать отдельный блок def для описания функции, которая будет использоваться только в этом месте, мы применяем лямбда-выражение.", + "Генераторы списков": "Генераторы списков служат для создания новых списков на основе существующих. Представьте, что имеется список чисел, на основе которого требуется получить новый список, состоящий из всех чисел, умноженных на 2, но только при условии, что само число больше 2. Генераторы списков подходят для таких задач как нельзя лучше.", + "Пример": "`listone = [2, 3, 4]`\n`listtwo = [2*i for i in listone if i > 2]`\n`print(listtwo)`", + "Как это работает": "В этом примере мы создаём новый список, указав операцию, которую необходимо произвести (2 * i), когда выполняется некоторое условие (if i > 2).Обратите внимание, что исходный список при этом не изменяется.", + "Передача кортежей и словарей в функции": "Для получения параметров, переданных функции, в виде кортежа или словаря, существуют специальные приставки «*» или «**» соответственно. Это особенно полезно в случаях, когда функция может принимать переменное число параметров.", + "Пример": "`>>> def powersum(power, *args):`\n`... '''Возвращает сумму аргументов, возведённых в указанную степень.'''`\n`... total = 0`\n`... for i in args:`\n`... total += pow(i, power)`\n`... return total`\n`...`\n`>>> powersum(2, 3, 4)`\n`25`\n`>>> powersum(2, 10)`\n`100`\n\nПоскольку перед переменной args указана приставка «*», все дополнительные аргументы, переданные функции, сохранятся в args в виде кортежа. В случае использования приставки «**» все дополнительные параметры будут рассматриваться как пары ключ/значение в словаре.", + "exec и eval": "Функция exec служит для выполнения команд Python, содержащихся в строке или файле, в отличие от самого текста программы. Например, во время выполнения программы можно сформировать строку, содержащую текст программы на Python, и запустить его при помощи exec:", + "Пример": "`>>> exec('print(\"Здравствуй, Мир!\")')`\n`Здравствуй, Мир!`", + "Оператор assert": "Оператор assert существует для того, чтобы указать, что нечто является истиной. Например, если требуется гарантировать, что в списке будет хотя бы один элемент, и вызвать ошибку, если это не так, то оператор assert идеально подойдёт для такой задачи. Когда заявленное выражение ложно, вызывается ошибка AssertionError. Метод pop() возвращает последний элемент списка, одновременно удаляя его оттуда.", + "Пример": "`>>> mylist = ['item']`\n`>>> assert len(mylist) >= 1`\n`>>> mylist.pop()`\n`'item'`\n`>>> mylist`\n`[]`\n`>>> assert len(mylist) >= 1`\n`Traceback (most recent call last):`\n `File \"\", line 1, in `\n`AssertionError`", + "Функция repr": "Функция repr используется для получения канонического строкового представления объекта. Любопытно, что в большинстве случаев eval(repr(object)) == object.", + "Пример": "`>>> i = []`\n`>>> i.append('item')`\n`>>> repr(i)`\n`\"['item']\"`\n`>>> eval(repr(i))`\n`['item']`\n`>>> eval(repr(i)) == i`\n`True`\n\nПо большому счёту, функция repr служит для получения печатаемого представления объекта. Определив метод __repr__ в собственном классе, можно указать, что он будет возвращать по вызову функции repr.", + "Установка библиотек": "В Каталоге пакетов Python существует колоссальное количество открытых библиотек, которые вы можете использовать в своих программах. Для их установки можно воспользоваться pip.", + "Графические программы": "Для создания собственной графической программы на Python понадобится какая-нибудь библиотека ГИП (графического интерфейса пользователя) со своими привязками к Python. Привязки позволяют писать программу на Python, используя библиотеки, которые сами по себе написаны на C, C++ или других языках.", + "Kivy": "https://kivy.org", + "PyGTK": "Это привязки Python к инструментарию GTK+, на основе которого построен GNOME. У GTK+ есть много своих особенностей, но как только вы освоитесь, вы сможете создавать ГИП очень быстро. Что касается дизайнера графического интерфейса Glade, то он просто незаменим. Документация же всё ещё требует некоторых улучшений. GTK+ хорошо работает в GNU/Linux, но его порт на Windows пока не закончен. При помощи GTK+ можно создавать как свободные, так и проприетарные программы. Для начала прочитайте Учебник по PyGTK.", + "PyQt": "Это привязки Python к инструментарию Qt, на основе которого построена KDE. Qt чрезвычайно прост в использовании, особенно благодаря Qt Designer и изумительной документации Qt. PyQt бесплатно, если используется для создания свободных программ (с лицензией GPL). Для создания закрытых проприетарных программ вам придётся его купить. Начиная с Qt 4.5, разрешается создавать при помощи него не только GPL’ные программы.", + "wxPython": "Это привязки Python к инструментарию wxWidgets. wxPython не так прост в освоении, но зато он переносим и работает на GNU/Linux, Windows, Mac и даже на встраиваемых платформах. Многие среды разработки для wxPython, такие как SPE (Stani’s Python Editor) и wxGlade включают дизайнеры графического интерфейса. При помощи wxPython можно создавать как свободные, так и проприетарные программы." } } \ No newline at end of file diff --git a/main3.py b/main3.py index 8a76c04..8f344e6 100644 --- a/main3.py +++ b/main3.py @@ -7,7 +7,6 @@ from task_getter import TaskGetter from buttons import Buttons from enums import * -from consultant import ArtificialIntelligence from typing import Literal @@ -28,6 +27,19 @@ def __init__ (self, request: dict): self._working_with_user ( ) + # Декоратор, сохраняющий посленюю фразу и кнопки в сессионных данных + def save_last_phrase (function: callable) -> callable: + def _wrapper (self, *args, **kwargs): + function (self, *args, **kwargs) + if self._TEXT_TO_SPEECH: + self._SESSIONAL_DATA["last_phrase"] = self._TEXT_TO_SPEECH + else: + self._SESSIONAL_DATA["last_phrase"] = self._OUTPUT_TEXT + self._SESSIONAL_DATA["last_buttons"] = self._BUTTONS.BUTTONS + return _wrapper + + + @save_last_phrase def _working_with_user (self) -> None: """Во время запуска навыка Алиса получает пустой текстовый запрос, на который она тут же отвечает. Этот ответ мы воспринимаем @@ -36,7 +48,7 @@ def _working_with_user (self) -> None: # Абсолютно новый пользователь if self._INTERSESSIONAL_DATA["new_user"]: self._OUTPUT_TEXT = get_text_for_new_user ( ) - self._TEXT_TO_SPEECH = get_text_for_new_user ( ) + "\n" + self._TEXT_TO_SPEECH = get_introduction_sound ( ) + get_text_for_new_user ( ) + "\n" self._TEXT_TO_SPEECH += get_main_commands_of_skill ( ) self._INTERSESSIONAL_DATA["new_user"] = False self._BUTTONS.add_buttons_of_main_menu_in_text ( ) @@ -45,7 +57,7 @@ def _working_with_user (self) -> None: elif self._user_is_in_main_menu and self._IS_FIRST_MESSAGE: user_greeting = get_user_greeting ( ) self._OUTPUT_TEXT = user_greeting - self._TEXT_TO_SPEECH = user_greeting + self._TEXT_TO_SPEECH = get_introduction_sound ( ) + user_greeting self._TEXT_TO_SPEECH += get_main_commands_of_skill ( ) self._BUTTONS.add_buttons_of_main_menu_in_text ( ) @@ -70,6 +82,7 @@ def _user_is_in_main_menu (self) -> bool: return False + @save_last_phrase def _working_with_user_in_main_menu (self) -> None: self._BUTTONS.remove_all_buttons ( ) self._TEXT_TO_SPEECH = "" @@ -101,11 +114,7 @@ def _working_with_user_in_main_menu (self) -> None: self._TEXT_TO_SPEECH += ", ".join (self._difficulty_levels_of_course) self._BUTTONS.add_buttons (*self._difficulty_levels_of_course, hide_all = False) self._BUTTONS.add_buttons ("Узнать мои результаты", "На главное меню", "Пока", hide_all = True) - elif self._has_one_word_in_text_in_lower( - "консультант", "консультанту", "консультанта", "консультанты", "консультанте", "консультация", "консультацию", "консультации", "консультацией", "консультантом" - ): - self._SESSIONAL_DATA["state"] = "consulting" - self._OUTPUT_TEXT = "Я готова подобрать вам справку по теме вашей проблемы. С чем вам помочь?\n" + elif self._has_one_word_in_text_in_lower ( "квест", "квеста", "квесту", "квестом", "квесте", "квесты", "квестов", "квестам", "квестами", "квестах"): @@ -139,6 +148,9 @@ def _working_with_user_in_main_menu (self) -> None: elif self._user_wants_to_go_to_main_menu: self._OUTPUT_TEXT = "Вы уже на главном меню!" + elif self._user_wants_to_hear_last_phrase: + self._say_last_phrase ( ) + elif self._user_wants_to_end_session: self._end_the_session ( ) @@ -157,7 +169,19 @@ def _difficulty_levels_of_quest (self) -> tuple[str, str, str, str]: def _difficulty_levels_of_course (self) -> tuple[str, str, str, str, str]: return "Лёгкий", "Средний", "Высокий", "Очень высокий", "Случайный" + @property + def _user_wants_to_hear_last_phrase (self) -> bool: + if self._has_one_word_in_text_in_lower ("повтори", "повторить", "что", "чего"): + return True + else: + return False + + def _say_last_phrase (self) -> None: + self._OUTPUT_TEXT = self._SESSIONAL_DATA["last_phrase"] + self._BUTTONS.BUTTONS = self._SESSIONAL_DATA["last_buttons"] + + @save_last_phrase def _working_with_user_outside_main_menu (self) -> None: match self._SESSIONAL_DATA["state"]: case "working_with_course": @@ -182,6 +206,7 @@ def _working_with_user_outside_main_menu (self) -> None: self._consulting ( ) + @save_last_phrase def _working_with_course (self) -> None: lesson_getter = LessonGetter ( ) current_lesson_theme = self._INTERSESSIONAL_DATA["current_lesson"] @@ -242,6 +267,9 @@ def _working_with_course (self) -> None: elif self._user_wants_to_go_to_main_menu: self._go_to_main_menu ( ) + elif self._user_wants_to_hear_last_phrase: + self._say_last_phrase ( ) + elif self._user_wants_to_end_session: self._end_the_session ( ) @@ -270,6 +298,7 @@ def _user_has_not_listened_to_any_lesson (self) -> None: self._BUTTONS.add_buttons ("Покажи список тем", "На главное меню", "Выход", hide_all = True) + @save_last_phrase def _choosing_course_theme (self) -> None: if self._has_one_word_in_text_in_lower ("1", "введение"): self._start_next_lesson_and_sublesson (1) @@ -283,9 +312,24 @@ def _choosing_course_theme (self) -> None: elif self._has_one_word_in_text_in_lower ("4", "операторы", "выражения"): self._start_next_lesson_and_sublesson (4) - elif self._has_one_word_in_text_in_lower ("5", "поток", "команд"): + elif self._has_one_word_in_text_in_lower ("5"): self._start_next_lesson_and_sublesson (5) + elif self._has_one_word_in_text_in_lower ("6"): + self._start_next_lesson_and_sublesson (6) + + elif self._has_one_word_in_text_in_lower ("7"): + self._start_next_lesson_and_sublesson (7) + + elif self._has_one_word_in_text_in_lower ("8"): + self._start_next_lesson_and_sublesson (8) + + elif self._has_one_word_in_text_in_lower ("9"): + self._start_next_lesson_and_sublesson (9) + + elif self._has_one_word_in_text_in_lower ("10"): + self._start_next_lesson_and_sublesson (10) + elif self._has_one_word_in_text_in_lower ("назад", "обратно"): self._SESSIONAL_DATA["state"] = "working_with_course" self._OUTPUT_TEXT = "Вы находитесь в меню Курса.\n" @@ -297,6 +341,9 @@ def _choosing_course_theme (self) -> None: elif self._user_wants_to_go_to_main_menu: self._go_to_main_menu ( ) + elif self._user_wants_to_hear_last_phrase: + self._say_last_phrase ( ) + elif self._user_wants_to_end_session: self._end_the_session ( ) @@ -317,6 +364,7 @@ def _start_next_lesson_and_sublesson (self, theme_number: Literal[1, 2, 3, 4, 5] self._BUTTONS.add_buttons ("Далее", "Переслушать", "На главное меню", "Пока", hide_all = True) + @save_last_phrase def _start_next_lesson_or_not (self) -> None: old_lesson_theme = self._INTERSESSIONAL_DATA["current_lesson"] lesson_getter = LessonGetter ( ) @@ -339,6 +387,9 @@ def _start_next_lesson_or_not (self) -> None: elif self._user_wants_to_go_to_main_menu: self._go_to_main_menu ( ) + elif self._user_wants_to_hear_last_phrase: + self._say_last_phrase ( ) + elif self._user_wants_to_end_session: self._end_the_session ( ) @@ -347,6 +398,7 @@ def _start_next_lesson_or_not (self) -> None: self._BUTTONS.add_buttons ("Да, хочу!", "Нет, позже.", hide_all = True) + @save_last_phrase def _working_with_tasks (self) -> None: if self._has_one_word_in_text_in_lower ( "лёгкий", "лёгкого", "лёгкому", "лёгким", "лёгком", @@ -385,6 +437,9 @@ def _working_with_tasks (self) -> None: elif self._user_wants_to_go_to_main_menu: self._go_to_main_menu ( ) + elif self._user_wants_to_hear_last_phrase: + self._say_last_phrase ( ) + elif self._user_wants_to_end_session: self._end_the_session ( ) @@ -393,11 +448,15 @@ def _working_with_tasks (self) -> None: self._BUTTONS.add_buttons ("На главное меню", "Пока!", hide_all = True) + @save_last_phrase def _choosing_right_answer_for_task (self) -> None: # FIXME if self._user_wants_to_go_to_main_menu: self._go_to_main_menu ( ) + elif self._user_wants_to_hear_last_phrase: + self._say_last_phrase ( ) + elif self._user_wants_to_end_session: self._end_the_session ( ) @@ -406,6 +465,7 @@ def _choosing_right_answer_for_task (self) -> None: self._BUTTONS.add_buttons ("На главное меню", "Пока!", hide_all = True) + @save_last_phrase def _working_with_quest (self) -> None: if self._has_one_word_in_text_in_lower ( "лёгкий", "лёгкого", "лёгкому", "лёгким", "лёгком", @@ -445,6 +505,9 @@ def _working_with_quest (self) -> None: elif self._user_wants_to_go_to_main_menu: self._go_to_main_menu ( ) + elif self._user_wants_to_hear_last_phrase: + self._say_last_phrase ( ) + elif self._user_wants_to_end_session: self._end_the_session ( ) @@ -514,6 +577,7 @@ def _show_quest (self) -> None: self._BUTTONS.add_buttons (*self._buttons_for_choosing_correct_answer, hide_all = True) + @save_last_phrase def _choosing_right_answer_for_quest (self) -> None: if self._has_one_word_in_text_in_lower ("1", "один", "первый", "первое"): if self._SESSIONAL_DATA["correct_answer_of_quest"] == 1: @@ -546,6 +610,9 @@ def _choosing_right_answer_for_quest (self) -> None: elif self._user_wants_to_go_to_main_menu: self._go_to_main_menu ( ) + elif self._user_wants_to_hear_last_phrase: + self._say_last_phrase ( ) + elif self._user_wants_to_end_session: self._end_the_session ( ) @@ -556,7 +623,7 @@ def _choosing_right_answer_for_quest (self) -> None: def _correct_answer_of_quest_is_selected (self) -> None: text_that_says_answer_is_correct = get_text_that_says_answer_is_correct ( ) + "\n\n" self._OUTPUT_TEXT = text_that_says_answer_is_correct - self._TEXT_TO_SPEECH = text_that_says_answer_is_correct + self._TEXT_TO_SPEECH = get_random_win_sound ( ) + text_that_says_answer_is_correct current_difficulty_level = self._SESSIONAL_DATA["difficulty_level_of_quest"] self._save_text_and_correct_answer_of_quest_in_session_data (current_difficulty_level) self._OUTPUT_TEXT += self._get_text_of_current_quest ( ) @@ -590,13 +657,17 @@ def _show_results_of_quest_and_next_quest (self) -> None: self._make_all_sessional_data_false ( ) self._BUTTONS.add_buttons_of_main_menu_in_text ( ) + self._TEXT_TO_SPEECH = get_random_sound_of_looking_results ( ) + self._OUTPUT_TEXT + def _wrong_answer_of_quest_is_selected (self) -> None: self._OUTPUT_TEXT = get_text_that_says_answer_is_wrong ( ) + self._TEXT_TO_SPEECH = get_random_lose_sound ( ) + self._OUTPUT_TEXT self._SESSIONAL_DATA["number_of_wrong_quest_answers"] += 1 self._BUTTONS.add_buttons (*self._buttons_for_choosing_correct_answer, hide_all = True) + @save_last_phrase def _viewing_quest_results (self) -> None: if self._has_one_word_in_text_in_lower ("продолжить"): self._SESSIONAL_DATA["state"] = "choosing_right_answer_for_quest" @@ -608,6 +679,9 @@ def _viewing_quest_results (self) -> None: elif self._user_wants_to_go_to_main_menu: self._go_to_main_menu ( ) + elif self._user_wants_to_hear_last_phrase: + self._say_last_phrase ( ) + elif self._user_wants_to_end_session: self._end_the_session ( ) @@ -616,19 +690,33 @@ def _viewing_quest_results (self) -> None: self._BUTTONS.add_buttons ("Продолжить квест", "На главное меню", "Пока", hide_all = True) + @save_last_phrase def _sending_report (self) -> None: # Доработать # FIXME self._BUTTONS.add_buttons ("На главное меню", "Пока!", hide_all = True) - # self._WORDS_OF_TEXT_IN_LOWER + if self._user_wants_to_go_to_main_menu: + self._go_to_main_menu ( ) + elif self._user_wants_to_hear_last_phrase: + self._say_last_phrase ( ) + elif self._user_wants_to_end_session: + self._end_the_session ( ) + else: + self._OUTPUT_TEXT = get_apology_text ( ) + @save_last_phrase def _consulting (self) -> None: # Доработать # FIXME - - ai = ArtificialIntelligence("lessons.json") - self._BUTTONS.add_buttons ("На главное меню", "Пока!", hide_all = True) - self._OUTPUT_TEXT = "Итак, я нашла что-то, что может вам помочь, послушайте: " + ai.get_similarity(" ".join(self._WORDS_OF_TEXT_IN_LOWER)) + if self._user_wants_to_go_to_main_menu: + self._go_to_main_menu ( ) + + elif self._user_wants_to_hear_last_phrase: + self._say_last_phrase ( ) + elif self._user_wants_to_end_session: + self._end_the_session ( ) + else: + self._OUTPUT_TEXT = get_apology_text ( ) def _has_all_words_in_text_in_lower (self, *words) -> bool: diff --git a/tasks.json b/tasks.json index baf5590..c54c0e3 100644 --- a/tasks.json +++ b/tasks.json @@ -1,191 +1,97 @@ -{ - "1": { - "title": "Умножение чисел.", - "task_text": "Напишите программу, которая принимает на вход два числа и выводит их произведение.", - "solve": "Запросим у пользователя два числа c помощью 'input()'. Затем умножим два полученных числа и выведем результат на экран через 'print()'.", - "code": "num1 = float(input()) \n num2 = float(input()) \n print(num1 * num2)", - "difficulty":0 - }, - "2": { - "title": "Инверсия.", - "task_text": "Реализуйте функцию, которая принимает на вход строку и возвращает ее в обратном порядке.", - "solve": "Функция `reverse_string()` принимает один аргумент - `s`, который является строкой. Для разворота строки мы используем срезы с отрицательным шагом. Срез `[::-1]` означает, что мы берем все символы строки от конца к началу с шагом -1, то есть в обратном порядке.", - "code": "def reverse_string(s):\n return s[::-1]", - "difficulty":0 - }, - "3": { - "title": "Пересечение.", - "task_text": "Напишите функцию, которая принимает на вход два списка чисел и возвращает список, содержащий только числа, которые есть в обоих списках.", - "solve": "Функция `common_elements()` принимает два аргумента - `list1` и `list2`, которые являются списками чисел. Сначала функция преобразует списки во множества с помощью встроенной функции `set()`. Затем функция находит пересечение множеств с помощью метода `intersection()`. Наконец, функция преобразует множество обратно в список с помощью встроенной функции `list()` и возвращает его.", - "code": "def common_elements(list1, list2): \n set1 = set(list1) \n set2 = set(list2) \n result = set1.intersection(set2) \n return list(result)", - "difficulty":0 - }, - "4": { - "title": "Подсчёт букв.", - "task_text": "Создайте программу, которая просит пользователя ввести слово и затем выводит количество гласных букв в этом слове.", - "solve": "Код начинается с запроса на ввод слова от пользователя с помощью `input()`. Затем мы создаем список гласных букв и инициализируем переменную `count` для подсчета гласных букв. Далее, мы перебираем каждую букву в слове с помощью цикла `for`, проверяем, является ли буква гласной, и если да, увеличиваем счетчик `count`.", - "code": "word = input() \nvowels = ['a', 'e', 'i', 'o', 'u'] \ncount = 0 \n for letter in word: \n if letter.lower() in vowels: \n count += 1 \n print('Количество гласных букв в слове', word, ':',count)", - "difficulty":0 - }, - "5": { - "title": "Строки.", - "task_text": "Напишите программу, которая принимает на вход две строки и возвращает последнее слово в каждой из них.", - "solve": "Функция `last_words()` принимает два аргумента - `s1` и `s2`, которые являются строками. Для нахождения последнего слова в каждой строке мы используем метод `split()`, который разбивает строку на слова. Затем мы берем последнее слово в списке слов с помощью индекса `-1`. Возвращается список с последними словами.", - "code": "def last_words(s1, s2): \n last_word1 = s1.split()[-1] \n last_word2 = s2.split()[-1] \n return [last_word1, last_word2]", - "difficulty":0 - }, - "6": { - "title": "Среднее арифметическое.", - "task_text": "Реализуйте функцию, которая принимает на вход список чисел и возвращает среднее значение этого списка.", - "solve": "Функция `average()` принимает один аргумент - `numbers`, который является списком чисел. Для вычисления среднего значения мы сначала вычисляем сумму всех чисел в списке с помощью встроенной функции `sum()`, а затем количество чисел в списке с помощью встроенной функции `len()`. Затем мы вычисляем среднее значение, которое равно сумме чисел, деленной на количество чисел. Наконец, мы возвращаем среднее значение с помощью ключевого слова `return`.", - "code": "def average(numbers): \n return sum(numbers) / len(numbers)", - "difficulty":0 - }, - "7": { - "title": "Числа Фибоначчи.", - "task_text": "Напишите программу, которая просит пользователя ввести число N и затем выводит первые N чисел Фибоначчи.", - "solve": "Сначала мы запрашивает у пользователя число N с помощью функции `input()`. Далее инициализирует переменные `a` и `b`, которые будут использоваться для вычисления чисел Фибоначчи. Затем использует цикл `for` для вычисления и вывода первых N чисел Фибоначчи. В каждой итерации цикла программа выводит текущее число Фибоначчи и обновляет значения переменных `a` и `b` для вычисления следующего числа Фибоначчи. Наконец, выводим последовательность чисел Фибоначчи на экран.", - "code": "n = int(input()) \na, b = 0, 1 \n for i in range(n): \n print(a, end=' ') \n a, b = b, a + b", - "difficulty":0 - }, - "8": { - "title": "Илон Шмаск и список.", - "task_text": "Напишите программу для Илона Шмаска с созданием списка чисел от 1 до 10 включительно.", - "solve": "Мы создаем при помощи генератора список чисел от 0 до 10 включительно. Затем мы выводим список на экран с помощью функции `print()`.", - "code": "\nprint('Добро пожаловать в компанию SpaceY!') \nprint([i for i in range(11)])", - "difficulty":1 - }, - "9": { - "title": "Билл Герц и генератор паролей.", - "task_text": "Напишите программу для Билла Герца с генерацией случайного пароля длиной 8 символов, содержащего только буквы латинского алфавита (в верхнем и нижнем регистре) и цифры.", - "solve": "Мы импортируем модули `random` и `string`, чтобы использовать функции для генерации случайных чисел и создания списка символов, которые могут входить в пароль. Затем мы создаем пустую строку `password` и используем цикл `for` для генерации случайного пароля длиной 8 символов. В каждой итерации цикла мы добавляем случайный символ из списка `characters` к строке `password` с помощью метода `random.choice()`. Наконец, мы выводим пароль на экран с помощью функции `print()`.", - "code": "import random, string \ncharacters = string.ascii_letters + string.digits \npassword = '' \nfor i in range(8): \n password += random.choice(characters \nprint(password)", - "difficulty":2 - }, - "10": { - "title": "День недели.", - "task_text": "Напишите программу, которая запрашивает у пользователя день недели (например, 'понедельник') и выводит сообщение 'Сегодня <день недели>', где <день недели> - введенный пользователем день недели.", - "solve": "Мы запрашиваем у пользователя день недели с помощью функции `input()` и сохраняем его в переменную `day`. Наконец, мы выводим сообщение с указанием введенного дня недели, используя форматирование строк с помощью f-строк.", - "code": "day = input('Введите день недели: ') \nprint(f'Сегодня {day}') \n", - "difficulty":0 - }, - "11": { - "title": "Cумма чисел до 10.", - "task_text": "Напишите программу для нахождения суммы всех чисел от 1 до 10 включительно.", - "solve": "Применим в решении генератор для чисел от 0 до 10 включительно. При помощи функции `sum` получим их сумму и выведем ее на экран при помощи `print`.", - "code": "print(sum([i for i in range(11)]))", - "difficulty":1 - }, - "12": { - "title": "Угадай-ка.", - "task_text": "Напишите программу, которая загадывает случайное число от 1 до 10 и просит пользователя угадать это число. Если пользователь угадал число, выводится сообщение 'Поздравляю, вы победили!'. Если нет, выводится сообщение 'К сожалению, вы проиграли. Загаданное число было <число>'.", - "solve": "Мы используем модуль `random`, чтобы загадать случайное число от 1 до 10. Затем мы просим пользователя ввести число и проверяем, угадал ли он загаданное число. Если пользователь угадал число, то выводится сообщение об победе, иначе программа выводит сообщение о проигрыше.", - "code": "import random \n number = random.randint(1, 10) \nguess = input('Введите число от 1 до 10: ') \nif int(guess) == number: \n print('Поздравляю, вы победили!') \nelse: \n print(f'К сожалению, вы проиграли. Загаданное число было {number}.')", - "difficulty":1 - }, - "13": { - "title": "Макс Кукерберг и шифр.", - "task_text": "Напишите программу для Макса Кукерберга, которая принимает на вход строку и шифрует ее с помощью алгоритма Цезаря (каждая буква заменяется на букву с определенным сдвигом по алфавиту). Сдвиг задается пользователем.", - "solve": "Цикл `for` используется для перебора всех символов в исходной строке. Если символ является буквой, то мы определяем новую букву с учетом сдвига и добавляем ее к зашифрованной строке. Если символ не является буквой, то мы добавляем его в зашифрованную строку без изменений. Для определения новой буквы мы используем функции `ord()` и `chr()` для преобразования символа в его код ASCII и обратно.", - "code": "text = input() \nshift = int(input()) \nencrypted_text = '' \nfor char in text: \n if char.isalpha(): \n new_char = chr((ord(char) + shift - 65) % 26 + 65) if char.isupper() \n else chr((ord(char) + shift - 97) % 26 + 97) \n encrypted_text += new_char \n else: \n encrypted_text += char \nprint('Зашифрованная строка:', encrypted_text)", - "difficulty":3 - }, - "14": { - "title": "Бинарный поиск.", - "task_text": "Напишите программу, которая использует бинарный поиск для нахождения заданного элемента в отсортированном списке. Список и элемент должны передаваться в функцию как аргументы.", - "solve": "Объявим переменные left, right - индексы первого и последнего элементов списка. В каждой итерации цикла с условием left<=right мы определяем средний индекс `mid` и сравниваем значение элемента на этой позиции со значением искомого элемента `x`. Если элемент найден, мы возвращаем его индекс и прерываем цикл с помощью оператора `break`. Если элемент не найден, мы возвращаем -1.", - "code": "def search(lst, x): \n left, right = 0, len(lst) - 1 \n while left <= right: \n  mid = (left + right) // 2 \n  if lst[mid] == x: \n  return mid \n  elif lst[mid] < x: \n  left = mid + 1 \n  else: \n  right = mid - 1 \n else: \n  return -1 \n", - "difficulty":2 - }, - "15": { - "title": "Алиса и перестановка букв.", - "task_text": "Создание программу для Алисы, которая будет производить перестановку букв в слове.", - "solve": "Для решения этой задачи можно использовать рекурсию. Объявим функцию `permutations`. Алгоритм начинается с проверки длины слова. Если длина слова равна 1, то возвращается список, содержащий только это слово. Затем в цикле проходим по всем буквам в слове. Для каждой буквы получаем оставшуюся часть слова, и рекурсивно вызываем функцию `permutations` для генерации перестановок оставшейся части слова. Для каждой полученной перестановки добавляем первую букву, и добавляем полученную перестановку в список результата. После завершения цикла возвращаем список всех перестановок.", - "code": "def permutations(word): if len(word) == 1: \n return [word] \n result = [] \n for i in range(len(word)): \n first_letter = word[i] \n remaining_letters = word[:i] + word[i+1:] \n for permutation in permutations(remaining_letters): \n result.append(first_letter + permutation) \n return result", - "difficulty":3 - }, - "16": { - "title": "Алиса и повтор слов.", - "task_text": "Создание программы, которая сканирует текстовый файл на наличие повторяющихся слов в тексте и выводит 10 наиболее часто встречающихся слов в порядке убывания их частоты. Алиса будет помогать оптимизировать алгоритм и ускорить процесс.", - "solve": "Для решения задачи можно использовать словарь, где ключом будет являться слово, а значением - количество его вхождений в текст. Программа сканирует текстовый файл на наличие повторяющихся слов в тексте, подсчитывает количество вхождений каждого слова и сортирует слова по количеству вхождений в порядке убывания. Затем программа выводит наиболее часто встречающиеся слова в порядке убывания их частоты.", - "code": "import re \nwith open('text.txt', 'r') as file: \n text = file.read() \ntext = re.sub(r'[ws]', '', text) \nwords = text.lower().split() \nword_count = {} \nfor word in words: \n if word in word_count: \n word_count[word] += 1 \n else: \n word_count[word] = 1 \nsorted_words = sorted(word_count, key=word_count.get, reverse=True) \nfor word in sorted_words[:10]: \n print(f'{word}: {word_count[word]}')", - "difficulty":3 - }, - "17": { - "title": "Алиса и неубывающая последовательность.", - "task_text": "Разработка программы, которая будет находить наибольшую сумму неубывающей подпоследовательности в данном массиве чисел. Алиса будет помогать выявлять и устранять ошибки в коде.", - "solve": "Для решения этой задачи можно использовать алгоритм динамического программирования, который будет хранить на каждом шаге наибольшую сумму неубывающей подпоследовательности, заканчивающейся в данном элементе массива. Функция `max_sum_subsequence` принимает массив чисел `arr` и возвращает наибольшую сумму неубывающей подпоследовательности в этом массиве. Алгоритм начинается с инициализации списка `dp` длины `len(arr)` нулями. Затем первый элемент списка `dp` присваивается первому элементу массива `arr`. Далее проходим по массиву `arr` начиная со второго элемента. Если текущий элемент больше или равен предыдущему элементу, то наибольшая сумма неубывающей подпоследовательности, заканчивающейся в текущем элементе, равна сумме наибольшей неубывающей подпоследовательности, заканчивающейся в предыдущем элементе, и текущего элемента.", - "code": "def max_sum_subsequence(arr): \n dp = [0] * len(arr) \n dp[0] = arr[0] \n for i in range(1, len(arr)): \n if arr[i] >= arr[i-1]: \n dp[i] = dp[i-1] + arr[i] \n else: \n dp[i] = arr[i] \n max_sum = max(dp) \n return max_sum ", - "difficulty":3 - }, - "18": { - "title": "Алиса и криптография.", - "task_text": "Дан набор чисел и шифр, который нужно расшифровать. Алиса знает, что шифрование произведено с помощью определенного алгоритма. Напишите программу для Алисы, которая реализует этот алгоритм и расшифрует сообщение.", - "solve": "Программа реализует алгоритм расшифровки для заданного набора чисел и шифра. Сначала мы задаем набор чисел и шифр. Затем мы инициализируем пустую строку для расшифрованного сообщения. Далее мы используем цикл `for` для прохода по каждому числу в наборе и добавления соответствующего символа из шифра в расшифрованное сообщение. Для определения символа мы используем операцию остатка от деления числа на длину шифра, чтобы получить индекс символа в шифре. Наконец, мы выводим расшифрованное сообщение на экран.", - "code": "numbers = [10, 23, 56, 7, 31] \ncipher = 'abcdef' \nmessage = '' \nfor number in numbers: \n message += cipher[number % len(cipher)] \nprint(message)", - "difficulty":2 - }, - "19": { - "title": "Алиса и матрица.", - "task_text": "Дана матрица, в которой нужно найти наибольшую сумму элементов в одной строке или одном столбце. Напишите программу для Алисы, которая определит эту сумму.", - "solve": "Программа находит наибольшую сумму элементов в одной строке или одном столбце заданной матрицы. Сначала мы задаем матрицу. Затем мы используем генераторы списков и функции `sum()` для нахождения суммы элементов в каждой строке и столбце матрицы. Для нахождения суммы элементов в столбцах мы используем функцию `zip()`, которая объединяет элементы матрицы в кортежи и транспонирует матрицу. Затем мы находим максимальную сумму элементов с помощью встроенной функции `max()` и выводим ее на экран.", - "code": "matrix = [[1, 2, 3],[4, 5, 6],[7, 8, 9]]\nmax_row_sum = max(sum(row) for row in matrix) \nmax_col_sum = max(sum(col) for col in zip(*matrix)) \nmax_sum = max(max_row_sum,max_col_sum) \nprint(max_sum)", - "difficulty":2 - }, - "20": { - "title": "Медиана.", - "task_text": "Создать функцию для вычисления медианы ряда чисел.", - "solve": "Сначала функция находит количество элементов при помощи `len()` и записывает его в переменную `n`. Далее вычисляем индекс среднего элемента делением переменной `n` нацело на 2. Если Количество элементов чётно - возвращаем средний элемент упорядоченного списка. Иначе - находим среднее арифметическое двух средних элементов упорядоченного списка. Возвращаем результат.", - "code": "def my_median(sample): \nn = len(sample) \nindex = n // 2\nif n % 2: \n return sorted(sample)[index]\n return sum(sorted(sample)[index - 1:index + 1]) / 2 ", - "difficulty":0 - }, - "21": { - "title": "Сумма квадратов чисел.", - "task_text": "Программа для нахождения суммы квадратов чисел. Пользователь должен ввести набор чисел, а программа должна вычислить сумму квадратов этих чисел и вывести результат.", - "solve": "В этой программе мы сначала запрашиваем у пользователя набор чисел, разделенных пробелом. Затем мы преобразуем строку в список чисел, используя функцию `split` для разделения строки на отдельные элементы и функцию `map` для преобразования каждого элемента в число. Затем мы вычисляем сумму квадратов чисел, используя генератор списка и оператор `**` для возведения каждого числа в квадрат. Генератор списка создает новый список, содержащий квадраты каждого элемента в исходном списке чисел.", - "code": "numbers = input() \nnumbers_list = list(map(float, numbers.split())) \nsquares_sum = sum([num**2 for num in numbers_list]) \nprint(squares_sum) ", - "difficulty":0 - }, - "22": { - "title": "Факториал числа.", - "task_text": "Программа для вычисления факториала числа. Пользователь должен ввести число, а программа должна вычислить его факториал и вывести результат.", - "solve": "В этой программе мы сначала запрашиваем у пользователя число, для которого нужно вычислить факториал. Затем мы вычисляем факториал числа, используя цикл `for`. Внутри цикла мы умножаем переменную `factorial` на текущее значение переменной `i` на каждой итерации цикла. На первой итерации `i` равно 1, на второй - 2, на третьей - 3, и так далее, пока `i` не достигнет значения `number`. Наконец, мы выводим результат на экран в виде сообщения пользователю.", - "code": "number = int(input()) \nfactorial = 1 \nfor i in range(1, number + 1): \n factorial *= i \nprint(factorial) ", - "difficulty":1 - }, - "23": { - "title": "Число 3 как смысл жизни.", - "task_text": "Программа для определения чисел, которые делятся на 3. Пользователь должен ввести набор чисел, а программа должна вывести все числа, которые делятся на 3 без остатка.", - "solve": "В этой программе мы сначала запрашиваем у пользователя набор чисел, разделенных пробелом. Затем мы преобразуем строку в список чисел, используя функцию `split` для разделения строки на отдельные элементы и функцию `map` для преобразования каждого элемента в целое число. Затем мы находим числа, которые делятся на 3 без остатка, используя генератор списка и условный оператор `if`. Генератор списка создает новый список, содержащий элементы, для которых выполняется условие в условном операторе `if`. Наконец, мы выводим результат на экран в виде списка чисел, которые делятся на 3 без остатка.", - "code": "numbers = input() \nnumbers_list = list(map(int, numbers.split())) /ndivisible_by_3 = [num for num in numbers_list if num % 3 == 0] \nprint(divisible_by_3) ", - "difficulty":1 - }, - "24": { - "title": "Подсчет ингредиентов.", - "task_text": "Программа для подсчёта количества ингредиентов для приготовления блюда. Пользователь вводит количество порций, а программа автоматически вычисляет необходимое количество ингредиентов для приготовления блюда.", - "solve": "В этой программе мы сначала создаем словарь, в котором указываем необходимое количество ингредиентов для приготовления одной порции блюда. Затем мы запрашиваем у пользователя количество порций и вычисляем необходимое количество ингредиентов для приготовления заданного количества порций, используя цикл for и обращаясь к словарю с необходимым количеством ингредиентов для одной порции блюда. Результаты выводятся на экран в виде словаря, где ключами являются названия ингредиентов, а значениями - необходимое количество ингредиентов для приготовления заданного количества порций.", - "code": "ingredients_per_serving = {'яйцо': 1, 'молоко': 200, 'сыр': 50}\nservings = int(input()) \ningredients = {} \nfor ingredient, quantity in ingredients_per_serving.items(): \n ingredients[ingredient] = quantity * servings \nprint(ingredients) ", - "difficulty":1 - }, - "25": { - "title": "Стоимость пиццы.", - "task_text": "Программа для расчёта стоимости пиццы. Пользователь вводит диаметр и цену пиццы, а программа вычисляет цену за квадратный дюйм и выводит её на экран.", - "solve": "В этой программе пользователь сначала вводит диаметр пиццы (в дюймах) и её цену. Затем программа вычисляет площадь пиццы (используя формулу для вычисления площади круга), а затем вычисляет стоимость за квадратный дюйм, разделив цену на площадь. Результат выводится на экран в виде сообщения пользователю.", - "code": "diameter = float(input()) \nprice = float(input()) \nradius = diameter / 2 \narea = 3.14159 * radius ** 2 \ncost_per_square_inch = price / area \nprint(round(cost_per_square_inch, 2))", - "difficulty":0 - }, - "26": { - "title": "Стоимость продуктов.", - "task_text": "Программа для определения стоимости продукта за сантиметр квадратный. Пользователь должен вводить название продукта, его вес, и цену а программа должна выводить его название и цену за сантиметр квадратный", - "solve": "В этой программе пользователь сначала вводит вес продукта (в граммах) и цену (за упаковку). Затем программа вычисляет площадь продукта (предполагая, что она равна весу в граммах, деленному на 10), а затем вычисляет стоимость за квадратный сантиметр, разделив цену на площадь. Результат выводится на экран в виде сообщения пользователю.", - "code": "product_weight = float(input()) /nproduct_price = float(input()) \nproduct_area = product_weight / 10 \nprice_per_cm2 = product_price / product_area \nprint(round(price_per_cm2, 2))", - "difficulty":1 - }, - "27": { - "title": "Закупаем продукты.", - "task_text": "Программа для определения продуктов, которые необходимо купить на неделю. Пользователь должен ввести список продуктов, которые есть в холодильнике, и список блюд на неделю. Программа должна вывести список продуктов, которые необходимо купить для приготовления блюд.", - "solve": "В этой программе мы сначала запрашиваем у пользователя список продуктов в холодильнике и список блюд на неделю. Затем мы преобразуем строки в списки с помощью метода `split`. Затем мы создаем пустой список `shopping_list` для продуктов, которые необходимо купить. Затем мы проходим по каждому блюду в списке `menu_list` и проверяем каждый ингредиент в блюде. Если ингредиент не находится в списке продуктов в холодильнике и еще не добавлен в список `shopping_list`, мы добавляем его в список `shopping_list`. Наконец, мы выводим результат на экран. Если список `shopping_list` не пустой, мы выводим список продуктов, которые необходимо купить, в противном случае выводим сообщение, что продуктов для покупки не требуется.", - "code": "fridge = input() \nfridge_list = fridge.split(',') /nmenu = input('Введите список блюд на неделю через запятую: ') \nmenu_list = menu.split(',') /nshopping_list = [] \nfor dish in menu_list: \n for ingredient in dish.split(): \n if ingredient not in fridge_list and ingredient not in shopping_list: \n shopping_list.append(ingredient) /nif shopping_list: \n print(', '.join(shopping_list)) /nelse: \n print('Продуктов для покупки не требуется.')", - "difficulty":2 - } -} \ No newline at end of file +{ + "1": { + "title": "Умножение чисел.", + "task_text": "Напишите программу, которая принимает на вход два числа и выводит их произведение.", + "solve": "Запросим у пользователя два числа c помощью 'input()'. Затем умножим два полученных числа и выведем результат на экран через 'print()'.", + "code": "num1 = float(input()) \n num2 = float(input()) \n print(num1 * num2)", + "difficulty": 0 + }, + + "2": { + "title": "Инверсия.", + "task_text": "Реализуйте функцию, которая принимает на вход строку и возвращает ее в обратном порядке.", + "solve": "Функция `reverse_string()` принимает один аргумент - `s`, который является строкой. Для разворота строки мы используем срезы с отрицательным шагом. Срез `[::-1]` означает, что мы берем все символы строки от конца к началу с шагом -1, то есть в обратном порядке.", + "code": "def reverse_string(s):\n return s[::-1]", + "difficulty": 0 + }, + + "3": { + "title": "Пересечение.", + "task_text": "Напишите функцию, которая принимает на вход два списка чисел и возвращает список, содержащий только числа, которые есть в обоих списках.", + "solve": "Функция `common_elements()` принимает два аргумента - `list1` и `list2`, которые являются списками чисел. Сначала функция преобразует списки во множества с помощью встроенной функции `set()`. Затем функция находит пересечение множеств с помощью метода `intersection()`. Наконец, функция преобразует множество обратно в список с помощью встроенной функции `list()` и возвращает его.", + "code": "def common_elements(list1, list2): \n set1 = set(list1) \n set2 = set(list2) \n result = set1.intersection(set2) \n return list(result)", + "difficulty": 0 + }, + + "4": { + "title": "Подсчёт букв.", + "task_text": "Создайте программу, которая просит пользователя ввести слово и затем выводит количество гласных букв в этом слове.", + "solve": "Код начинается с запроса на ввод слова от пользователя с помощью `input()`. Затем мы создаем список гласных букв и инициализируем переменную `count` для подсчета гласных букв. Далее, мы перебираем каждую букву в слове с помощью цикла `for`, проверяем, является ли буква гласной, и если да, увеличиваем счетчик `count`.", + "code": "word = input() \nvowels = ['a', 'e', 'i', 'o', 'u'] \ncount = 0 \n for letter in word: \n if letter.lower() in vowels: \n count += 1 \n print('Количество гласных букв в слове', word, ':',count)", + "difficulty": 0 + }, + + "5": { + "title": "Строки.", + "task_text": "Напишите программу, которая принимает на вход две строки и возвращает последнее слово в каждой из них.", + "solve": "Функция `last_words()` принимает два аргумента - `s1` и `s2`, которые являются строками. Для нахождения последнего слова в каждой строке мы используем метод `split()`, который разбивает строку на слова. Затем мы берем последнее слово в списке слов с помощью индекса `-1`. Возвращается список с последними словами.", + "code": "def last_words(s1, s2): \n last_word1 = s1.split()[-1] \n last_word2 = s2.split()[-1] \n return [last_word1, last_word2]", + "difficulty": 0 + }, + + "6": { + "title": "Среднее арифметическое.", + "task_text": "Реализуйте функцию, которая принимает на вход список чисел и возвращает среднее значение этого списка.", + "solve": "Функция `average()` принимает один аргумент - `numbers`, который является списком чисел. Для вычисления среднего значения мы сначала вычисляем сумму всех чисел в списке с помощью встроенной функции `sum()`, а затем количество чисел в списке с помощью встроенной функции `len()`. Затем мы вычисляем среднее значение, которое равно сумме чисел, деленной на количество чисел. Наконец, мы возвращаем среднее значение с помощью ключевого слова `return`.", + "code": "def average(numbers): \n return sum(numbers) / len(numbers)", + "difficulty": 0 + }, + + "7": { + "title": "Числа Фибоначчи.", + "task_text": "Напишите программу, которая просит пользователя ввести число N и затем выводит первые N чисел Фибоначчи.", + "solve": "Сначала мы запрашивает у пользователя число N с помощью функции `input()`. Далее инициализирует переменные `a` и `b`, которые будут использоваться для вычисления чисел Фибоначчи. Затем использует цикл `for` для вычисления и вывода первых N чисел Фибоначчи. В каждой итерации цикла программа выводит текущее число Фибоначчи и обновляет значения переменных `a` и `b` для вычисления следующего числа Фибоначчи. Наконец, выводим последовательность чисел Фибоначчи на экран.", + "code": "n = int(input()) \na, b = 0, 1 \n for i in range(n): \n print(a, end=' ') \n a, b = b, a + b", + "difficulty": 0 + }, + + "8": { + "title": "Илон Шмаск и список.", + "task_text": "Напишите программу для Илона Шмаска с созданием списка чисел от 1 до 10 включительно.", + "solve": "Мы создаем при помощи генератора список чисел от 0 до 10 включительно. Затем мы выводим список на экран с помощью функции `print()`.", + "code": "\nprint('Добро пожаловать в компанию SpaceY!') \nprint([i for i in range(11)])", + "difficulty": 1 + }, + + "9": { + "title": "Билл Герц и генератор паролей.", + "task_text": "Напишите программу для Билла Герца с генерацией случайного пароля длиной 8 символов, содержащего только буквы латинского алфавита (в верхнем и нижнем регистре) и цифры.", + "solve": "Мы импортируем модули `random` и `string`, чтобы использовать функции для генерации случайных чисел и создания списка символов, которые могут входить в пароль. Затем мы создаем пустую строку `password` и используем цикл `for` для генерации случайного пароля длиной 8 символов. В каждой итерации цикла мы добавляем случайный символ из списка `characters` к строке `password` с помощью метода `random.choice()`. Наконец, мы выводим пароль на экран с помощью функции `print()`.", + "code": "import random, string \ncharacters = string.ascii_letters + string.digits \npassword = '' \nfor i in range(8): \n password += random.choice(characters \nprint(password)", + "difficulty": 2 + }, + + "10": { + "title": "День недели.", + "task_text": "Напишите программу, которая запрашивает у пользователя день недели (например, 'понедельник') и выводит сообщение 'Сегодня <день недели>', где <день недели> - введенный пользователем день недели.", + "solve": "Мы запрашиваем у пользователя день недели с помощью функции `input()` и сохраняем его в переменную `day`. Наконец, мы выводим сообщение с указанием введенного дня недели, используя форматирование строк с помощью f-строк.", + "code": "day = input('Введите день недели: ') \nprint(f'Сегодня {day}') \n", + "difficulty": 0 + }, + + "11": { + "title": "Cумма чисел до 10.", + "task_text": "Напишите программу для нахождения суммы всех чисел от 1 до 10 включительно.", + "solve": "Применим в решении генератор для чисел от 0 до 10 включительно. При помощи функции `sum` получим их сумму и выведем ее на экран при помощи `print`.", + "code": "print(sum([i for i in range(11)]))", + "difficulty": 1 + }, + + "12": { + "title": "Угадай-ка.", + "task_text": "Напишите программу, которая загадывает случайное число от 1 до 10 и просит пользователя угадать это число. Если пользователь угадал число, выводится сообщение 'Поздравляю, вы победили!'. Если нет, выводится сообщение 'К сожалению, вы проиграли. Загаданное число было <число>'.", + "solve": "Мы используем модуль `random`, чтобы загадать случайное число от 1 до 10. Затем мы просим пользователя ввести число и проверяем, угадал ли он загаданное число. Если пользователь угадал число, то выводится сообщение об победе, иначе программа выводит сообщение о проигрыше.", + "code": "import random \n number = random.randint(1, 10) \nguess = input('Введите число от 1 до 10: ') \nif int(guess) == number: \n print('Поздравляю, вы победили!') \nelse: \n print(f'К сожалению, вы проиграли. Загаданное число было {number}.')", + "difficulty": 1 + } +} \ No newline at end of file diff --git a/texts_for_users.json b/texts_for_users.json index 4492fd7..76f05ef 100644 --- a/texts_for_users.json +++ b/texts_for_users.json @@ -101,5 +101,23 @@ ", вы многому научились!", ", вы большой молодец!", ", вы просто молодец!" + ], + "win_sounds": [ + "", + "", + "" + ], + "lose_sounds": [ + "", + "", + "", + "", + "", + "", + "", + "" + ], + "sound_of_looking_results": [ + "" ] } \ No newline at end of file diff --git a/useful_functions.py b/useful_functions.py index e8cefa2..2676db0 100644 --- a/useful_functions.py +++ b/useful_functions.py @@ -5,6 +5,8 @@ def create_sessional_data (sessional_data: dict) -> dict: if sessional_data == { }: # То есть это первое сообщение return { "state": "in_main_menu", + "last_phrase": "", + "last_buttons": [ ], "text_of_quest": "", "correct_answer_of_quest": 0, "difficulty_level_of_quest": 0, From f6647de0d0b5108d804f14fa1a0bdad175d12498 Mon Sep 17 00:00:00 2001 From: TchTech <67865526+TchTech@users.noreply.github.com> Date: Sun, 26 Mar 2023 18:55:01 +0300 Subject: [PATCH 19/31] tasks --- main3.py | 146 +++++++++++++++++- sounds/entering/entering.mp3 | Bin 0 -> 279031 bytes .../1_wrong_quests.mp3" | Bin 0 -> 27388 bytes .../2_wrong_quests.mp3" | Bin 0 -> 10910 bytes .../3_wrong_quests.mp3" | Bin 0 -> 19547 bytes .../4_wrong_quests.mp3" | Bin 0 -> 30375 bytes .../5_wrong_quests.mp3" | Bin 0 -> 21428 bytes .../6_wrong_quests.mp3" | Bin 0 -> 17875 bytes .../7_wrong_quests.mp3" | Bin 0 -> 23726 bytes .../8_wrong_quests.mp3" | Bin 0 -> 13904 bytes .../1_right_quests.mp3" | Bin 0 -> 13791 bytes .../2_right_quests.mp3" | Bin 0 -> 17598 bytes .../3_right_quests.mp3" | Bin 0 -> 22932 bytes .../get_results.mp3" | Bin 0 -> 74018 bytes sounds/tasks/tasks_1.mp3 | Bin 0 -> 50646 bytes sounds/tasks/tasks_2.mp3 | Bin 0 -> 173497 bytes sounds/tasks/tasks_3.mp3 | Bin 0 -> 81987 bytes sounds/tasks/tasks_4.mp3 | Bin 0 -> 42470 bytes task_getter.py | 4 +- useful_functions.py | 2 + 20 files changed, 145 insertions(+), 7 deletions(-) create mode 100644 sounds/entering/entering.mp3 create mode 100644 "sounds/quests/\320\235\320\265\320\277\321\200\320\260\320\262\320\270\320\273\321\214\320\275\320\276/1_wrong_quests.mp3" create mode 100644 "sounds/quests/\320\235\320\265\320\277\321\200\320\260\320\262\320\270\320\273\321\214\320\275\320\276/2_wrong_quests.mp3" create mode 100644 "sounds/quests/\320\235\320\265\320\277\321\200\320\260\320\262\320\270\320\273\321\214\320\275\320\276/3_wrong_quests.mp3" create mode 100644 "sounds/quests/\320\235\320\265\320\277\321\200\320\260\320\262\320\270\320\273\321\214\320\275\320\276/4_wrong_quests.mp3" create mode 100644 "sounds/quests/\320\235\320\265\320\277\321\200\320\260\320\262\320\270\320\273\321\214\320\275\320\276/5_wrong_quests.mp3" create mode 100644 "sounds/quests/\320\235\320\265\320\277\321\200\320\260\320\262\320\270\320\273\321\214\320\275\320\276/6_wrong_quests.mp3" create mode 100644 "sounds/quests/\320\235\320\265\320\277\321\200\320\260\320\262\320\270\320\273\321\214\320\275\320\276/7_wrong_quests.mp3" create mode 100644 "sounds/quests/\320\235\320\265\320\277\321\200\320\260\320\262\320\270\320\273\321\214\320\275\320\276/8_wrong_quests.mp3" create mode 100644 "sounds/quests/\320\237\321\200\320\260\320\262\320\270\320\273\321\214\320\275\320\276/1_right_quests.mp3" create mode 100644 "sounds/quests/\320\237\321\200\320\260\320\262\320\270\320\273\321\214\320\275\320\276/2_right_quests.mp3" create mode 100644 "sounds/quests/\320\237\321\200\320\260\320\262\320\270\320\273\321\214\320\275\320\276/3_right_quests.mp3" create mode 100644 "sounds/quests/\320\243\320\267\320\275\320\260\321\202\321\214 \320\274\320\276\320\270 \321\200\320\265\320\267\321\203\320\273\321\214\321\202\320\260\321\202\321\213/get_results.mp3" create mode 100644 sounds/tasks/tasks_1.mp3 create mode 100644 sounds/tasks/tasks_2.mp3 create mode 100644 sounds/tasks/tasks_3.mp3 create mode 100644 sounds/tasks/tasks_4.mp3 diff --git a/main3.py b/main3.py index 8a76c04..00e7bae 100644 --- a/main3.py +++ b/main3.py @@ -11,6 +11,41 @@ from typing import Literal +def code_to_speech(code: str) -> str: + REPLACEMENTS = { + ")": " скобка закрывается ", + "(": " скобка открывается ", + "*": " звёздочка ", + "'": " кавычки ", + '"': " кавычки ", + "{": " фигурная скобка открывается ", + "}": " фигурная скобка закрывается ", + ":": " двоеточие ", + "!": " восклицательный знак ", + ".": " точка ", + ",": " запятая ", + "[": " квадратная скобка открывается ", + "]": " квадратная скобка закрывается ", + "||": " две вертикальные линии (операция или) ", + ">": " больше ", + "<": " меньше ", + "/": " разделить ", + "-": " минус ", + "+": " плюс ", + "%": " процент ", + "@": " собачка ", + "&": " амперсанд " + } + + PAUSE = "sil <[250]>" + lines = code.split("\n") + formatted_lines = [] + for i, line in enumerate(lines, start=1): + formatted_line = line + for k in REPLACEMENTS.keys(): + formatted_line = formatted_line.replace(k, REPLACEMENTS[k]) + formatted_lines.append(f"{PAUSE} строка {i} {PAUSE} {formatted_line}") + return "\n".join(formatted_lines) + PAUSE class HandlerOfAlisa: def __init__ (self, request: dict): @@ -168,8 +203,6 @@ def _working_with_user_outside_main_menu (self) -> None: self._start_next_lesson_or_not ( ) case "working_with_tasks": self._working_with_tasks ( ) - case "choosing_right_answer_for_task": - self._choosing_right_answer_for_task ( ) case "working_with_quest": self._working_with_quest ( ) case "choosing_right_answer_for_quest": @@ -178,6 +211,12 @@ def _working_with_user_outside_main_menu (self) -> None: self._viewing_quest_results ( ) case "sending_report": self._sending_report ( ) + case "choosing_between_solve_and_code": + self._choosing_between_solve_and_code() + case "wish_to_see_solve": + self.wish_to_see_solve() + case "wish_to_see_code": + self.wish_to_see_code() case "consulting": self._consulting ( ) @@ -263,6 +302,51 @@ def _user_wants_to_end_session (self) -> bool: else: return False + def _choosing_between_solve_and_code(self) -> None: + entering = ["Ха! Сдаётесь?", "Сдаётесь?", "Ну что, у вас получилось?", "Что скажете?", "Уже?"] + a = random.choice(entering) + if self._has_one_word_in_text_in_lower ("решение", "решению", "реши", "решил", "ответ", "решай", "отвечай", "решении", "ответе"): + self._OUTPUT_TEXT = a + "\nИтак, решение: " + self._SESSIONAL_DATA["solve"] + "\nХотите услышать код решения на Python?" + self._SESSIONAL_DATA["state"] = "wish_to_see_code" + elif self._has_one_word_in_text_in_lower ("код", "коды", "кода", "скрипт", "скрипты", "скрипта", "скрипте", "коде"): + self._OUTPUT_TEXT = a + "\nИтак, код: " + self._SESSIONAL_DATA["code"] + "\nХотите услышать объяснение?" + self._TEXT_TO_SPEECH = a + "Итак код. " + code_to_speech(self._SESSIONAL_DATA["code"]) + ".Хотите услышать объяснение?" + self._SESSIONAL_DATA["state"] = "wish_to_see_solve" + elif self._user_wants_to_go_to_main_menu: + self._go_to_main_menu ( ) + + elif self._user_wants_to_end_session: + self._end_the_session ( ) + + else: + self._OUTPUT_TEXT = get_apology_text ( ) + + def wish_to_see_code(self): + if self._has_one_word_in_text_in_lower ("да", "ага", "давай", "поехали", "ес", "погнали", "говори", "гони"): + self._OUTPUT_TEXT = "Итак, код: " + self._SESSIONAL_DATA["code"] + "\nХотите ещё задачу? Тогда просто назовите желаемую сложность." + self._TEXT_TO_SPEECH = "итак код. " + code_to_speech(self._SESSIONAL_DATA["code"]) + ".хотите ещё задачу? Тогда просто назовите желаемую сложность." + self._SESSIONAL_DATA["state"] = "working_with_tasks" + elif self._user_wants_to_go_to_main_menu: + self._go_to_main_menu ( ) + + elif self._user_wants_to_end_session: + self._end_the_session ( ) + + else: + self._OUTPUT_TEXT = get_apology_text ( ) + + def wish_to_see_solve(self): + if self._has_one_word_in_text_in_lower ("да", "ага", "давай", "поехали", "ес", "погнали", "говори", "гони"): + self._OUTPUT_TEXT = "Итак, решение: " + self._SESSIONAL_DATA["solve"] + "\nХотите ещё задачу? Тогда просто назовите желаемую сложность." + self._SESSIONAL_DATA["state"] = "working_with_tasks" + elif self._user_wants_to_go_to_main_menu: + self._go_to_main_menu ( ) + + elif self._user_wants_to_end_session: + self._end_the_session ( ) + + else: + self._OUTPUT_TEXT = get_apology_text ( ) def _user_has_not_listened_to_any_lesson (self) -> None: self._OUTPUT_TEXT = "Вы ещё не прошли ни одного урока.\n" @@ -351,23 +435,32 @@ def _working_with_tasks (self) -> None: if self._has_one_word_in_text_in_lower ( "лёгкий", "лёгкого", "лёгкому", "лёгким", "лёгком", "легкий", "легкого", "легкому", "легким", "легком"): - self._OUTPUT_TEXT = random.choice (("Хорошо, ", "Отлично, ", "Прекрасно, ")) + "тогда начнём?\n" self._SESSIONAL_DATA["difficulty_level_of_task"] = DifficultyLevels.EASY.value self._SESSIONAL_DATA["state"] = "choosing_between_solve_and_code" + self._save_text_and_solve_of_easy_task_in_session_data() + a = ['Хорошо', 'Итак', "Отлично", "Так-с", "Ага", "Замечательно", "Супер"] + self._OUTPUT_TEXT = random.choice(a)+", давайте приступим. Задача называется \""+self._SESSIONAL_DATA["title"]+"\".\nЧитаю условие: \""+self._SESSIONAL_DATA["task_text"]+"\"\nПопробуйте решить сами. Если захотите услышать решение или код, просто скажите мне \"Решение\" или \"Код\"." + elif self._has_one_word_in_text_in_lower ( "средний", "среднего", "среднему", "среднем", "средняя", "средней", "среднюю"): - self._OUTPUT_TEXT = random.choice (("Хорошо, ", "Отлично, ", "Прекрасно, ")) + "тогда начнём?\n" self._SESSIONAL_DATA["difficulty_level_of_task"] = DifficultyLevels.MEDIUM.value self._SESSIONAL_DATA["state"] = "choosing_between_solve_and_code" + self._save_text_and_solve_of_medium_task_in_session_data() + a = ['Хорошо', 'Итак', "Отлично", "Так-с", "Ага", "Замечательно", "Супер"] + self._OUTPUT_TEXT = random.choice(a)+", давайте приступим. Задача называется \""+self._SESSIONAL_DATA["title"]+"\".\nЧитаю условие: \""+self._SESSIONAL_DATA["task_text"]+"\"\nПопробуйте решить сами. Если захотите услышать решение или код, просто скажите мне \"Решение\" или \"Код\"." + elif self._has_one_word_in_text_in_lower ( "высокий", "высокого", "высокому", "высоким", "высоком", "сложный", "сложного", "сложному", "сложным", "сложном"): - self._OUTPUT_TEXT = random.choice (("Хорошо, ", "Отлично, ", "Прекрасно, ")) + "тогда начнём?\n" self._SESSIONAL_DATA["difficulty_level_of_task"] = DifficultyLevels.HARD.value self._SESSIONAL_DATA["state"] = "choosing_between_solve_and_code" + self._save_text_and_solve_of_hard_task_in_session_data() + a = ['Хорошо', 'Итак', "Отлично", "Так-с", "Ага", "Замечательно", "Супер"] + self._OUTPUT_TEXT = random.choice(a)+", давайте приступим. Задача называется \""+self._SESSIONAL_DATA["title"]+"\".\nЧитаю условие: \""+self._SESSIONAL_DATA["task_text"]+"\"\nПопробуйте решить сами. Если захотите услышать решение или код, просто скажите мне \"Решение\" или \"Код\"." + elif self._has_one_word_in_text_in_lower ( "случайный", "случайного", "случайному", "случайным", "случайном", @@ -375,9 +468,11 @@ def _working_with_tasks (self) -> None: "рандом", "рандома", "рандому", "рандомом", "рандоме", "рандомный", "рандомного", "рандомному", "рандомном", "рандомная", "рандомной", "рандомную"): - self._OUTPUT_TEXT = random.choice (("Хорошо, ", "Отлично, ", "Прекрасно, ")) + "\n" self._SESSIONAL_DATA["difficulty_level_of_task"] = DifficultyLevels.get_random_difficulty_level_for_task ( ) self._SESSIONAL_DATA["state"] = "choosing_between_solve_and_code" + self._save_text_and_solve_of_random_task_in_session_data() + a = ['Хорошо', 'Итак', "Отлично", "Так-с", "Ага", "Замечательно", "Супер"] + self._OUTPUT_TEXT = random.choice(a)+", давайте приступим. Задача называется \""+self._SESSIONAL_DATA["title"]+"\".\nЧитаю условие: \""+self._SESSIONAL_DATA["task_text"]+"\"\nПопробуйте решить сами. Если захотите услышать решение или код, просто скажите мне \"Решение\" или \"Код\"." elif self._has_one_word_in_text_in_lower ("результат", "результаты"): pass @@ -392,6 +487,13 @@ def _working_with_tasks (self) -> None: self._OUTPUT_TEXT = get_apology_text ( ) self._BUTTONS.add_buttons ("На главное меню", "Пока!", hide_all = True) + def _save_text_and_solve_of_random_task_in_session_data(self): + task_getter = TaskGetter ( ) + task = task_getter.get_random_task ( ) + self._SESSIONAL_DATA["title"] = task["title"] + self._SESSIONAL_DATA["text_of_task"] = task["task_text"] + self._SESSIONAL_DATA["solve"] = task["solve"] + self._SESSIONAL_DATA["code"] = task["code"] def _choosing_right_answer_for_task (self) -> None: # FIXME @@ -477,6 +579,38 @@ def _save_text_and_correct_answer_of_hard_quest_in_session_data (self) -> None: self._SESSIONAL_DATA["correct_answer_of_quest"] = quest_getter.correct_answer_of_random_hard_quest #self._TEXT_TO_SPEECH = quest_getter.answers_to_speech_of_random_hard_quest_as_str + def _save_text_and_solve_of_easy_task_in_session_data (self) -> None: + task_getter = TaskGetter ( ) + task = task_getter.get_random_easy_task ( ) + self._SESSIONAL_DATA["title"] = task["title"] + self._SESSIONAL_DATA["text_of_task"] = task["task_text"] + self._SESSIONAL_DATA["solve"] = task["solve"] + self._SESSIONAL_DATA["code"] = task["code"] + + def _save_text_and_solve_of_medium_task_in_session_data (self) -> None: + task_getter = TaskGetter ( ) + task = task_getter.get_random_medium_task ( ) + self._SESSIONAL_DATA["title"] = task["title"] + self._SESSIONAL_DATA["text_of_task"] = task["task_text"] + self._SESSIONAL_DATA["solve"] = task["solve"] + self._SESSIONAL_DATA["code"] = task["code"] + + def _save_text_and_solve_of_hard_task_in_session_data (self) -> None: + task_getter = TaskGetter ( ) + task = task_getter.get_random_hard_task ( ) + self._SESSIONAL_DATA["title"] = task["title"] + self._SESSIONAL_DATA["text_of_task"] = task["task_text"] + self._SESSIONAL_DATA["solve"] = task["solve"] + self._SESSIONAL_DATA["code"] = task["code"] + + def _save_text_and_solve_of_very_hard_task_in_session_data (self) -> None: + task_getter = TaskGetter ( ) + task = task_getter.get_random_very_hard_task ( ) + self._SESSIONAL_DATA["title"] = task["title"] + self._SESSIONAL_DATA["text_of_task"] = task["task_text"] + self._SESSIONAL_DATA["solve"] = task["solve"] + self._SESSIONAL_DATA["code"] = task["code"] + def _save_text_and_correct_answer_of_quest_in_session_data (self, difficulty_level: int) -> None: match difficulty_level: case DifficultyLevels.EASY.value: diff --git a/sounds/entering/entering.mp3 b/sounds/entering/entering.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..4e3dc3a78e1e6ea0796dd9c3e8afd929fe5543bf GIT binary patch literal 279031 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 }Ug?FEKn6q$5~h76Zj> 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 X+1a1y! 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%0Amj}N$@tK?3}SpvU$J|tPA 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 Z{yXC3{;hTTw^#bxCg^YP*}vJ~e*k995IFz< literal 0 HcmV?d00001 diff --git "a/sounds/quests/\320\235\320\265\320\277\321\200\320\260\320\262\320\270\320\273\321\214\320\275\320\276/3_wrong_quests.mp3" "b/sounds/quests/\320\235\320\265\320\277\321\200\320\260\320\262\320\270\320\273\321\214\320\275\320\276/3_wrong_quests.mp3" new file mode 100644 index 0000000000000000000000000000000000000000..e654d660b1534cefc33c8cdc376a8de2ce2b7f47 GIT binary patch literal 19547 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 literal 0 HcmV?d00001 diff --git "a/sounds/quests/\320\235\320\265\320\277\321\200\320\260\320\262\320\270\320\273\321\214\320\275\320\276/6_wrong_quests.mp3" "b/sounds/quests/\320\235\320\265\320\277\321\200\320\260\320\262\320\270\320\273\321\214\320\275\320\276/6_wrong_quests.mp3" new file mode 100644 index 0000000000000000000000000000000000000000..9261fbfea169b57a1fa875a456ceaf9735c1c06a GIT binary patch literal 17875 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 literal 0 HcmV?d00001 diff --git "a/sounds/quests/\320\235\320\265\320\277\321\200\320\260\320\262\320\270\320\273\321\214\320\275\320\276/7_wrong_quests.mp3" "b/sounds/quests/\320\235\320\265\320\277\321\200\320\260\320\262\320\270\320\273\321\214\320\275\320\276/7_wrong_quests.mp3" new file mode 100644 index 0000000000000000000000000000000000000000..56f2e98695817520284222ca598670c6fe5fd52d GIT binary patch literal 23726 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 literal 0 HcmV?d00001 diff --git "a/sounds/quests/\320\235\320\265\320\277\321\200\320\260\320\262\320\270\320\273\321\214\320\275\320\276/8_wrong_quests.mp3" "b/sounds/quests/\320\235\320\265\320\277\321\200\320\260\320\262\320\270\320\273\321\214\320\275\320\276/8_wrong_quests.mp3" new file mode 100644 index 0000000000000000000000000000000000000000..0dfe55521ff2c4b97ef31f5ffcf595875098de9f GIT binary patch literal 13904 zcmZv@byQo;7w;Y19a^LmFYZv>p-6FecXx*%#oeLBrC4w)4lR@d#fn2I(&FwANX`q- z@4ol1J6UJVOeQ&5pV_nbe6!Cvin6@Opr=AWpslFQ^VA>&fsg`yeVp8U18k^mY;A3v zyaPbmvYIkaW2jGKJX}0nAZ;xzxu-tfQ(xJ_*Op(9gNKWQn~Mu1rLOq&L43id0S6Zg zI~z`SS33}rl(VIe3$>M-uZ<@tPF+FYR(3bL9{we`~>h5mGM5Mw05%u_|? zEvN6T`_(sEsHHg!WZYR!ZA{<;d8?nOKLo&+q-# zCxZ|!8VxdfmiY1vbPc{QT12#j(%oSM5x>|m(Jy8-H8tp6_^An^>SK%Xm*eAyl#Gxo zEPpdg)tMjhz0*vhnZ4VH#KRUrrNx=wtO$PF0?DMo`(R6 zAJVNCVW{&zZ$(%7jX3O{?&H*LbY}EQYP#R~Z(b~(LLW}}^pZS!O^D=$GkzHLIsYC~ zI+#dn6j7Ec^{diL37HFr+M?6+J)8Fj{e&TsnBx)R)c3rjaazHWm=W^kqqaZFX~!SrC6IfP7u{tF?q=6)I-#46QM$t`J7UDKl}g%0O42RM!&MKimFzDIW9BP|cj^ zMwE=mxRwYpVv6Q(E&Rk3;iEPIy1RODp3@*!CLre3;4y{Z<`yEnN~6h@)XM zj_O~MJ1XHMNv)$h`E!ZU-&3^JFL$^Tz3S=|>r){8yF9Ece(FSW_9YNwvjeRP8+m)l z4HmiN^&LElXXL(|5;)mY)4aD<2t@vD@;D=p7e|cF5@T3-Tg#p7DzuQl7!-+5e0#*o zDjE94t7C}l+`HB9JXtM$A=EzYt0Oqzm6`I;>mNKK^o8kCHc8QJ$E-oYh(aqm*y5aK znex$~Y{AG>xmK;%DNK`4(^~O2!bmCqv|GQK#(=7=?a=8r+uz%Mx0Tm}Zf!%Qu8;95eN9?k9$}Wk zDwdgS@Bh`OG`uZ9M!RalN{~4yy3c<-Uwe~gktwoV6O+0C{4zd<_e$X6ACllvlcKND zcnrJ*At!ETA71|Teyu2VDJ@xBH%?~%FOi)FdfWqTbt|MC5qWyz8zmYz8*V7@ z{^nmv@}O$!@|q$JTfyr|KADduf&Q@anslttydJGmT79W%7^$yju)IFRS(9158oQF= zEjF08)wkZ<_G{WVe$1E`G!$rM{Czz($)de=DSa=N2k+VE2t(EoBu!So*v95jUT2nF z;Z}TPV*XVmATSccs1vq{i4K=ph{Z5*NS|7JXdj@q$)epgjp4~OE|MW8H~dh$Ef;r4 zpdx08JW?l*Hk1Z(eq9|lxET*3#YG;l2eqd(7ZeKNQ%3TkG_pC`X5`cR2=iWDlwZEf zWh42Vk+wxVV3~Nc8?4l=~@?llRNWAG5LHih@MeN5M(d^@8v}uGwsanYy1mF zNY7}Rq+Mf!5G!*$=M18M$E5yY*@s{Gtll}7J!52Mv`5{}pc4%_f@Wb$XT2fIWr49k za5xFim}jP14wuo;j~Koyq`|B$=?QP-PpE3L;x9~;jOLg22{4lB&jZ;^Ym9)iC zmyS|E=NJ2n%DD7wTuhCr(~sQJ`5Lpe&1jUZ;tj%P)hS1E#c2!r zYuZ8(IZ23bA_cWWvTSmj(WvyXWBvoPmt<^S_9rX9{6O7H>EAE%X%askLv(-CIh%H~ z=~lKiyA>Ff^NvuXS-yW&20vW8ygGJ8V6gt1PO}-V(p6>|T}DtfULM7+N6`Vk>TCsD zQQnSCUm#=Ron}Hvh5*zLkJ!v?lFq{P!)Wy2@0z!Z!IBr&>_2y#lw|fuoTB&CI9Z6B z?!x{p^YxQ(ut~C!5yI}6i{>t!Z4|en#%VBY8uH9mg6%N}+Qnc7jSkBgP5B{b{U9U| z^Is1a6qi@+Pg_1nQBGC1UfMk3x&6NaJg5)+|Ly-o581_Zr?Pg>#|ACCL;RlcI@G z%0$9t3Or~Ip@w0l>Dj@u!w>@4I7F{76ZwDjy6MJ=K13;ZGZ}?uX9b7V5S5;%`R~1r zv(*2hOwic(F(Z>ZMx@v3fNj3NOb;wtzYdleOX`vX%<4=?pzwaPb!dm?O)YSHd$FU` zicTC`69E58p+uhB%Dw*b9a6fC6p|?SHukQ}bdz9c1LuLKZbCBbyOp02E$Ynsm-tbH zo?RfmRSEIq$;A?_OH;&|#h1-V-xwT=9levcbUYu#X!7g1%nU{$%YV65F zrg7)4!p}fxAZ*fmk6lP}iAOD)SajT3tcEaO_!Wk}TDSQ3ylbnFe9g+ z6*`K~|5*rxRW0DK3pqsy&UY2PA{UMOC#aSf`NeSC@K@Du$f#gJGVtAZ9E_8f5Tm(i zCG0yL>G?2(!?N7q_MK^^nfFvZiJ?}gAf9dtk$&%Bcv9$ky4TE1ej2vYf5D^YAptzV zsz7h(RYi=eG9-&AX0oDXk*0N;8Ocy-1O-V_n0p#!#_$@e<5fI?@^9)KS)0QvLPA3!ak1IOPp1*$71UA(>3oX7PK-isuVIasTV;PB7AKNdZwM?qQev6PN9iLo2Fd}7WA>cD6Xy)jxA-npBc z|1CMJYf76VwuV8^*X+Sp7v~j= znb;}ColD-G+USTX?{0PKsnK|eOrpEN3SO)nN3Z4KCF~S`R>7ndA*Kk>-gPx&cBU|` z&I-{q;zH^7P!n2@w)%xt40E^2$#!?N4aQ`yaHd<_3-CDp06NF1Q8p*ITN$Rf-ju* zRg`Qhi0-D})zs!-6766gsaaeBmB98~5ZLYRBwumKme6O!mR%nHu+O$X(atD>=sbEw z_$pmJN+2$%fy|u-pVAubJ@Z+xM#+8jngOf-sUu>TO%o_W+5>+HrJ$~lk`pu329n$z z*q>5^aKq8z`sbq_4C*1)e|ict+UTWdELPyy49J0&eBTcXlUX=IL^>M6Bl5~b_&*kM zuC+)c)eKLdhxlY9pcl3u*yrLCjT&lx6z%rR%Is8q|Awtpec%FN(8il!KOMd?NzN%u5 zldcVv{C&pCGho$aEEy+j?AnXPd!^{~r&D*gO)RX?lNz6WzaxFe2p(>ySg{*FTKEKHGD|FG>{gMB{VRCvDhiz&D}@MU6O566&7}rUU%wb1kGG? z7u{~D$TH+gQZB_aI(|UmDL<}dQIw4pmQJKsd6V!->u93KmMy!U{k+K?CwsY_BUIw% zpHz~Z@TXhDxnrCwa+TRN{CTs(!8Qqub=xXd@UX-_{1m9WZRR*@|Ep5`hkcVn&>{hX z=zY}{r-EO)@^dGKS+ZuFvuN-O8CHYW@*fYsvH9deFwsqe9`qTA5`+EEZjee$fq6xP`yhK3027In9{g+IPQ zLHXkcw-E3;4QV`f_juT#$;iZO{(9{sNN>4*M$&&avbMP3AVNp@48#V)G%j&EqMiy@ zc*Ay`6IVs8LCa)&Cq!{E>3l4H(8%a0&J;Oii?NCpI=)oy#BbZydIOLLDjL*5V72w$ zB3di)QYOK4=O$P?q3bH(jwf;Q&|!w_`#Sq@TjCdnMr!Qr_n>b8s)B*hFk)LQ2bH{o z-E=0D?S`v6ygzmP?jM4ygJ_B!=_;oh?%m=BuRF@Y)*m<58~F8_PbIJj4Xi}(Cm7qA zABPsv5$e9zlqF%%S(}l-lBGy798P7_jBc8ZSM17S{B+BQv-}Js5QeEJW`<2&CnbYl zFBVfx?}K4D4suGNP-L`P{qlQ8r_bYib%`Kbo5b{mYU5li5C7^||B(CIFkZH&2&djH zd|gK(v%>weII|*r`i0@FreC+}uh)FE9C!Q{h!NzRn2N}M3UH*ltPfh#r@kYS6U%3M zGndka-7VBjP5k)qduZn7JDzeTbbY_2*V`9p22|DowS!620{T2U+4S=s=U=a#YJRWD z#7;+D?HC`z=J4M+;+n4W=TL73DfE=Syo2qKy6 zKGDpC=#$V(Ppcefqn-ljAI(WGdEgY*S8X<*WiF>rEbz}Bq*FXdfAlX^W)lf)p{aS*%G{Xoz~6n#hgUZy zdob|Y{jqkCq!%4!vuv0#k$URuf3G6T363ziz)k2HOiCD;@EqSoMwEe71xC)vBEpv$ zY2PT`m4tPVjF^_4-a3DQC=4J{Jb30ckF9Rc7e;Vs2286$2X|4D4(Vp?9I2HKXe@o*ndQ88&o%{W#!U*D9kwtYjf> zM?Z=xtt`k%CL?!Ecc1;D)DDl*jFV!lzuqKv+DOC0 zG<)pVGq`?DDR#{d|9#P~qvRg}(vL#hO>Cwtf91U-qCYwG3}gbr%w2TaEm1>IDmuQp z;@_gp&1%fYpx>z}Ql@8_RK06W8TM}Zv-nB5+lEMnj(%D6JiLbCZ!~&wxR^}gr(4PK z4nM9CLn2P-Dsa`=1=frgu#}88hO2jB6bL0PU^w@x&E%EUC&7Sv3CN6OFDBzfC*?*@3Y10lOpi+VJoS7qPau zyXfEJhDy8nOUNqrztp~Y=GQc$&59Fi*(^R-nPIRo^Ji8#&w( z4!XWsN{)f`1ILRatH3SzYy*VI8McweTF0APGPKFWOmyNt?}Wn9W%G7GVoG`|RafWH zgrMHTKW$iH%;QHaSN=qUP@q^cq4?k~N{tFJSk3S7Ix-FGq&NAo$pj__n zyl(a+6rPRd91=^2Ms|OVW`RM6g5R-GUTI#BIpu7OXYu`aiGe1aTzw6s;pehU-~17LPeu$h;) zzZRf@01OOQX?U#Qk5Z?5OE18dmi`HpMadASN$?Eh4#EM=ctAwY)AHJ$f3T) zS>iVS!N4g9+qp^szaONmwOO3ZFLfsU!BVoe%tDJBxzJojmU+(Qgf+|)Cs%FM zCNb_6VBBy;H56hM2Sp+V){VBk@bs9kUS8xx3GHi7n9yT<+NS!Sj_Rz4oliJEt4Zh> zGTNPk$r4UJmj(=+*ykZ?Wy9r}P4Y0bG86h*Ea_mpxHx1%Ym(nKq5w z`*NZ^1HEhA^_XRXmCK5ULtW2?S%6iO?MAv{F*H2yG-w+ysO`}WfQ}MNy-@h79S4d% z<0`udH>X7R*vqM)MHA(^vSNaUtd>XOo-28PxbI!Y>upVr=)zyX=eb+?>`lHRE+w1n zA8eCW?qBjh$v5CSM1j?8H8w>4_!&qq49ou1>qxA6#;MdfB$IMO4>mf`oSwzPpYftv zms6deltG3O*P?aPW)4${i}J@;$9PBS585#X33z{IId&?N3&3TLhEmQ)cj{|U?^~tF zP5Bw9GBvNgzfeHuQ@jQaLSKfq#iMW6ylMa*>d^3Eak}BkH1R34Vm39WEqP0s!m%KA zwU;q5n9>1isN`{ufAA*kQj96T{mKL-rLK7~F=oNKfl5Yd7|_r!(1-o79?}l*7je6k z7f#`WY(@8Yfl<5iCb7HB9jQmzc|Y;1RwKJiXR|RiOAlG^!ab)KG=J3IFbt z-wm`(FhM_8aTkoYgHrHpA?q-VToaGoBrd6h=K9vloCq>7D!VAguH1ft$cm)C1No9y z{DYWYxGy?RZ_W_9jNn|}QsP|XuEA`tDn)|YRMiikZu2Wo%_a2h+O;e2$t@jlEwbk? zsU5?wchZ`wg&fvsNwe8UMWTE+?WP_}K>ae%iFSA%LExVkV(Rbhzn}&@_9?^9vVN%E zd7m8>((NSWi{sh$*#5FJK?SC}*|yMo{IbE<0MrZ)%mb&u{zDKr1eoM$if+{qs!L2` zp^#1+8)4IQJ zZwF5}Tqe{$mi~kp&+T?>)vUB}V)_R7M2Sq!^eP$84SJTtA@MYBKX3FN`uEnAcOT&6 zum!Hu8X2}&5RXR5?qA2m%v$uV)W2+zqKTBpi4&a`aUE!msT31_Os{|S07J7}n2kZk3Qn0#8zotJ^F%pS)+AkaDkutM0(nmk+5ofZDv- z=EhN`rK*9x8ZAYQGd2Q6L5<9<$scvB$)a-UvPH3Q?8AWGU}G(}>b|4h%J*Pc|3aqJ z(pOvhW!gMnR^(Nskiu%FZ|>pN>OT$BFsKW?S3;4c_{LcZcRrs!#`Zh*+L)T5>=ZR2 zOxn8zVi!$O1WubhFtHh|jC^V%rPIm@N{#`9-~eEE?Zcv@OJXmh`_}Q2 zsg#cvN#fXIc&TOh4CDa93jS*c5mVH#c;&($RnVn?oDV%_#2m0lQ0n~gz61ZI=&uZ` z7^_eZLIncUMs>q?Ou^MQ*qtt>39yiUnOW*aG;7Md76910tf^ajgKj?S>c)UuzNRrr zga&Kk325)24XFLuca&#}L%;Bn#(D3CxN0od^F_hepA{psUb@T&ou|d$wN|QD4qdMR zpa2F=F3JR+<=>Mi#vR$FT0|&4j@SL_fHKnLP`V?8Z)Zr}z%w5`rxC})7MT${GkaJf zdnAbz_2F~Ue?h@H3`_ZM&@tE1xhj{7STtpBs&3+&kRtXa8R#7i^L)SV@oEQf16S>l z+8nnBfU?Y(smyHmd`TpbVWiGW43;!M30I|Qu00U~dTpNxZk9IbItit5qpR0Bvd9Q$ ztq=KLt!zojfHW%1$7+IaO1Boc5N@M71!e&#&;Wqp;KdV%ava}!dP=@eeDgXM3ap~H z+O09dJ`cxrh&3eVraaBWpvw{g6FSw3v8oeTPsd+9xHRxq93wygkvRsZDH)!jPVo6X zgNHE}*RzGZ!Z5{>oDK} zeEkq20!DoRr<}^QzGOAH=T9OkJy4r5z_A#ys`ae;H8(7jYwfhTP54gvY7&DyAS{Gk zM(r6W5QKf5VmS}zkK!0^!_0Bp9qj%MFKCvdDUDs)V7+#g1p)= z|C@5R@~^ksHW>CKu^yhtLRRk#SitAkVfj+=W%eL`oTitUdxz+YE`JNVjyqtGcq9ma z!v@4)Dh+J_o#I2H*6oJ4;Q{TMGOsW$s?N=Pfln4{>fiKh`zpeK!il7}T`&pgQ(QX) z0Jv*c@M4x@@JxLAb+AMTFVBHBNU4|v!>+uTqx;;xe1#J!*_x4@xfJmSz7x6o=6@Cf zVY_5K1%)1hRDOuhlMkgpn-9AtnJ#lKSS5JIkbNrG781&Q=rfFLrxxGl2uldOdH3DR zjff~Usz(9cHw)?OYeu-*T?@DY0IY(A8VE!QQP!H?B)_+MQSbr=+%bn2{Z<_p1ixce)ZTDf?04d3g;83UB4kwb=;B<|ZqZX+p1rwk1Hxt2dT0eCAak{6^tGS1YB`MI*lC+-aCbe{L1bJT#RhLotv})5Af>$Qo-I~82?~i zN2EsyVx!)7he@8*OqD-HO|zz@O_Mu72OF9s;B5ys9)+wF7O&up)4d#J}UsYtReJ zIz8(o0-mGpc7HnZ`RqTw)}ql>yZ#W8} zFD3gd{MN;63WDmD<137J4*F>yUhYpSA`oNnzuav2fEP)Z%b&eA(W&XighTsnV5p$a zzyf3|UmzMbXB+Od{^YYFLlSr)PnmFM*HK7YxzrNkAU#58L{Eru-!o7O2&-z?1;SM~ zV*okfyG&4$9Jll+5LrdGe*gOK`Ec!&@zJo9u%5^VD5VB3O<0%xRn@L4vhK(F?G!H2K=#{`j<6>8JkL1PaD=F#?_U&!R2ff=$>Ef$RG@8{*H*lBAVy^l2l^a%u3?--0=4d@Eld zL2F6CPm>1dsG@-o5x4vJXW zoscNb40wlZT-97fC&uTK=mt%Q>* z{>cngN&T@TW*(LM;Y|wHR}U$n=H;DfuvMgAY8}<3%11^kum6-n9taD0*aISll%`2g z?|qeQXr!go1Z|$@n>hTWtFvx4cNBGDfOQ+%ERk@C&cX`7;*s!4vV7i4W`1FowW4s2 zkB-8Y)75H5sowtQ;bX%a{YybiL!M3U;PuymCCzuoLJ&ik8t0edBs=}rndtI< zX;>DQU>7f{**T$DaJvKC0k~D}W(>vO&O7tdxX9C6KLgc0BKIDms?54KiB<%wXUPFaYa6?>~_EArrsIXjf$$RPcacO|)r z^lwXP2)Dcf6=EbBMrmB68QNQ?EunMaT7-O>PU&BD@6Y*qNy?40S-C9xYT z`u=-2v(>`~;BtSf_7LnzGAD7_yX;eqf*g~Rz8glYe>wOJ)bW%G)^VzAlpD0lalN|E zE{*rVPxkK(v)uf4`{A>_nyC9`{;sXZD=k*an&8qnP7z&YwNepA z=@(+)4j34K_dhw)DXbzi#jug(+b3Zs7YDjj^`tEg4@V+CzLBwVsLD&LZ2ZerBW0V> z@4tS0Ahljl4q54nA+Bcb34z+;NtR0=-P^R4CLF?`N7Q5|JCuz@55V!$^hn$Q>xzBrG94i^h?N~}yl-6;ff6MRInBvK#iXJl%dcsGBOkq|wCndZOrO?) ziD?_XgtHh^HNCa(4H>lmU+`+kSaN&+@{hj0saYsA2x8{kP-0{gwB{8zV0<$&#|i*=aSGG4|4Y^ngD~gq{3@GdW}I0#dae@)z0m~Z z&x zfn)X4k&pfBw>!lF2yIEf)m4J$`lIQ$u-(rMFjI;8j)*8(AVNx3G#wLe<0b`_5{2AC z2dxk4IV?&2W!K&znD=IC+gV;9nlePWD?(}>aEZsKfplc&2ukOp`qZ{J<@xKyKL+8~ zb-;zD5N+(+w2z-K{q_cs3Y^C#ZC$x2_F+f=1%)vXmU4v$q-Q!!fdb<5;k9PRHlEMo zAC~nnFdq1JU**RG3@A`X>p`z0_)zi%XCP>sp+Y83>`i&<5HC~Qw$HzOU{!~&d)`zS zw)Y|OPDRdl-)H=L6!gSebp~Fv;+x&Ji!LIu1Al+t_g(3L&|^22eRb~&Zjg%P&Cc{o zHWFK3rmEk*qlM;;jJqk0cg?;CQU;KLlfmQ3;bRtB{K&~9HO}yEc!Y9*!7Z4fbd{Yy zLJvx&1wJ927+)XX93^p(A~?loU1f(<8ZbZm&`cO+)tXCXg^GqUMQunVvw{hIxmA)R zAp@D-{p%(+Qsgz|M|#w>k7l^pR|L>0Onv4qS8fhr0e1cPy>p+M{meu$G-+Zi-Pqa% z+hi z?!%BRB>a1Fw+n{LoxmAF!huwt2@x^AwwpY#t5)2rEn-)0aJ zCM$jQp~5=Lo40;H?_-)R`3d9Gj^yi)YiZ`_OWwWUI(_%cYaC53Q8rNcfMY*O8*BBGE6FQyU- z$C?SA>X*f|Ej7@-t9HGKF`?s!&p?6J>61d$9NG!PV%j#Tgs3znQq}}tVg6K6xgI9z zAr{Y@g{4KQy5+85JRJZp!(` zX7=4nTyIC`rmj!FL-?(w-TIo8cTX3e6eQJuKp?ElW3AoB))Mccnw~4n@}ui$1b2Lb z_#Yb+_+vZ{N9x#PcKlnZ18GYWawr)@c*J=b##ymt6&E8ad=(^WJ5!%DgYxSVsG((d zwjJNiP}s*R?pm@4m?lQ5SNoF6gZe{!c7S;>r0AM<#Z29%Nk{EMrv@9;gn>>JN8r&e z>8weCl5WkUJynqLV3`{-@nJ-7!?2pmAstyp19+YPir3*rX4$0H(f2`pjJq|)j+3`D zU!%Y<*D@twtGvgar@LdewU7^3bi1egPn_<8u#$A7AY7H<;L3fUXcEzNfTSBe*UhdD zgi-~(Ay6p( zK|HX*jxu*!^fOlGrQ!9Av0UlqNE0%yP)Gy#XW2;cEDd> z^^b*9N|5YlKmi}~MA3X#N12WQ2`|+&Y>3d!Imt1klwCE3upv38NJWn2G^xw}$=`i-PO4s*eRM@?i50b-(3J(;NE6HU?MPG+*X5p#z3I6R6R<|jw zW1X3sf`02&E&Q9>rD4Auc(CF)tSMY6H@1HR+_%Huu17e65Xhb$#;8g=upD(aiL8iZ z+pb@NXaA22g=mREM7Ib1Ybx8aNtkAL7NH#T7ay)u5%@qX zVNwYtw&N>;U-o|DZV!KDkk2^h4X|Cdvwg+1`f8&&<0l+tDih!knbtdJHi8?9+ z;evf(OhbziUdKuTqrFwLA3?{y!OIgm8HBG3m!HHDBaq2?2m-NyP$iHD1HXbKq|A2} z@lEhkk&8blY|SPKTZGf+Z$oMuJ*}0dryJwT4)@jb=6b+M{PT+lSY^FZ&MC7MI=zm? zR~%zAr9ad{aC3wxeSL)k_WxUPPcF3Pz|GcJJ!o0?rY$3$skVPz0064{cc{WZtsj=c z?(rAPCDEq_xux*Pd<>V$FZM!*dJomV5W32gcjBciT1w{?XrJs_2s%;mI<-yxwj1|z z>W%I|t)SLsC-X1VqO*k*zRqvknLn`Y9~MXy-3j8C*`2!U%Wc94YstoE_%xD0m)^d#2lT( z>##9o#0~V1NY3HL-lPe8ld5w$q*!tVXiYT+`lOoD*`se(V!pO%1=2<@FkdRK5k@GF z(`nB*12KjzgX65%OEv%H>UR;bU=Ex~^i2qbtQ8EOUo*YDSO)*rj0#fBOeW~1(_wJS zmT#H$t%OQqp(8W>KvWvAN?Hyt)cJ(`T`w^*E=~#d6@#bt#yC9R!1xtMHwl+n&=mnA zNnv{zvy#*2nGONwAZkrMzuoGnSM4J4mTEylh4rlS7IKyQ+m3FBmvHsU&pl61Etw<7 zLs9c4h(Gg@-lc|L(8X*%`skVC!~CdgC4vg zx_&HLPM!r2y6aZzYNwn$TWAvzJ5Gl=vHW82Lyh%zd3J7XTfa2;@VfgOBGH>%MTKyW ztXd}zeXXBfTwXQr3Wp4jj^_CdU+fZ}l*c*aSV@1~lhuTVd>*WVGp7Dx^yh`o70pD2-c1NWyw4GsKBc45^*c2Z;m*bOl+YaZaTZo{Oub+;r4Vf V^6B5B>8M%13>6%{KGL!F{{cRAXH)e}f>YV$3xDThRwrXl;cDg_P?dqA9g+6Kx1OGWGyT9`I`yJNb4+sDRHUT&!Bs456 zJR%}8Dk?fACN?fEJ|Q77F)0}t1r-$y9UTJ`6AK%gSI*Av?%sZWfgvH`QBko82`L#F zIRynJCFRxC^-WD}U0uBc1H)rulQT053qOAT+}hhaJU#t$eSQD*1pS+rh#E*;o{v*R z#2cpkrAVCQ0Dvz|kFY5N0MakzIJC7-dpYrcNzfM$+yDSm_V*%c0N@V;0C<9)FfFBQ zGr>ki*D!2cRw9g6I7%ykRyk^x|Hm-T@7+R;9}$><^dAyYc;r-M5&nVjFxdk_DD(iW zN0M3?D~lYN9hy#xl`c%o8H^npZ4y6NJj09+Af0OsHsh=~fPIMSV&Ohw`m-TyqjT*0 z06$_-PX zh#xFcp~p6iHZ&r5_$9#}P_PH%#1RD(^igNn{M~=@%y4C;1Vf*n#RyYpIEhK}ify6K zP^b_i2FZ-t>p43-_3u*9f6|Y91!{P}9u>w40Xx#0g&18C*5KPNjdy9WmRlK3(j*qe zN&u0KI5lF6jL3)PzTsVD=~h8GUtc>TZtSt96LxWP7J9@EvEP@&Ur&7Fb{LB~REbO< zlGML^&miihef8)0=t7C)c7zwopDFP;9poStN(v2edptQXuH5K_h6_DFcP&Z5S*Fkf z%9Y2j7u^nXNiU%8FqC+|Wc)M$))`b<%O?%Tw*E<7Mv|qhP~8L`IcKW^7Cma%YLJhn z+Lvu+tBW9NkjJLUk#>%aJgf<$gj$wIvOGJ9=aoeMRCx+E3odm-p>pgO*j7EO=G=J} zI%BJX*Z|?&b@&Bed1ZPr)sfwBwaf5kJuF%?c4eiqQ7pD4C1UVN4w2^PNu{H9gTRye zRJpJEL07K1A&!=yn>%@={NUa?Uxr})0_B#~V=H_B7*2<=-oJwbS?nc>4iK-(HMe7E zFKXrC{E}LI0aXCF>*j_JF=4R!Ehlh|Gl1NxfA_nY4R&%gowI(34)f#6eMq--Aaa=G zCp9E+mlO|{MHx<~Tn9K%@A53HUdF;fv0zuU|2z#1!HXr%(2-e6Yt? zG2b|mY|E7y?#7VKWXZS9F}e9zu%T1!shR#Nc%7@}0}ubl#97#QEI3;3qJ3ma;edeG z@&gvOJ5nzox3C$v3}f`V`ynCTnv$&Q09q!iIflOs6Tna(8C!y;m_i)-QNGyf9YR2FDCTi>mBULqA`81nQ$249jQ zm8~f=BsQEqi5Bxc7Au4E%eDr`nB1ZzGe-j0P90UT8KI@Q^sdPgXF~i_rZdJd!%uPH z3XeSI71tM#OxT=PkuG|#`UF02O-gj(R&~e%vueOP+Q@QdH|n!=7%VKpFq$rNo(ift zUIMch<_Aqz>aJhaN}1+^A=^ZnKYq8C&I&{%>(@G%Em*04b&B$CPM5;udqj>q$kb8C z-QZDz<@L1pEz8TdaZw!Q!F$*9_{w#t$xnn^Q1{@S{Mn5?{bZD4!h+6{=}wwSf${Y> zap_U0pF&c5^&Rt3L$VHrMmaoC5@|QB)jU~;ujiJt)#jW(-31hOX6T8GQ-_yiO>>P{dD%tGsp9eLraL(2LKKgjs@1} zDJ(z!r|0a@msQuN&&~G$_SJ8by`guHGhud^wVtyMB*^laJhr7uRq_{X%{Zp_+`JzR zmH8D}@}yUO24sG~%N)0bR&{_E)MsvI0&YUIZYnh*FCb`45R-=5P_CUJQ379Hgh*Q= zyx8H(e|kBDFtkMkkAt!X7$W@LoyOyzqHn(RJs=C6hnpmK^4?BL;g_D@Ym&sDQ`yGXDYLPPI7mP&hTo*aUMk>bEp(iy2IT;PhnMSMd`XRTqFysxr1_e;dE?5Q`=hG5>%o3Ca*BowGXcrDf7KXv%fCe{IA)R>|! zAN1wZ_mbiJSkVQ1-+m6mdE(N**1Z4dUCp(My6_2>Ee{1x+RXwq;fwAVKDVzoYWOy38%l*U1YhY9~p zKJ$s>KR~Dp+xC@ZwS%_wwWl`))Tkw6G>S(XM{rh$dZK%ye0t7Qx9e{yZQ z#ATv=bLNJ6^Ha|p<*V^qx;w_{W{-ulDu{Cg0H>ve%#7WstY#t*b47fCG*6oH%|zlh z>;;4YpjtCnkLK%wRFXI$(ZrrPJ_jpB!hXq7EjaphU&ulFqeAh4*o0z_k>#py)u?Qe zgf6waOrc36{j*P+Im?f6PxbxPA(f#gxwHtr+7jh{!;I9}=;IYu=$>^kw ziz03`ysyW*+=$y{h>;2S07Q(|#5FG-=fh!g%gm(WA%-g<*A-zYOhyUrG77Kl=h|$C z7Z5RkNMwJNp`%4ZfFoLMikQe5+u@JH1eQOV><4ayaJ|7gX^W2bizk6E zAbJ25$a5Mk(->6G=jgn}?=;n)gbQa}H*Y3lVCM-Tm6qmhgV|C=>i) z{Swt2a-0Id(gXMi^48o*DUv9uSJ?eT8Bah2j|&i4N3o`j);&(16Vyu3Yy<12n!GBa z=^St|G&b8~`?IH6r9F1PC}zT=Uhnje{}QvyLY`RnI@E#`hlCnNvExm9SbE4i{1*^6 zfXZLsFj`g(QqMhma}&#KJkrXyFsDI@FaP>|%#z_$W3|Mu9#5CiW{P%;QN%vLrH?7ZmGt@&A8Hj5&pr(yM+`4=}P7mvfqls-5QzZ z$8QoglE1yRJ#VupIvkLOLr?Lp$N)E%QaB+vD{&*l#`7C#Hzix=EX*lsjV#6kFCein z)UZwaNqSX~W)b_=b*v-WJ8sw*FeMOs^(RUsYO8&b_jx@zP_k+)#n|n9#-x6P}Z$SqEBH#Cxo!b#UP|a$PO)C4%bT+L%tfM6V(K21|jV#>g ziwfCX(@YAGm5@x}z=3}5kh(yeDst^V@duK_7%lm69%osq4!DtWY&3pI#I;!&J~CcC z%$Wc5=X57;gCb6N^*Uv<^JF!Ah`T2zJ`^5cD>8FOhI!hwlPp3yfF4iq--2I2+5j5x z;B-)T3!_VU+IbZ><7*cOb<;dOntE2w1+1)KX#t?$dPzg&2z4#ZiF*D1$cvc0H${0T zRX8Vs@y6QV3VV#NY*vf6{AePZ;Z3&Kgs@>{38j|whT$2>#9Q_Kw6lF@Qx0gy1UNH& z9x5yOoYVj7&D|Yi_5cC`>}xH!^_B`-qj2TSjH#bU*wpAjaf*e<_3B@Wg%JpJq0yMo zt}q-1)M1w)G7CdLOGH@8@C`{%-Mo+KOgp$6!t1QBba(nGh0cC;=`0AHy?~6uRGXsA zC;87{(i&@nV+yLyuBeKKpP|=M%STyIp;2fTYb&4yf)ld>1g^*uL~v<+Jt|qSQ9>#* zR9lx5; zRIZWoA`lw5I1x;Ss=s5oq!cLEgm*5x3&)+H#$N# zJNHJ#xym3WY|I?(H~Gq3rBoh)-~>z#ss~Bp;%76Wsns&#dv(_}@YV}RAHam+FrRF^ z4exHO6Zsn3*|SoVozw)z;D0D+8v0N^k;|;6v!@-Au)1!D!Jx-U)$}V|kzHKqR zs>1V;be9>Z`@v%+@$Dk?(BkN3{5g~aoFB!VKm+sD!~&UNkA{3jAmdk%6{A9=KHaW$ z!R^CdnYZzBLD2U*_`0yuQS3tQx?%k)+_*F?z3Y8-+^%sGQooAs%cN5;@=_sulXoMK zr|Nx+vaDyQ&;(II!~D#-VrWUNN9sj?Ijc7{yj_v!m9Uo~s!-hvNE8+WCCVIK{9v%O zu~s{#+R??s?1xWufRcCHr?^`(yRXWE4k52MD0^xnG7`Swj3>0lns8FZ_MxYd{fOiY zU|ot@lm4hlC-r0KZK)7R1MAt$uhRgX8}>Z&uEMWWB?0Dv&yjr%PyLSp4iFszRx@;N z^b`bs9DZ))h#%dQWin+C>3WEhI=OkOrrWu160Z~Ssdh>(G~OJJ`#OJ$*m0@S>%NR5 z{M~n6e6|PqUVbmXO#uFe44H03fAhIO&JA2m5?qv zN%4Cpv3%N}1$HxZ?m-XA@%?0Pe_I;?&(YAc z(F!VGg4w}BT8cUMoX)M6a~M6%V@N-6n0lMU)^B$|OeT*^NEEwsuQhAW~qUk1hW4Dg`vtdS;u6%!8|qB zRmaqb(p>CQ4^teu*gfs1@j9tfEw)vBD#b?D?t867g>&HweZrkK{&dnGOEaAdQ6;Rb zrg!19nZqzMRKYm&^{3iKYx3}Qap_60KLN2<`=wwwo``%$L1GKc;5k`W zpn^UqLfv{%rNE)uv9tvE+@wSU*I`CXaQE4Sk-}cGiA#hGcraDiwkwjkPWx0*Q(_03y3}plOw~pj-ei=uesJY zvMrex;qJ=6mVHH$kbJlHb*4sc(0P22)aPlJ#XM;LQ+^Qi`85=LRbD{Lh;9{u+E&b? zhcRf^!A=F*nu>UTV4?knaEwhYxtro}oyEFru$qsQGq6?S744%K$#E`e&0=Bv)(C1e{5a`0@F|-h! zCJqS0cMLbi*w%244EiF@#nEvi52$?2p7Pp&M>UwsRkAE*0$aX z6cf=Fe6O+4zV8(Bn@#`byktxSs>U^&ONbuKQGH$BRwWa;y&e!Uf?4{gk&Wx*=s4Bp zVMuZkbh6qv&(XJear6A>b|d5gG5LU|q^=83WNS5u^JQT`X!Uy(B}|;a&-c_*uj%Ua z-rpHIlToB2b@%nN`Gu50WJowOtF0r>GnGoJN3wi5Ra0G0GC!|}b5DQE(Ra8lFuK&# z47@qsC4FbA?2y~*#sq~PN<_Ir%V_k0y34h;2za%d(@<(xR;K6tQX_YTJv2Zu_c3(6~ z?dP$>KLnYRy%l;RwnJgepZlQ?^4|t6VYkMxaYG1Xu3tci0GeK}9a0YJU_?HL&rQa? zIp)I=b=t?FX+$9L(%0%BnPQ0ujf{bV%9sh6&J$vN$y!gr3D=Zr2R;3TMHW)HwEDK_ zL=ZU5Zg=Jc5)#RJubHjIX ztED6lX6^-pNrm;e{&uOaeT-Az4(bvrw_SB^pDO4@UChwDk`u~$b|t3dk!ZTZ==?74 zXu06I%|q^Z7L$3v`TdL=yBj~X2dY{6#DgY$+6+PqCI`(_uO&J$y><;e709>DYOYi=>tWw%o6Pk$+ zQH(?s<@`DXwWfo$*4jC>=k~!jZbAKEEr{t7q+t^ZZhM3-La$fDA+b$l%d}enDYG?h zVYKIdq+%ZqZ(zOLL3>3KvvVlyktE4*^E)eHycZBo81j9CgF}8Jj4Cz9n_GNgL7Wj* z{?JOgcAmAh;?+J2v7B3gv_pk9ZhZNEx%PDPY7D+U>&a07(L*$KB(UG2 z%AAIrY;d8VeGNoMQ|z5gSXldE9zmW3@oS%5oR+n2b1%3i4A>on30hhVa*yuGtS zk2~$9{WCVd>AtwZze@wSUdZ@wCDnLez0DY{e#7e1S#GG(G@M;mf#SABa++&KSK>)S zY!@z&ptS1NMP}P}vy<#gxpq12A281GN%v#_3y2m#87pxZty3FR;dc|hj^(x(GJtGO z_y+YI+W|lV{3Jm5BOcEl@Nb=QBPPb+JH^1LK<#2eWy?n~R9%v~%*aB@v6lh=aa_sh zeMH>U0AGeK{y1q^1qZVEoIofAi~0?(Le1g82b<>*e$rw94g{lxVDMgOmab|r`C3M` zFPf_Oen!L5+(;9WG&Q~+!wAnNh_khNv9@U|h)%f};>p+-Y2DyIh3eLB0V=S7rtSo&LShE#1;iDG3Uc~8z*B`$Dywt7iv81=MT|Yi8LFg0 z;E(eGKA(O-HBCl{6s^UpMU663x6Q6qEg_L0NMGD&>_K?dOWk8x)atoyeo^6M4V?Hs zNM1A~v9|wuaR7kjg>|A;(TK&#)}~jlveT{{MKFm}rV<%zX9yDII;9EZG;DqqoQF2q zGAcPXP08|g*y7PUq4Z$Z|5WUGQhxdD=+PH?d^-Z!JP-@5(ey!&XbuvqWg zuzRzjDml(OL_bTe-|TQ+(Hu!67>xS)eRP;Ftud^DKx*e20X#lj9sP1c?CiZ%9HTB4 zH1gOC4btyhtFoAyv9(*+qhy`_Z@DneENQ2(=Zf1;e*EMUg<2&RJU&x-eCCg>1kqd-wir1 zSrAOr{FIf+K1;GvzV#_x3;F26r1An%1W@Ij{>~|=gA~&0*l#HuyR(f!Hh@iWm<#Q~extp!$h|5yRWx(3Z;64WoD`QW4?rDlH!; zk6Qy21<-6x$qz_9Nl|9jMXrk(oOz8@%ikf3qiF3X1;imC6@L;Rr=!;rqD%}Ae-jt( zv*Mz5^x0j7f}der7vCVYmNPH){R>DJKs76}UicCQ>&(m1K{*3M9Sj%k>Ut+nujS{@ zr#6eo%2M1$LSDUatFKlW=v3i8dE#RjxSMOUj+Rdl7!@!f0ZpJ*_ zrPwr4mLgN%>jtV+Uo}&wD%r@3HZGezPm~J$%*0G5cTkk5Fg`K5xW-ZQfsb*xcfyg<6IeOy~@6p8b? zVn6A`X1!JQ(dTxGucfB+XCeFf`&sNsE?9TwjZNO4W)rjKbJr z=~!&O(X3XvfEdNo*|qy5>THSd%@xfRf8~MtYgNB)tbdwf4FtQ_zw3b9JcRUk+*Fd@ zc4VSNQ_Oroe$3i{sffoLn=e5iKQbx_Nf6$qcJgFNekc~R+p|_%kO&pCN?yO7t~?S1 zuL_>nyJ5=-;rN7h(vvRq6_~QUfE2<|DL^ijWm+Kle0HnrSWl#eAjNtW0~5Nd`u;_j zU_zWbjzzFOJz|tJ;@cqs6lAjLg81Q89G20p*`(=AkoKb}8#n*l%EPG{xLKSr=C-7GDO&Nd+|;~v+w7?1oA_jP$>S}g!!7EJ(ACXB5N z1-Hafot5m{UW4bQ^lga~EnGh&*-K~skufyQOFZl3uI_X~`S*ucB4;uk0pv1(m zkzAvDP|ET`s@G}4k;=5H^O6N-|LyYDwNjAg`mqtw>HK+jC|DoZg@+*&(V1c?NeoXU zI?|Dzv2Mg$=hR2*SpH}DU;&`2gZ@s|tAqFo*{yDo5ARSS3%#b2ZOc(cOr79bH$TROqT_30xLp# zer4y4N*Zomnia7eQj1x;xP~OD8Zx^rf(gwLf4UqQkm2VR`PA;9(}kYbyGVVny7rSi zH_5vGQTTb?B4YqP-Z4VeHzI;t7!&CNu!o^X6dTN{qkzjV9j2yipT9)N6+o$$wPk8lhEb-jv$`VG@_mb!2eGv5aB*IGx;=Sr){gKI zXs(B_SY3BSz6K_PoQHNzHaeFP|Y9t?4!~;K2;LS-0-m)N41&kyuyh>MC2>w(l z9Oes;gRSt@V~I5Sd99CE>TJy-s%QiVj1?_#2_JT962dD??=Ln~5P=eU&lhIdx>UX0EiPUA`I3WWlis z;Wx>>6DiJb3qku8iz9t<`(jy6nqo(5MGGSCkGeNCbJz;X+e)|qU6VjO(8JxNvj=={eNs?z}$ z>i>4n?AyIew`O_G^mpS0c{qNFJ{mj29+GHV90C{_sd*lXIHd{e(@PmPq93f?M6$Nx;Nd#>-VwA;u?M!65HH@VObMEu3)O?RfS;hXXqGb(Ql?OwVgMK%z=nqE}p zHbV`eL)80_wGo57rdw~_zqjJybF*uNF3Lyjxlz*kwd?EpIk6x5JYL?~h#^GGQ^URJ zuCIUL3$!%g1yme{8US)TNY?~`it9SBW4F3h?}eAnM{8>tlL0t9fZ9qv%zO+jS%TV& zSJYj4T8UA-@aC=rt+TyJ{(Yw z5!1-AE+YNO6|2IkHkZybqt;fpbnC+MUkfpKh?Y*p-!Jqv-D}3dZQ}UPo3rOdV1+Bw zc288Ovl#2|VgMcipbnGsAdB4{;KAgiMhZ@0vnb;+fGk*R`Hm`E*k#|}99o@|^zeuK zdH&PObpR;l2)2KhQ()wBT!pVPt+p2BJQ7T=FQ)n%+#L|k7IN*!A=n<5Pf*Jx(#^i} z7V2trS=q>ioMITC+2UV93_84a_tf@rWYJ`dYqVW!zfx^Rl^v}@@q4|Vq$!@VIlmEA z2M1zDLK_mYD#5QdpNg(Sh1PDo2%d+`+e9mU0-ciqSa<*%0GwpQSutyvD&u>IeGfof zwGcgBqgfYL4(55gew=+ZL2RjlvbLKx(qlN|P~&8Zp?vdF-Z zFA*9AP_4?XN6UVPOHNaX+>}wo3QSxFg)t&U(wFbWrKZ&R}OF}lj%Sa~zqX_Sw9CHbG9A01WX5O95 zR@(K~IXrC^-8_}mcmH7pHycydBm;N^e;t4g!?SyWvbYKs39vAzL849)sWM(S^*O{z zF8-&AtP>vL8{-9LxM%uAwdxRFO!B3sKTwybj*Me}?zc`thYOcB)*ffRhbEo3n>sI` z`3MwCX7TCJNs3pR%w5k`K3qYLF4ECXB~a$gTdI1)QC2Kl9G(9^H2rn7Zyu^ zVIiv&FzQd0MajLC)!n4h#1RNv#yvBwf%TJUjTcCIFrGMTaZMk|m^F{r$|hCKhc{&7 zt+__ey73tLQ8>E1_WfCCe)<-A(bT_D)SwFvCP)R4;IOf+6g1O1Zh|G*5ZGgMj?shB zJ!B#B1t1yfSNN%%Uy0u$@qrYI>!w{FwADZ9V)(iK3^KqVQ;r?pCR~f_eBB)X&t&~} z*f)Dw(@AojLF+1)fSCM4#iao2X5~(9;tVSEUy%dSyDEZyk56v(PqtO5Fs7!kgNIk( z6d|^9SK7B_kSR*x^M~9f=E7Qki0dop5l8vcD%P*i{)b*r504GZ!dIN@Dp+ZFfQ;U( ze3n3zaSa|Zc(#a&?gbMn)^+wB| z!_fD0#O9)M2GxfM0)Ez9(LJFMeS(`0Nt_?iKyDV0v=q&JEthXxO4`K!F2|OiUm~<0 zrj8J5I4PkB3T9^Oipn^=OeHBu_8Yyf+O#rgdEqwJ7@`!^kH+ft8jx z7R_A-^lGKx?0weA&z!>Zv)}EfvKUB|I2>e)?4CqrQnQ>HLlyEv?>g@6b0?mQx6P8b z$CV2b*!v~E$yiAE2AfW-I>}zM_lq}KwnsfaHXAPVCP2@?USQ#aCt)ou%ELAhT0A@x z6B_Zhx&bAj3|wN^BB$^5uNd?dwz8Kezp^<7O5ph^Y3~Kq2*ZjOhL{C^_iVIge%b%G z8HT%`V)CO z)-`;t(n>bVg>OtILQoBfPN+xbfSfe;xD}ZM3<^a7HEtqhVpiPK&K+}G4FlCIe<08;4^B(n8#-@-vB|fAGi&gYZZk44)hBvHWA7tR6d_VP057&C ziBt*gaos7-`7ZKvd0?wRICY=XJPu7QZlE`=>6^D1ddSF8?|Cudx;*)1&AUH1*EJdG z?2bv$>J+uM4NIjZ^+{1>dM*xsO{rqHY7^f#!0XVvrfTuURDKPwd@s}ylZ3H+U1@1> z{@5Jc>hZK$snG_#+4ZuLRzODPo3<;TO4Y>X(8SKfezI49e=lUE(e?2pVh82b3#b^F z%+dY}`aPJ!UArAss3anSk0H8avs6Ni*I(TXt zo8@H(v;+JdLUmmWy?I;2TL!>dsR*F&%=#dy_QM71sSj3%Z7|6Y{>;kqT$x&Y%{84m z^5xImj&(#m=so)Dp3cd}!;pCTtDSHCtlZ6U8Zt#39xQLBIqVY(obx;OrCS-`dq=yM zRf-hpgynws>q&Eefya@qVc&Pr`o)PIap4$fkFjrxLyjeK&`_HO$2)SHrHk+a$_YcA zjk5o{nxbsMUFUjTFkU>IPRv$L7JB5dc)ed)`Nxcd+T2$S9(7>E82?J2m)`lu$E6vS8fqLPxOg-*cU@s7{Lyxs z;9oS@X2@m5Lp>$LDhGjt3V4!LPzGD!NSpmc92c-a54oC@0EBFL_jt3LYYh<`yj$rC zi3gXb>&@VNtYAG9Z|Q30tcD~KG=mqom*p48>4q@>Y$eA{dDjNbB57UV{L^a}hoN0B zTRT);g8X?-J+I;%J%_|g95G*AmLd;T{MZTQ@P8{~OdiN6(W_53_GO^6Xfds__V$TF z65J17dkkHJ*4n;i@PyX_v1lpc;!!kyCecA6_;52MA=WfUB5)$;y=G8!%+IR5aAn&b!PdsQm=(DamVBM_R32N{=l&clpR5iw%iCJ2<243}wAycW~kj){U^C-0?p8^_Fscds{ zjn(RYI@?aeRGB$}Yr7MHSmpyd$kVF#YN$loS$c!XBWK5r%0xSyT8W=A9?Z3P8m&z3 zN@lT)(bv>RT&?5on!rxEQb?$ib_p8JP=$x6aTr`$VVm(heUw9Z< zc1~kPTitk_v9+ zlpNDx`s;v&?E_1eS14%qvcdL-#mT%XQOrK&ZWWrbJoYoD*LHRRT$T;boBQPk(y)uZ zQATpC?kn+Sv>1}+v6qj0ZYn~juo0D<80q9zq)kMagVj_Yc9=4ux|6-_mO4vWK?7$b zCr1{3PKklDxzf^rgGRQ6H=h01Zv_=D(F%@cU7xYgn2iMmq_jmlR?{$3QbMP|1lOV2&?5vo|vYD55Zzu_>n=kA|PeBpE`nZrz`m+de<69-F@auf$t(rRSedK4^T1l$yF8CywiROZVvjjCEeZb+dUQ6&Wd zwwU$@IIKDYJ{CvR=c+`DNGTcZ|Lmye6wv>FOD~|#zdK`ASSqs{V306&#*!0e{#&>F zw-xEXmHWSb^a7d;Q?>@77f0%k(}huPVJE!#*V+Hd!T(2~lK=cqf&Yr*U)TN*=wDUw dZ#{Tva{m*de`}Tgn{W2-i_pKhVE^6Q{VxDRsPX^+ literal 0 HcmV?d00001 diff --git "a/sounds/quests/\320\237\321\200\320\260\320\262\320\270\320\273\321\214\320\275\320\276/2_right_quests.mp3" "b/sounds/quests/\320\237\321\200\320\260\320\262\320\270\320\273\321\214\320\275\320\276/2_right_quests.mp3" new file mode 100644 index 0000000000000000000000000000000000000000..77e37350e4f91b01585b0809bc76a58bbd1078b9 GIT binary patch literal 17598 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 literal 0 HcmV?d00001 diff --git "a/sounds/quests/\320\237\321\200\320\260\320\262\320\270\320\273\321\214\320\275\320\276/3_right_quests.mp3" "b/sounds/quests/\320\237\321\200\320\260\320\262\320\270\320\273\321\214\320\275\320\276/3_right_quests.mp3" new file mode 100644 index 0000000000000000000000000000000000000000..bfd33b70f46ab2399c41bfefbf21d3c5cf0e026f GIT binary patch literal 22932 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%0Dh0*Z>@pLM2!j7&;>w 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 z z%uL)e|KXIO54EdH58L=7?L|n>zlhJcZKs;t9BpgeOUh9#X^YQ-loy7QKW%Ln3-xVp zKX07>tXJKkIAv0uknv2mqu77UuW|CRZGvD+k1fQ4v22J-Cvfv308jA6wxj~O2ASHy zZhURSIQZOvUnpWEVYX}rD}rV0dFdN`&#W{t*Yk!ibD#wuAgdq-)^N}a1N0VbbWlC8 zTfY=gbovt;$R&&Ir<=X{|A3t|3Dyip*xRUJYEv`Fd_)gsy5|n4NR9FN#*-J(ë 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"qZ|ykEYtw`Q4ir`2Ef;-QV(e{lyWj){!lF5t z5-=r7k}ubc|5n!3mv-`2`pLNvWTp4Z+Od?LFXZd|f5 z^wq;?DkaMY3y>_HZb;LgilV@OsSkIvzVZ~l*LJ9Fab5D0Z>6Li^zl!oQkNyGEG_ARg)uWOg1t@wRSot z7Gy$HRUF`oC+~N>XnvwTythCNqOse?R&U!~eO)fhoZWB?ebY?=fC|e*0397X5<`?g z{gu1q4OuVc$bOFR*>}%0qr&heL+C->Casp(+&bI8GQ-T*G-PGbnjLkb1+9Y%B8eDB zZ4g1g4u^&M6t)-o=)1bApiR+c3t3OFVcN8Vv5STo)D*v8uz0-mOCnQ>IlLmOnR5Ah zFq>hXqD(2F35|c+JAY3-TfP{SN4)#lY0z~_?@{3BrBE_w$Tn3jb{BdSJdl^%`Xm}N zEZ&o2V{SkD=X?6q>3&3(aL2pxtJ|v)GCt!aAY=WczW7~8DOTz4fi^tYpx#Bhf5$)7 z#nOlw!)|#$a*f~5=ig6sI(YO(Ff+YzElcn%tL5T1ID}HNSmA6Vw<%jxr;f!Ozaf@c z6V9I~s($QxG-nI;`1L2{#jZ19E+&;DdzQt6j6|H^Hb?3Q47gzsY(!} z(7_wgGlhvHxT3s9Gp}>Uqj4;#X8CkpNM56&5SYV&%580Bqqz}|eE&FnYlXUx<4!xR z8-6p>7*Oirby4O9)A5!efCTV$r)(Mi4OJN6u3`0`Gx?QEHu z_`b^O;_y2!&yum4G3;Z4S5Lwddz_cId+f%EsU^#P_Y~Ydd09$cI1Avr(Q!p?>a%ZHL}|9?}f6OAB#DU0bb9MI|0_1>ESMkHy(( ze@Y6EG2c8C-t7;@rzHU@Yg!nXS1}#syhVln4TbZc5~?n6-FpMQ0D?b8dM?b1A#R#9 z6Xu)xdU;dUH z#V~Ch96If$FkhDU9m6cvLozZgvz%}=*W%4fB7#hELf5vw+XlmCk5%%@>hy0$b4NruU(vFBk4y!^OGIjk^1>7=2v!(i7VnmCc(o2@S6Zr}lq|dGGG)DVTstZ-v!` z;csMvF_9)4sSiIkJO@k)?Nx)HA}^nII*J~Fxlw0-ois0f^{xt75ST}^O!~hCh5rmV z{%R9P1^`J5h6V?>|3ZqJ87l=!N#+3E9_N z;(Uae0Gq?2FO>|%K52b(5rQccV!PiR0Hiomb$tyt;tfOqe?#fVmpkn8g=hZQJjt^@ zZ|seiVN_3pXLLkJoo4Qft?DNdeOJx;E|L4kR_02(@3xF6vwWLAc_zCVt+u@!Og=s_ zyzi*{ZwKz>DSav5vzw8^3N@Jr+Zshp!0NlPiAzX~B{; zRDQ@>N4-@q+pm6JBxcb{;wQdiewuo6M2-sW)^Cs(t&2|P&sn|5mY?{T_rtbsf~*_^ zJ3O*>P%V}EOJ3KB4NvA@;hFmuG()g%7y z*Pwn>UfOjQhTZW}AsL_nVl@+4iyIT2Ls<9`trBU)*}>MXJIF40Td@hU-T;TlTyb3( zA)cc*?I9$9G8xb<#LGBfJi0-UJOtoWKMuON<5T0?fe@8I3_M25>U! zcMvcueuhkvQLr$s$?8fLFz5L}ZfKbr;a*M!lsKo@1?d{KsH)KLJbR-YB^L!BpS|2) zNQ3rK7UE^DZe)dz36Max8L0siIj>(mTX#`knzN+C3VXvbNRjpNiWf>Wf`wq%=e;Y} zs)xOG%I=z=tyK-Kw{S2Q+;+rLGH~*!X86gG@Ad`eI`tRJy5gp;%OXhjcfOu|KXQCKV*fr%cO5 z-$hH!MV^}bbCvn4;$G-ZD}~tmT|{G|oZ;()lgl)!X)hAR2FQG2Dv?0}n#OP>b)Ng3 znU`)?#;}<4Xa$%q41}Mh@B!rAs_D>HfD41tCX|)Og4KXi(&TPZX-qfMo{rIhKsGw$ z7FOTr&2g|JDdeeYt9m?C*hPBd<4}wPHo4eFa%{Lw*p;IQiwhhzw%@6w8e|K-^a`5O zeqa~srBsuk;|>< zTs5QkQGA$^GRqniE{|_|^Jy!NV}bQ=xE-$-d5FZC!QMGPJDf!^{Syke^}hBfyk|cc zoB9U|RfZ;~w&ec z1IEy}Fa%=(YqAn=stoX4a=nM*XTFk6gpgLeWQmFa=4k{h8iiN@a*xU|6tpl=qn;YB zQfr2ZZK(_%i8Wfm!d{)SPB`M1TGo7LDJpw&Z*J^CjC}D_6ItJT;7i5tfdlLXE9-sB za|m=m?t?X+d1qeL>kc9IY=|2V0N9sK_yeo6uf^dFt!9=*kR=m5M+L97?c@iFQ#6`a|~<#FF*l+0Gf+>wX21nph+sAIJzKj z_&2_Hm7H_S3?pr!_~?veAK-qGa zbYj{A$Dq9E3n(I203)F@aKv#c&WnB55Fgznlal1Zp#nV6s7TQdrxQz%@539#$`rct(KLF|}!*GRq z1TPVb+U&^C;E{lvJpAf6RS@7`Do=3lV?L=Lh;_qdnjv~Ycaqj6UXaVy=BW*HC=QZp zk5aC$Cnr-RwxB<$0aAUVE$)2GWE`*$H^vvQWeu&yIfrk$b<)jcLz@N#7*v((?JwPd zuA4a(`r5PbvO#@g=PW`t*7e=9lUC<4NYHA2arLvP@}cO=Sx0BI>KDjiSKE^pJWsj~ zQg&EBbGS4&hhr)0w9kog(7$C7JknBY(U^F@`g5zQ;N^)rny}-A3>iT*0puUGUVi%* z8D%{9RIE*_jMWQHmfe;GHRt)MYy!@ThTl$|5#w!xZ-?qzI59JpSNZI5-KzFkR!L+U z<4IN)el>GX&QFsrJ`+kR7jh2bjsJwgB=8MV__klV&H5V(o(%?Wr{1sm2MWoT!m$&m z78qj`o&O%O4-d7D1k7f6&ruZ@u+8*xLn?hn+n6+@Nwrv0rlN>anXc%OGIov;roqw( zZ(GzQyw}i>*EOR+NGt2o3=M6zxPJQbb!g}B?${0?v#oz;N1vae%1q80$!s&L9Bu{l z;6@U>cB?=thi~h-ot>jsGVZF-v>AyACvkw3vw+W0xFa&qxs3Ce`f33rAI5R@6J(^Ecd?7KqmN z9q)Q5jVxI&@zH0}Rxyk`QoJymr(`1fHZwSQl%TIEnAYy9i}ETLT6ImV_;e$AYaAn->_%HQMp#5#nxT4T)pHxSHy|?k z0)}vlBs2jVO~p2o1_THgssT|$5fRa$*lVcLbij^fo>0Wz zM#pjH(U~{%tY_w&_gm|H=bZI@zX)0PTKSW;v#)*ay|3@glwaXx>5dzFUE0DXXS03% zL!Uf~s~S5jd{>HbKfJ@!qM@#}`F0WG@tt;@bRaNhw1W>!x*yD^$B7PZw%@~p2{Bna zx>Ml02hzLf#4$!gBt+lQXz@fEHf}Ud@&odZZ#83TZ>PC@OA)r&jEUUP^Vol`f(!_5 zox4j!(++YOREakXxj2MavLJXnX8Lk`G=5S^{HeMR@VD1xSLZ?RcF;W&`lPt4+LK5e zvDyxJ6chkzo23C$VR?(wDcVd#qYB50*_L9}dH(302%HNtCs>nsli(uZ{_lhrKArgbUW|4(JbmytB$RUN{$Y|L%b*06Ge<@z{&9WQ7%< z-FR*UZDa(jY#+Ow2=N|f)T9r7cD+c*6M3Qq*~5)8~{*r~5a{QGBzpdx{2Gc6dQ^W)?Ei93O6NJRqZz6i2RQeP~1 zRtqvD65fsPOXx%~EE%1QhiCpi z8J#}-6I(E)(a|v@`I2Fngo@#1yhR!d8twbx$^su#41B_aF<}o20Rx;!2Iq}LbOXn} zPueDy*68C>31=*X%7S~|_z!XWzLI9gWTO0ciew1k=SKrlT{;Fa9I=w}9J4BSyZ<*a zk)(50{M#Pxx*F%QL*AHJXw2{lHhB)THLd-_fv~`y-&=o8@Y#PD)l(Y?@Z8RsE&6(k z1?QTBCXH`rjpF!fz5J&zwlU-w(l^3Hyg!x4)B1gC^-0p15NjomKd96Nr(G~HJZlnr%ci@&~ zZ2u4SB=Yy)S!WRY@Y>RDExn`-!mj8W!~GVAH2m?{y$Qg(oh*) zLIn#~m*?KDpRAlNmN;lEU?jOWSz`fIw&_sMQF3lDg>p1gQRDCy34lx9{=)^7E~Y;| zjnz;cjoc<`h^w-8vjC|5(_NRA?PU3XtPh)Qy z$!0j9rQdL9p;N@oue{a=`wb>DuOWVZLELRnB?k5MnkeY)NUe6yrR70J`ZI$B`BsC8lhT%EOvu1Wn0Y zfN}~m*6PmJW}q5g4)(qNt)7}O+j-^LJ-QRq&-P0ABugV)OARw!d*?OEh~-%sX?wJE zNx8QU2`(MoHjxSzdsonM5A(7;A;{DfuZ6AUgxK>=2-&YGVNx%MFd>XHB{3JjB@=wea&@G^k zOk~U&6i72Tjc{P$)T$5-$yh9AF9w?)ntW>-gU?9Iq4bx8Z96L~u@=pnprc%&He z?HDFWMv}zb`3)e3g5SP7%xWm13HyYdYOc_sCZEYSb~o!QeU8os2iaXb`c_1IR;a|V zdLEP_f||xIEm6@(?AV&I`8fp2#^STnCiZG(27&@oC&TnqL5&C?ap}`V1w>t8a&mRW z(K#oCl`|H`Rb-zk;`6E``fa?q=DGrEWx-1 z6ptI^ky^(7z!aL$_Q17E)d7%G6tnZo4LWiCCa~th(-Xcf^*?%Zm z#!n1p9^QsuUEyFgAm%Kr$}^13(aOHM)z@D_lYy+;E(hu31BF!P;4}67y1wdU;%tB@ z_<0Jd+J3{{1{SacR?&3dIW-l-Rhqs2&Ke+_-%`^-XA5iYE!!xwd>nB!PA3ICN#=zsP; zVE6(-Zn&H1w5#s6rgq3Kradq~d@F*yLj%Y+g4v~lencJ%A0S`&c6oyp8nz4+f|7=! zFif|*Jf^y4E7|4HHk!K=3LJ1S8Mspqv-K&eE;chR2k$+9>e<(0i_E>tKy|Hv9ez4l z*>1I{;gg5`lYM3+0ZV|lGbTkH-BEZ*BWbwf`;NJRXah*;hk*kHgZmc`%YH8$$2UIo z$UNNDO%(Zfs{LNRs)y~rM#uWQydJV@sdRqGsNoep@Hy-#EFe*NT}OEzaL!D2AHt0_}{xcjzPFw?}@XAMeP;S$Z7L!PJ+5S6rMo-}CN1 zlZo0)yNdv_&oP(7Eru2}k{MfK6u>b3T>gC(qL4TKBw34LX||D!j|W&I9Z)R}uzD35 zb!G3|wkd_=!gweC)}#`QiF#2y&Bb679o*x4eo>>17HvI(Q+VRSH@Ad`xg}PEVf)tL z8|5-tt1j*!TMrU}E-O*0!IV#ODh_Uc6TlT`?dnl(JSS_F>mqa=1Y68^qVM+FZt}H` zohH1%9K!PBX-HUj?3%_uiNZtlmr+^xz{BakFySkdsl$H?PM6lll1mC5*Dcziu9O?3 zM~SfSWH^3LZ1%`V)&y3k*CAm2QY#S^L?Hu4#5fc{2MnHuJ~a#qu!JMuVo4yW^w|EHbbCm{;S5S#x9M%4R%03^Z6Ha+9eMgBTA)sF~x@yoZi0(xY<^gCQelSFy_$NaZF#tcnhir317@dc>*?X=w$?@lu0eqT z0IF`OOyU41?Zt%nr(-ZZc__R>l!pOUlSDAUg1Q3Z(VO)62+o-hWPE0OtAdK_eft_3 z*g5Ioyl-ixuejlM5O3Z2lwh;#bdKX{2;6JEAbA&tigS0kg0$5zypwp}#LfCCf~^KB z@z&-sF+>k{!Jd#<#I;@F4%_^UxRboGnT6YH%4DoC6C&1kKwapjko2;St>gqxZ$y1= ze~v3{wt4;haAwv}(G5R-r_+iY_xga}jjKG6?VgkfI!qXL5yo1JNYC%Db5ChEP6CuA zltcYtIB`T`VQb}L`T@s1s?~B-cHK_LmhYXx&wiKgwT{a`y>&cf;nRQj#)~mEE$@ z0i!&ld7I5>Zl*LhgCKi%ah5etE_wiJ5$-+ zmos2q%cc*TZus`m`Ha-%5%3P(#8r2qYv%V2lh}Qhv8KkS5v zs9Je#NH%lCdAMHKF0NEWHaUAs{L(&OULEbN zV>;&y^vJ&a-V!U721NX5{>f0sgN6)ZOb%C&4Vo;`9S!;-b|V_PM#acJxNLDTCb6bP8&$*b)m}^#{OAL zvUNXbrX^yiuTl098GF9a1JIEd!@IvkRmbf?PBL);xaxYoUFQ$0EiuxHy~owk)9=RFP0+Eq=O=e7LLEOv_pY_F zMWeAxf5|-lmA~Tq3FPjR+9;w{QscgkjCFHjpBl|7B^Pyv>|OG9EWz~En!w_2Ctxq? z$5-2GQn_z_6Ip7izY#zCIlARzq2=AuGE}*VavW1=rbY-v`q84#sjb1hr>~Y#o!m{HYSc(9R+V2~Gxo9|;uZ&b zD;#IK6Tt|qCHvl1L!mR ze%Om4HptX9Q^pM=<%kj3x^2^eflP-)x9!}lcW>#|pcfXf7o5th*94xxe?8zRW5t)7?eIB@#3t$Fy_OUvzX z3IGf^{C#iE6pYSt*o=x3Gt7b4bd}4_q~MI!f8B@5BF+6tI{x{q$~Ol-6hG z5Y~) zPC!YCyGLPOUs$hH(;Ix5pxWtqZ(tyFGF zA8W3ZsM9T_9f$|#yWZ0S!-bzQ-eBU|B8PMM%r4RFhvSdK8pq37!WC`Is2W7W2D*s) zEH5~s?duh;mNtvVcF!DEQek@zJMfinv8mvuaMR9nIKp)=3}vFuEYEI))!^%McKkuL zwZ!+IN1DE)-@Eaega(%`m0hS#j4tY!IoY;gP7FluKZU3^LU9|RPv`lV1c%%EkEJMX z(c^ZP(`TNFPR}SGxU4f7|BewkC`o%^t#s+qZI+kVo)~*5m=ii~S`_N%yV_%F)p**P znlitgiMNbAm*4(hf&v2I0}v7|XV%QS+a&kGg@*CaD252((P;2k!3s+UkS!Cfp%RLP zO2Wk2&4TkrK@vT*5s$zxU5Eb#{ALdHhhzMEO|DK_(fVTaRt_3PL4%UW;>QwW764<^ zVocgO9>+(s+oJI^j+zQ;d#RBF%%Ro34aP{pq|R2M)47V;(WsV)kvzlz49KH7xrJ)l z>$!q-Soi?0a1DEKiQ$CE>7-vIBJ}N#26ttbJ!js&$_7@Zx2OjeFvF(5QMo^}Ov#>5 zf{$}UEJDQEFqB}f5pthYV*}T~U)B!$np3&2jBLKI#5tB?O$c65I(Iucnm^(G*hx!E z&6;NERRx*Wx>bS<>BU>p+tS{lAc;z2_Vtpj966P>d};FGN0h}JURvSyMX7h7>?ZAf z%Y0vMq!9P~^4kPt4IZO2+x44xfIBnv`jfNVgodVY_~3-q8eH)emjhE<@gj4BscxwZ zcxF`~p>!%&J0}*$Wb1}BDMd4vxS~p}200%vKwMssb@_yo8-j2xu(6v#YDHT%dx1gS z&0brVZG8yow$mOw7px>*0M5f&=yO{SzT@awdSYhMh;10&#s4v@C)n+#C2`%Kpzsv_ z`zOWtz@xt<1-~#;m+$lPxPKWM-#n%8G2DIQ*D6+!m-~SzQa>)u>)OJKa<16PB%s+w zOgAoq+j_148NcAjFc*JCPB)>y7O9YJ=I}akB2sIZEa^Z1AR$0o@ph!QrWhc8LF550 zAm@_P>1dWU!4!c9B9Ijr2`l}$KKk92ftKLZ3@d{JSasYHQf8X1RCpr z@)aQ|bXH2?g(3vwDqz#<)LBTibXRgW9!;e>mj1Do(!Hty0kRmYVVKpw7E4Wu-!HUc z034=vpKasOMzVKJ+?k9luSO924Ds=M&n<-1&0QOg_~yvDdd;r;L`AuW=xi4e;KrX{ zGu(4VvUKb&7?xAR>^E^fbSqjul;eBIa|=FD}bWD^V0>P}*88_t;hH=qEO0KFmbeV)s+ zdkI<)VxW30^edpHBs-^Ptps<2w}|IXZ$VRrH@Ty}lMV8oa$zoj=Jd9*fY6`z>*)D? z=aXLPR&40dV<;lxB*|*R_G|(`Ds|XU0^@O#_96PCh);>x2%de`mGrOtPP!!B;b|2-)MXX(231#9;+7f+!cNHZ z+-w)4DIE&mPF+ZLoQL_xw&xX^?B<{&y;Ur-Xg(|H%lS5F{_n+`gB`=>qGdgwUbmB`h(|HRJvkO9_0`I#7Jr&RoDD4!?oUne`Q+nUAuPCF=Rl zZ8q5e3%d>7(tj56p>mq+$?n=6A5&YaTX*_F#<#~03!9p6*Zg#~$@8q}Pf&Pk^7}7} zG5MqW+5a9NzWUel;qQu-EXQC1MUnaWMvU+C93hyr{JhEqL+y|GZLdOiZO)B7bNXl3gOD!3i^hV7*I`6OZ7&~l zn#X`Opk=ckOCFcr##9n;8(tdM)(1Hj6E$>PXcK*K3Z*pdf8K?O?CXD3gveJ>UzThF zRhAmV@dDU1a+^-fo8d8scO(}PsGArso)Zo6G=bHWxoPN0GRP()H?ON5MyPhEwfA}d zaKd8g$gCkkAQ$0vjcM6>Rkcz;=vV1lnTELh%K-#$;wu2(2_FMv&o6+mgJLdH*-@<}Ivbf! zm+BU4kbsBqXkjq$py=5S?AdxAfb z<5<%#{pHjijmwW&9$E#Jg0fU*jpKbI*z~k`N7+2&^9e!R+Ci6u(4n^s=Iw4JzD^=J z6AfuQxb?}2fy(s`#!gnT$xM^XiO^`v0=LnJcRa>a(LOcKd0WXe+Rv$7XYTjoD^$Uf zPWqti)CkfFfXxpE788MxHFW0lr>hH3Tbsh=otJm~0|5k;pIDQ+Ds9L^60z}$$p%OB zB`xYMPkp#Q@%j0%kFV*}9MWMUw{L%h9H+FMcYOV+{z`t!8Vag+!XX8LFQGk%X_h;Z zOYJ2YT|_90R_j}u58(5418>iot(CVp=G|}Z2ONxXqie4fwEHd8tgX6h=`iRR{@ywE z=?OcRLVPq=p1z&WGJlmEXJz$E&WA$~vZSdmv<;_rIr|Ufp{8vI7UIn7L%5mEDe6af zfj<|@ep~j-`PxkI-qVDpYG`svQ`NtiLfIckMcA>2xBmhKKaOD|nU^Q|H&fuYZG1rf zVNHa#D`UR2=)+72qpX2$hrJ})pph%4iufz2D`e*+)C}sf5Vpd585Isl3nu{$K@uu! zLTKoQ;55K!Jq@vpOik#R;AM{P6M#`ozc(UKGF4lNnxJ)gvCL`@%Y_JQJP=NRGe)>* z$hPYTUe6xFo(LMdSkRrA)Pr)iZ4(kT;;>y(Vr*f6W(S@1k&<774s<3{6=3D zb;V{YhDaxsq+0xh?nauVUOt`<2m_e-9JO)epP)R-WG&9wj~ZWkwD6QcFz24 z-_?e2#y2y(nB9i1nKOKXmrGb{_2HjUpa$AOOf@k+F~G42xm&td(G(ESwVUIOOBSW! zZn}8xq{^t;4ZhW59d6@341E)yndq8xo?J$4FP)jo6U~C4s3B8E;zB>}xjJ7@&olfbZnIevPkm6v7)^h@nM&!z3oDyNH{$ zje~?RPZ#vU9PDB)aFf_(val3m1zUJd?%XB=)c9smk?gn0-P*D=7Ds-VMJaQqRZ_ zr6>5ofLDiSB&#(T6|!{ja9f1kgmZ411bGDQYijhUZtSxLbBpM^YHvz16sk~WjULJc znxy*+U#Gg%7pR-jmPeoMTw2;pZ8vIs+^gqSzJ)JavS(5(&hX*iwcQWD)4yk6kFv| zRVqDUcw|lHGxb?41CRc?ZZuGaHvMw3g7@KH+lP;P|Hx2`$R9rZd;8#KN;lb_qx&}~ z*Z^|~Vy##II(Kvz1cjpA5kMPs%+!4gYAfd`)*Uff3#~PEhv}1`a926JYa1MvDUp~V zK%V67XKDtpBLUPZbQ8ph)N|ZBJAnxlEWl99ayctQg2GKD=(+?t4rL;zB#buOt%*!) zc)f-iOlafAA`LmU(8|o6_u-NSTpA>KWOg7N4nrs=`#N#fD!P5dX7sS!Y?)ZE$LK0o zYzfF}XTdcJr}*_RRBnO0;qv}2)7c69t&vQ#`CY`>lyC;(dG5&Fri**`=C+!b74Rj5 zyiGHw?xP6cT5s$|E{2}HQvB0=(EgU^=}g?^4?rKD_|B@z@rzO6BBUenm|Go-n4`&w zu%Lz3682i3TKG}jmo6O?s0$d~WE&H7*S*b&q9?K-)y%!6TA9xp%jR6CuoNEVNZsiu zOHye$y=U-QVf~`#qit#|Tk1bvu}`^R#l!Ldoc zYDwDHXB~l&K=tXDwa++RBa706y)X)9SLt*~9Id!0&AGNw<8wbZ;69Cr@vWSL@F36*7+T%3=F!{|1HsixbcRP>ou&d8&1n9Tkn7kpd1>w4_p&&}3;pI&&mr zIM$;tz#NvuFt|JR+#vQP%YiQ{TUYt` zWNn+XbEWy}PY^7rnn)Au#8SY)KyI)3x`|*rE1<`#gMljZe$bF<1^`p5h4{wy4=Q>S zcnbcEF5P@qnDsGzaNvCM}bPn#3zy z;*Jny#^zQoC&|~xqeU|vMJI6#3DLt_=p`DTKA~xStxS6vG1yMRR=Te3c9>tAGb@+< za7)KkCB)8d$mUEN+U&HPxZl;N$d`XwUlR<2?q$Yl(_}dT zwf_Afl_Nv-b~i7XLqGx*;qcXokK2^NR1N|+D5=~Rm5VY&C@cEX@I)F!WN%(s?%}@# zQc`CK^-O7~%jkvR(bMV%IeUjKdHATlgIpLl^Rl}qlXf&-nP+t#_R0kVY zA7xERX$@nL7QZ!q+$teOzP8=q_;Qh zX+_B~2Yx>?yyHk>YJdu6LlgxzAo>(QOSngJktNI_)w0l>pZ)5E?{oiFnIY;b1C5C~ zw(PO9oM1Jy&uvoe|3tGMT{&}xrXJ>tv^TwCHBm~6R;x`X4&pDeBl3vtkA=(pRhXLk zh&ntT5eVYOwTAdD2I85{54Et`vKWi}L+^|G_q}?SU-=G(f97O!^2O#Y1$wwk!34q$ zEOjX?iT_7cN%YU1i9tWfUQjO@PT*LjA{p|!16w}xS(Nc=vass;XCZ8GW9R)Hm$w_8 z?GF#Oz_(%JQK%aYi31O|Ps_8`xZ}(c8s0P6lFC#va+l}Oout#a)j!Li0EHy@-u@3L zmUh$om9G0O&W=&#OIMxz;gdk{ck%3{-Q16+bt~>Nw^Q(^fjz^Pt4r`Y+ zh(|J&-zIarKk9qJgI{BKMJACUag5tP9_d*48x;O#3V*$TV6dBZw{CNu@dj`}81xM` z1`YT@D3}~C3*u~}2LRj&_B}i3=^FNYHz7@658#CgH$^p2$bESsv z(*Q{V={1*JIF@DnSdqs2q00|ez%}&5#UwoJWbMVcvjtKI_4BS)Okbr=mn{_{&&}+o z32~GQW9bwp682ci7c_=<4O+dK<-b+kX=P?`rOUW6Q(Fm#T;k%l)I1y;yeiE)8xBi; zf(lQ(8rE_H4tKS(;&LpPa@sXL$9x5nvmoZ_+xo^!C2q}Kx)JYa|K8Y<46D^^^B8+z z2th)c3rs84I{J%eoTJp|OZk*A$sN}8%mBbheENY!A$)hhevc*xSyXNB0%s9N49#OFmni#>JifVUMAvM7G9ACZ4P|xI+*`-lV2-dH zf5Hl^dZ2-Er)sP&k7;3jtHJ>X43siE@9!3&FqH$Cia}sFjO_1cW`dGDg3nek5c)>f6^5E znoS_XN^<1ippgHz=k|%N50Vrs?{iAo*@=5sCw!=QT^Dv3OdZsr<$z$&>h(acy3dNE zvIQ_Y6-hu+`swhvaDajZ*&;KDhg3_?r@LAOf(Ukuqci^Jt7tevA>$l9>+e6ntfnHU z#E#4vZ8p2|gy`(<8?Ajr==rgkS^&FEvWeZ3`%F)dK2=m%~K4iJzr&HjN3shLlVYRV{VTb~Q~IK!Q9M*(t~c~@qs35lpvU)dakqs-1Mz<4eNY$1^K(^Tgyb{6^yRRIKf+F(>C+DP;@G-< zrYFK*XFj*%9ZNKh=1NXyeW)rbhk^3jc;7!fIbe<{r{A;IW0$h1srIZd0NDua60;%3 z$~YpzWwNiR)HD#`LqF0)$Jp4e^;laZ$JsHpZAl26BN4^l(yGnYbkkYJ2QD{*oT!jf zOZs$01U{7#=(7(5lbhf?|B;EcFTSz;-^- zUyjOD6hz<^Scwp!`359bfJ-i^icT0>PDI9} z7sF7Pc;E~jsJsFb_t&j^tYMjNYN{+$thb%gD99AJ<*i@7Vu3UuMkA)#Vfe8I)2Ou% ztSCUzVzpkSv*A#otNjeo?u;5BnS(8tY!Yb+KVufb>&JclM9Y7R%|Jruh1eXtmB6;Z zX^~O+shQVXz0Bd;`^we_3G15rj>et=OK&H&Mut_Bq9ZVwBbjX?uk2HLeKpP{a~NQy zwJEia>uzCknb`-!{y`>LpRseR0#|r3qI9_%E3bw=-b|3HSpuMPIGbUOv#72+sSlmF zw0}INwcli>NPYKac3+@cng`>;ZxzW3ODv+dEb}MzB}4KZF%of6WKyBRtygZ&^4qc> z_sTyZH@eosJ{uAZo+eDLM{v_yv*MlZtQ~%vD)ly8^P_rGi7SdPUsu@!ZMI!j8Lv*y zH`(fLVek27iDi#L_r0=SWa*?}eY_Q}{L*o-8!zq|?!}wsB7mN*T0rbr^VVi8v{0kIbDF*>Y^c|XBMi~?Zp==&i zPD+Fse#*8xuBBJta5R0H`znWO%Hu*?Fb~wXLt1z?k)-i+Vl=92H70VNO5ZVMorkwH zLeMk3F@jk$%2lucgOSS^fVrsTyjWY87nP4ax^xn?quq&q;6_oRrKpukt?4;jOgDqTVN-Z#FT&Pu;X`#YL{<_H-Hpqc z@k%ld3BIG9Yw4CU7RB6X*Q|C*!|W}U4+eBO?wP>9I&t#xVx<`_Sb~paWy~%{7+h2j z%{M-^pD9#a94+P_)C&u!?cYZAKPW^s?0+CQB~z##UD;L{TT`BWlyuV+YvW{buEO`1 zEQRezIo|C|#$Zs56V!QQAj6pVOHbl&YM2IqSNSslDz z#X3H&@2~Dc)$GAny2aCnBJ=1@fF8pfW>9`bE=lUZEktsA8hNz3@%L ze@ztrA`FJVR)m{NSQZ>gYzrFVLu7&oI;vTW__ZPnP8FAC{@Hl2NA^ytrE0z{%x3Kj zl45AaNYq64GITDD3(=eaDDWbA&}(mvA{%d9>KIW&A)9dL08^79>5tnSIy$JLuGJ^6 z1{)bQSezGg`I9aq#dQUh*j)93B~N1&`_Gl>AiKf)l)-V0Qz9}cL$Iv=7(k{?LU^v?ag-ztno9z8oFweEA4rx7fl!U9r9wT^qm%~36jfK?vVxv39!RMBsMQ2^Kfjeg{|w=U87Xmu(i@o!fVuxN85P80*P z>j>-5>EV^pAAX8)_`?T(>x@;VOHK0rPCjftdO3kcz(JBXKZ}kH0DYg9s}9$APn*Ff zFw#bymAA^LkEPQY3H*yEZ+*54q(2wi0_mX65Iyin<~6v0vm~A>c%jsN5#I#4y!>IG zaUQAR>j6I7+t0f|G*faC(2HdUlw2;^@U1N|hfwi-K>m#Zm`Hlw4n*sr*6Z_6%nqW^ z(MiL>Ty5MUQxUKh!Uz#gP{RC_&~#ZL_eh~+N1f9k(gdr126R13FpESZD&&Af!0~%q zSlFap|BQ)9F3Lb@O$)CZ6B~xr1K_nI5XKArN!K7QbzY9Id;XjQ zKeOk1_p{P6gw2L982#jTW~;dyyFDxM*|!qDw7RZNfc&n@%5l`N)zQkUH>w(tslk91 zP8v(HY^`)xpZvwhx3Y8y5$uxFlej_Gn!Y+QbC<@4mUU#3**?=Zu>yyynEgPI!7AeY zpG!~(Mt0KsY6cqs%xkTZG!CEDq^k~D|aCP3jJQ5d1IMdXxs5E{bE zqNGA|O#rM?G6GT^jk^omjnM!+oSy=+B~a*EuF4NA)X?0-aqpgPPIq2RWn#RGJi3w) zUV%>pfVo%p$pT{0(blyo=|y-OljZKJA$l(oDEBvxZuP8QnV#h6xI1UDgbqhA$V{Df z4%Dlv@XVFX*V3Q&2+Vf|^#1tfR5V%iuIBv2C!&Qnx5g*%b!Z&t2Hc~p@uznn{RR5; z##jm~dkfxin;-M>vNrRbKXy6=9&v>Ezc_u<3T_(c8yM6!;GhC(v@42Mj6?=U+oxTy zIh4vUL9G%HsFAr^%Yc@zb}VjPV5<|diuTyz4P2FV-LrqXuQmF-#niW&sPVT8lM__p zcu{*$z_oc11rg|Id-mR>d5W${5_zMRs3cj2aAMruGRRa>&)JUU`*M#KOIVy+0D5@i znn($m*d-6Bb4xM9No)rgnLi0AL(H1YSPi^$2F@`L!LvPEso5zdAk=Y|)nN8o|kb7hPff*ev)#6**l8ztTt|VOz<>!3Zf#Z7jx30%K8D`2Pq`!`;aWHCD`*{k<^RDNlbg9O2ll*xxl}UTusnIuGOZoy+ zups`o-)$OUMYh4|J^Q#qP#M&xjNAQUcmn3QLCi;%%DkH-xGzldu$ryz9g59E8$&s7&^M>m+w`bppk}c1RxI&ET z5P66`f~|;Oe5N&@Gy==}wfJyQE*F+8a(XS@9#P`p^+`Lh$RlXJ@awc)i{^k+ix!pU z^iG}({O-g*M}laqQhrsqpAqcE4cIqtw4?4W#_uy-6&=JK50Z+)?vT1=ptB zrLi!Gxhhy8e)&srlIHT8fDo|)&yd|EP2sQpbKtR6hF>5*83+YyeaflP(DLOoLZ}=}LFraP&Y(YW3QB^R!hlFTdH^nrfmXxZ zQ9@HRe1}AWMDp-`9u5M4_j1rXypMM|HDoxfWFEsTd;lT;hQur4@537R_?Q z5*N6(gwm4xOluJeUa|;4B|9LzTTSU7N*=iI=uF}}&ngt*iwn@R&A|)@v+*Ue9S@ee zut5<~fS^))Nd7Y#iQyM7TZ|<>i1Bqz}NQLE6y+uyNHa@rlMH$ikvT1Zf3!oAO_n5gcUB5BcUo!4lu2FBiH(0lBq&N3PAT1bc zb2BwAvvup=pzwb!AO0u*zyJi0jtNZO&fIbC_g$u)=?O$}-@)`5+m!f;oiih8BiB=e zzG6%lNSa7B5~O&Q6KFsapXCE#7E_H>OH3!ewLwcvjjje{t5XpErYM=H5I?}B=q8mq zAzlX{U5lB=B6R`dH0UC%b`M$UwaLGC3Smj~al8frnN~WuW zgg$d~cvRYWZJ>gi+}avc3El*4L149HiIG+7>Wbs_v-FYWOb)$Sbl6iIFWAHkWZ49b4N*|a`TlJ4Tt z8;{k+6SY2a85ZF)?D3R&!9Tfwv|{usJl;+M&|n5Rh5KSFKGBhp(*a-d;8T+x9FAcd zd(v{^l*fe`IZH!=JR1Y+;4iTu!$b$Oy5%Mp?0L;ucC&4?{&rbF6MJfV+8d`*!{x)y z`wln4JyL*NkD?bp_eb2?M)4G@o2E%s)Yi0pj7JlwgdF^ILw>}MqV`yr^yTn3OA(a2 z3~kfEX8xeR+w|Izxdb=(u8`3J?JJViwRxBIgRTAtw36PsMbt{GKS5!(^!E`(MDK;` z!hbV`<)=+K|7m=P;}}$4IyuF9e5Gg47=CY1&e3}i0TBbM@$xXUd7rAMkbxNB?OHYl zaT5p}VLvlTA?f3x6u^I^2$+^65H!ZhsZ*6&Zm$3Xx7Psb?ch-v=zv^fb>)P(t6Pe` zYQBgnB%mx^3xp%y6CJhf-!7FJm)DT0{a&D-^tSql2~edbW1)B4bUJ^^=81)(eNEjMVPOEyIA56GR$?kk`9 zIvjg!k-PqbMGiMQ%@lJmy&0NFRS%=xyeXeu`~{YdRaX|EA`6rSrPb{ry)UpxZq>Sv zo7H1C&2b4^YsLe|=#`YdFNa%+wV(toOJOe*U~x2|$e8*lLjCf5sD^RXcuQZK7d@H& ze9xQW->w4OwnVK9_0hW2%V>uVGQHV0eT;%6e6wrj!-~uzRC}^)WB2@ZzjzqJ5hr7> z>oXYp#rn{NyCETXp`Z&>oy;}w*(f2VAQp?dJQF-W0A;)d!-37tyC7XRGq&vPh-4Hn z3oNmB@=ghvFu1_3V-!W^B(&@l0PGj520dg-;{Q!5L3 zC^Y9_TO-U_rJA4>6R;#)@;FgJ5PPz79$nq~RX>1=;#*njJR(Ex8e0iY6d5|3PhUpR z-@BOe`qCzDD1csk_*lz(QSj(@hwB-;%sl& zo!tBPvn%M;Hm#l%OT0{|+DaLlR!5bd>t}1VRt_aU6!93`mVI$eUqwfC2e^{`cV9YY zv9+OINg~G8%@pQ2BZ{gXx(2WDfRUK}M|HCKfuXmM&Yx8K-fW*|HG=9!yxWNv5GED& z&vGA)NxbG@?w;&ztA4tUr~+dW_81@Z;7!fYK?ZgOOiorB;jiaU!=Ka$p@mZ8EtAiS zc`YA*scmiH^KiBHBLK|=vgY#(*Jdb{+|5z zjf#kX|IieC+e|tC$>n^cHKA>*%0dx{N@c!MoF~6rM1p=YLt`#gUNsnUL{wnGsEw6% zera&0?u4iSE)^=-WY84z7W8t(!(DV~Pzd7iQUf%n!}@Ge3^oC{2;~8m6`D;L)>nh7 zMHV?y5w_k?tS9nXGJ5e^;c3HdttH{@nTT@`PyFy?s+&)Jb<>gAl&oEyY9Z??j`PbE zEUp84SyYoN^Jx;g(y{FuZe>FlE0dx|AX8ZL0R-8%UbBL$0RGnwIAohQ6=#AtG6MCZ zoCc2WY&4LHm9|N$j?sl4J2%eTn0YiAE?!!YBupf1e(3R{kXLSnOgwb2^Xx)jPz&(} z?YmVxBGv=;NQB>3=kIZ&uzlW@8i6m=9eyf*NwJ|hh0QI&piK6{J4-tpM6-a7vn43< z%aXIijatW3VRzSxg0aJeZ?0fc4ZbG3`JkwOCba(_(%w6)iG*z*osu#nAtWI{2muqC zp*j>172OF8>5yKATdq5_r`SKWY!eb>5c zTRqwL``-86@Ao_3?|kQ+|7J4RHP@A7u6v&6exCcj_4?PZB*5#D(~z#~Y||yVr&0>r zQkJ>O-g49(NR8saCSBimpPoOmM<04xwK;G40Dv4`X9a?CcSCmBV(Q0lru zv-oL|ZCyD|>zkuQDgyuA0M(DQExuC<@z-s+tsN=A60F})eEND-gN}C0F)EeLC_8e? z-*gwBZfjkicwdwr&4^6K)=asCx;wxucgM)|toU6w{=d5^04M;kz-|JIF!R*(H5~P)ug{*% z*U5p-3(7tYluzErg?GyOx^0Z%eJ8ZXn*GwEO8cz!`g7aG7Rpk;_cJHYr!MMLUzrqH zlyu?O;5@a5Jxw7mlmQP3IN}`UDby4ke+OZyrfzDTW@ydw*@R%-CrxOc`{|6Gr()6s zkuM(vI(DN!C(LMX)>?kO&tt~DP}M@mgW`E>fTa9$^5{JEa1qu}-- z&31x!dSCBceb*B6+V7SdVN%1LkJ;0>7j?BN#FDZ5WZ)|^CvRzp|Mi{07EMwCUgAzU zl$Gly)YbxfR1WTJLcE#lXk&zi$pRvuRBQnQ`-5qB=Bus*@*gC{FGK zQHu>-aFC$=z~F}NC|j|kZKUhE@~&ismv$%wL^-rhd*Jh3AIg$y-A-t*@?`EgisR6RES-37BMCj_*6( zrm|w#8#9U&dPMJ9bG7ZrEBL_sGbtwy3kk07mpDa&Z~7@PAvlkJ#7ZA)W6s*9y`MOn zLn4C4Zu5qWl7+b#Q-KUTy_E~{`)tjVSC7m1A|zv}qEyXDL20oED1G2idd$fm>caCZ zh8Xk8Z7=1StyOQA1QT9eyW-;!;rV7(qJJ60-K#;6;lLA?q5Oo@By&) zb{{wMV9nl-_S~7It+E0;j=9`J(UipTvOm(=)?Vc-dzr6w*ANV|#}a}|JNCvWwhB$> zWC(Db);v-8ZguVl4wECaw9yt9GePi3okOjO0?&P+Ct*a(<6oWowVM>NM4dX|Ds|n= zV}0MGG6*Q%ET%$>({+@VN!@r+$_VN_D%0|ZZId5IW@PF8g3L>cSaL@Om}bJ%Yg=fD zhHqX4_&yTId`aQPWa8H*z*?zMT#)wYg{B-1Xdl6CD>zZrpI&nPdeq{Kb0%a)e^;Ml z3+-cI`I2EOftz)Srxv?fKJu(ayX;Rj70u=VUWzgTxRzm-vDWf^I2zWrDq*ci-Dz%q zum&?D1XS%R)AIQ)>%8L86S&~f`=isfA*Mt(I{(nRNzB!imCo=8se0r(XZw1cpl?x1 zSVC7nl~fQ0NKRD4Jox94vkJ~%pztgC zi_BoLa`#`;hq*s84MgKc>_0gLPC5;`l+O5cNv_5cI1V#fPw>}aMlz0A6A6UMia>)7 z!%`+O(J%m}B80^$H8#@ehN>>BN@ZCNGC<&Uw+-3NsZb8&fV$W~kOTmTG|41wdQB|R zkSU1n_k3=erR$=Y0Z(;Z{cVrSn?(FIL$s;P#xU(sHQU&S#lCm%zNw;QFQMHox?~VI zUKlfJ49U3y{HFsm@&jw#Llq$;dvN;dnF0G|ctoW0b}1b;*8avJhRi|emK90C>4YEp zAWo6@(K{^%!N9i5u`QxM76pJynbW7SXM0p{tg-)I^^7Wz57*Kd1>AznbE{8l>jp|Z z<$HaEU%dK$UBd?^wk$lgK5F~GuKniqmUDvE?N!Y$`AKk*g-bbto)+Sp{MPmW>H^MU zqoA#J;T@g31LbR`}(A2q!kDD+rZ@tPit)VZF@}gh+P^{a( zkiB-p?Ddn0f0+5(3X*PS{LC1Bb;_enBsgkzx}n68wC0z%M0IY3ENI5X7)41U4#!LG zhPE?8UJkLAU9+M(m|1fXq;$ne#MHC&g=w@`{95mjB7a2J;L~mcAO0VJ!vCRN`1>WC zU=YK(k)lXiKXl{LIxIHeLdYeR(SVjPNtgBn;xD)RsJ$}QD2XCTzB7ojV?}xAsG{jxF#Y)P?9^; zwOyTK9w-+%x2&~0K5RCVyr{cm@@Xbb`26@=a(H*Q-HK;#!uRo z(fTI`yIc1>+2AL?4?5ybpi3h$?h`utHqU_sO@L}mRi5qnm(v&JeW!Wv!~Sj2c(5;> z7!E5hPB)t^rx}}$g~YBcXH=I$gNZYaAaOk{-cB>G?keb|rJF6}ct?zHMXK9kUYZhk zz9jF0PY>egeIyo%CUe*$Bm^S})pJ8>?b26^COG}ccP+_`W6@Gr5P0~AE6Z9_U{4fi zTPu|g{8E*yay=65_XE9vt?%uQ?#FngY}T!v{6|hHycJUqGQu!X_EiR^Y zJ5{D>2kid>h1-hHGG&;dedzh;^x+=Uz4f=q;r|2$e>NMGwO+K$R$JiMsux!*7me7~ zAn+lF^_e=@*dLW70T*d+`Qjqh&|GlnYc>r_SARQGoXs9O4~th=se@s)DOtSOW$0To zH5;bcfF*%!NNq5{N;2)0zmRe=Y9{QA)p04~r_}`~1#19CvZ9X-WIh7;IV?`cSba#VVRf8jMS~ph@$v*BQ6Mi zJ7+|Ru-q2>%G)yf$z5fB3j~!Di#@fT##9)4yy$=}-$(&G;Y%Y%lwF;;9Y7Qd zrz6mQy?t5)Q?4s=y1p$xC_;-0Sp=!}(%3s}Yc|!JWDZ##Jd~S~m@jv&obUte39ejo zcu^A(|IW^Y;O^>cFrLW@aDOzbYnT~UXg<)5VkI6_D1R9tF0m-V)%}_zSOzl`b0wbd z`Q@jZwID)}x5QfRmI3kU1wsjn|4GAW^5s0DuoklGAAt=?Df|JbGa=P@Mu>WCB$dnr z6-SkKmmNR)sya?2iKayhh-4s7hV9g*H_TW-8cX-xJ8kSAl>+=FMk!YO zt$m0zburme{?C!*n(KlMHPM2>fLPG%XdN#b4%|fV@F4X$Mwg~a}j+S6UrjwWvN3*wv#VfE z-JL>LI)V-6p?v^f-!ii)^BgZIfJ*ybB(IUatX(EMB$9rR|5yOTCM6~W{j_H63Jzx% zO51XBJ*7PZ*E>UXx6eeBxOfNm-fW;W-+X+tB-SzC_Mt_S?xLcZbj!B;NHS;TfjZTyveV@WA~ za7x${?!pCTe@1D6_oZgw&h2fgnrI?$dEvlrGHC8PJ2%$+W#EAqN9=uBeWPzuNU3>E zrGM@YzjZtDm&T~$`16EiJB1}0@6%NqY&aF-6nw+L4{-v^)XJ$#4}Z9APtoAkM&UP) z`znNMPd+@IuuoW4zIB5k(16oKKp(HYoA2aQ`R)IW9_sIJ|NnAq4tB$gHE0d>J`HU_ z^I(u+$`RsYdB7~r?=@S$U>zDUI4gj|6*pWlbZH*d6(oIZGE z!%+&cWamI;$Y4RvNw=J)nIVb#CgkhH$+IJDOk23xi+z;Kx>d0UuzmLVQhidV1fvOA zp?V4Oa-wsB^>#t+b0w*6R5fMKZrF1sfUd^^6Kx?{#s~!0)LSxL*ctqZU3A;L^AD*w;jg+vr@3v z#;PalJNb`-KHDA19~cO{xDt8try6GfhPm@PX3go;-BuOS=ZD2-yRwoNPg|8qsPv|* zASpv?OK>D%Lg^eB)P6*`Fj1HY2Xv(k-i7M$HTO#Of20>{p#&TWw)F+p(Z9V%bK6#c=LWA*fY*v^z zG;Hgq4HI%y#cF5dk6zKn^QoVE}K z_0W}y2~UPuX3nf%PyWAIa?Ul(t(kbNHz1~B$`F$wW8HpT0!(9J`*nWyv<2DGH*w8S zpy-zF4q0rj6QZWwV0tWl0KZc}>c$y7poqZ$cD+D}G$Wn2uEb8gXzhq3 ztv%VJ+FbjZyV!p)U^$fWNSfW0#rVUrEKw;&h^gzdeAzuK zzdF03_Z5Kq1|RIQ%}|0>6w#T5uyMAKQDZsjM{o%&@MeEF8Bf43*ssDVu%c z6p;>0E3jPikA+49Ca{(L-FF`tnB#veIs2_JwKLgL{m(*ya5;QZAaFvZR<0{=7G1)b zhSVkR0#bnp;Sr|D{1j;*5{&TujcEat)nnf6JX7*;4+YvP=h%>-bi_;tUlm!2IX7k$uCKS;Rx=@`Gw_;h z!)UrHjW+wol9WhDQg{zuk zDMoSU8XSPJ)`;JI2X5Q@Tvg>c?w`Xv(bk@|<`IEsDP4U%hkhX;_(@NswSM>U*Cw)( zg9x0Dh@F?ti>)!fTeVhst2jGg<>z%Ph}`Lq892>}dSKy`R+KZZC&ei}(0J#Sy4zhL zscz{y0?D4?<{pZq^hs5dQ&{Xf!LNc(`eJ-BKT;yv(i-XBsZN zKO7-MD@7qjplv5UCfb2t6*-JCWHqk1j=kjb4y%DD$2fs@tXUKw{&<~-XUY|RyPmKD zTi!VPo4`E$!v|^8_Z*%%y~hSrg)*&w*ehY-WLeqclcif%72u>)e^zGSkz}#yseg43 z|LtZ1AAr_tUZjZ_oiCpTXC)RL~(1f>CKe2ny1SI}^HxQ;ict(>sSOLVyAtAH;O1kVz-%0MBXK!7V}|W@AsQ ziIp;lgdujA3BH9E4M!LvNmYOhbB|~pyY$)&Tv-spu|;@jIx+8CBWYKWlrAPuc5rX3_z z1tdzOIQZQ_&EBf)tHX|QxD?hADBZF;prktm3+zl;>?E`q-Cy0bD7;`WsV2 zCmvcWo(>1$7`}rYLbc>6_JZ5nkHVdP8=O4736cxXrOxgU4s`Gzw?@tGeW~yDyFHOu zh+lhQI$v72k$;d4=jZ>CNpl5Nmh}+Bmru-L`x1cJ)e*M%y)QPlOx|(*u<^1AfwD8A zjPG2!siFeRa&z^*@igV590xr46mVr@if>{$VR8AJP5fS2f+g$QRoevr!87I?GUNJP zRy@}K6BK@B+Wf71K%`kuj#WKmFLt;0NXf$`Lc)V~R0Qg@UK}7Vboc9@502rpi(>s4 zc!pdGs^BB|I}#Oo$tUlG5H@5e5xsQ`Pz_+|C#L{ljuZeKVZFCBKC`b_@glK@&`6d> zJ454Hfm$<)yvUF)y$c8nJlkqmc=O*##LK97fbepe$$C>NcAo$&i4N3Bh}8P})$ea6 z?xK{}j#g;u-S;iX;P`O(Inn29vRGAt(dLB2qa(}B$BYCxhC~~RiHEe&`>cEZ)jA>N zry0HlC!eldt<>`6$LDDPKO;J~ejPQT@%Xykz{o(=?BgdNA%>de0fzWWR>~MD-TD#s zi|71t{YfZ~IJEleMlVa?v=8MfMVll!KSNTQl&G?w>aix1BW8PE0?oRH1g}1Nfe_BqJUB8?SFT4sXI_WTxgNCbg<%wQe>o?Jgc!u2DTB`%x!a5++8?;F1vMU4{&KBQntJ$~Qb)^x277rjX1CM*(k` z0PI5FLUl2MBj_SR1U8KY;g~QMmSLPGcU$n1`yArlna)H&=|1DEd?KR)e}CIk+D@Z@ zxbFJd#aH?!lK`7-vMiSHaH0;-bCP3I(jWLpwGadm@xCtg(LdL^EqJV)*^?LO!!Hid ziSjz%=XtdkBxYgsGq(!2Ot;&0>3VbAPjN@5@54Z_yS9$}VPS$>3<)|?Rd_Rgx7G2H z%wE%`^vGulP|xppz%ic_YO4kBBrh~KNsIl;ZA|IPkq)*s34IZ1FJjOLS}!_tcls|2 zY8S-aDsJyMqJY-hhVjoT7LZc`Fn?(33C}csso%a`ycMYp#03(G(xw{6E&B?mAn^1R z<*8UJ*Gh0n>)^X>1VY73255e68TW325Q<)0l<2;%J=8tC@s#m}$+}v>b@M0ufeI@D zxM=`Bri_+tC=YTvy9l9|ajhHu;_IN6(g>$t8Ygy!1~l*9^czm~W?V`)FKc7`MJe1N ze{NA;JbL$m!<9Xj71$Vjb7V5yKsiC#GQ>(VmnCTLzsm84#}xhM8ZTLakfD$E?f~^%

@p~e;!KFaA`8kLxON%^A{a%iL-9Utp#*Y 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

=G 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 literal 0 HcmV?d00001 diff --git a/sounds/tasks/tasks_3.mp3 b/sounds/tasks/tasks_3.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..852cf1e6a5595b037a3d787c14893027ce56801c GIT binary patch literal 81987 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 literal 0 HcmV?d00001 diff --git a/sounds/tasks/tasks_4.mp3 b/sounds/tasks/tasks_4.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..8d628c4c1686d55f809dd98c9e461fa9ac566085 GIT binary patch literal 42470 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 literal 0 HcmV?d00001 diff --git a/task_getter.py b/task_getter.py index 4812d37..3d3db28 100644 --- a/task_getter.py +++ b/task_getter.py @@ -50,4 +50,6 @@ def get_random_hard_task (self) -> dict[str, str]: return random.choice (self.hard_tasks) def get_random_very_hard_task (self) -> dict[str, str]: - return random.choice (self.very_hard_tasks) \ No newline at end of file + return random.choice (self.very_hard_tasks) + def get_random_task(self): + return random.choice(self.all_tasks) \ No newline at end of file diff --git a/useful_functions.py b/useful_functions.py index e8cefa2..40185c6 100644 --- a/useful_functions.py +++ b/useful_functions.py @@ -1,6 +1,8 @@ from json_manager import * + + def create_sessional_data (sessional_data: dict) -> dict: if sessional_data == { }: # То есть это первое сообщение return { From 8033c183bc0cec4a73123d7c7757fc92ba82b1db Mon Sep 17 00:00:00 2001 From: Alexonys1 <107358560+Alexonys1@users.noreply.github.com> Date: Sun, 26 Mar 2023 20:17:09 +0300 Subject: [PATCH 20/31] =?UTF-8?q?=D0=91=D0=BE=D0=BB=D1=8C=D1=88=D0=BE?= =?UTF-8?q?=D0=B5=20=D0=B4=D0=BE=D0=BF=D0=BE=D0=BB=D0=BD=D0=B5=D0=BD=D0=B8?= =?UTF-8?q?=D0=B5=20=D0=BE=D1=82=20=D0=9A=D0=B8=D1=80=D0=B8=D0=BB=D0=BB?= =?UTF-8?q?=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Кирилл написал большой блок с Задачками. --- email_sender.py | 34 ++ json_manager.py | 9 +- main3.py | 216 +++------- main4.py | 952 +++++++++++++++++++++++++++++++++++++++++++ quest_getter.py | 6 +- task_getter.py | 4 +- texts_for_users.json | 13 + useful_functions.py | 5 +- 8 files changed, 1066 insertions(+), 173 deletions(-) create mode 100644 email_sender.py create mode 100644 main4.py diff --git a/email_sender.py b/email_sender.py new file mode 100644 index 0000000..8c5d0ea --- /dev/null +++ b/email_sender.py @@ -0,0 +1,34 @@ +import smtplib +from email.mime.text import MIMEText +from email.mime.multipart import MIMEMultipart +from email.mime.application import MIMEApplication + + +# Написано ChatGPT +class EmailSender: + def __init__(self, email: str, password: str): + self.email = email + self.password = password + + def send_email(self, to_email: str, theme: str, text: str, attachment=None): + """Отправляет сообщение на указанную почту.""" + msg = MIMEMultipart() + msg['From'] = self.email + msg['To'] = to_email + msg['Subject'] = theme + + msg.attach(MIMEText(text, 'plain')) + + if attachment: + with open(attachment, 'rb') as f: + file_data = f.read() + part = MIMEApplication(file_data) + part.add_header('Content-Disposition', f'attachment; filename="{attachment}"') + msg.attach(part) + + server = smtplib.SMTP('smtp.gmail.com', 587) + server.starttls() + server.login(self.email, self.password) + text = msg.as_string() + server.sendmail(self.email, to_email, text) + server.quit() \ No newline at end of file diff --git a/json_manager.py b/json_manager.py index 074b563..74121f4 100644 --- a/json_manager.py +++ b/json_manager.py @@ -90,4 +90,11 @@ def get_random_sound_of_looking_results ( ) -> str: return random.choice (texts_for_users["sound_of_looking_results"]) def get_introduction_sound ( ) -> str: - return "" \ No newline at end of file + return "" + + +def get_random_win_picture ( ) -> str: + return random.choice (texts_for_users["big_win_pictures"]) + +def get_random_bonus_picture ( ) -> str: + return random.choice (texts_for_users["bonus_pictures"]) \ No newline at end of file diff --git a/main3.py b/main3.py index 89b4dce..7461194 100644 --- a/main3.py +++ b/main3.py @@ -6,45 +6,11 @@ from lesson_getter import LessonGetter from task_getter import TaskGetter from buttons import Buttons +from email_sender import EmailSender from enums import * from typing import Literal -def code_to_speech(code: str) -> str: - REPLACEMENTS = { - ")": " скобка закрывается ", - "(": " скобка открывается ", - "*": " звёздочка ", - "'": " кавычки ", - '"': " кавычки ", - "{": " фигурная скобка открывается ", - "}": " фигурная скобка закрывается ", - ":": " двоеточие ", - "!": " восклицательный знак ", - ".": " точка ", - ",": " запятая ", - "[": " квадратная скобка открывается ", - "]": " квадратная скобка закрывается ", - "||": " две вертикальные линии (операция или) ", - ">": " больше ", - "<": " меньше ", - "/": " разделить ", - "-": " минус ", - "+": " плюс ", - "%": " процент ", - "@": " собачка ", - "&": " амперсанд " - } - - PAUSE = "sil <[250]>" - lines = code.split("\n") - formatted_lines = [] - for i, line in enumerate(lines, start=1): - formatted_line = line - for k in REPLACEMENTS.keys(): - formatted_line = formatted_line.replace(k, REPLACEMENTS[k]) - formatted_lines.append(f"{PAUSE} строка {i} {PAUSE} {formatted_line}") - return "\n".join(formatted_lines) + PAUSE class HandlerOfAlisa: def __init__ (self, request: dict): @@ -58,6 +24,7 @@ def __init__ (self, request: dict): self._SESSIONAL_DATA: dict = create_sessional_data (request["state"]["session"]) self._INTERSESSIONAL_DATA: dict = create_intersessional_data (request["state"]["user"]) self._TEXT_TO_SPEECH = "" + self._CARD = { } self._BUTTONS = Buttons ( ) self._working_with_user ( ) @@ -66,10 +33,8 @@ def __init__ (self, request: dict): def save_last_phrase (function: callable) -> callable: def _wrapper (self, *args, **kwargs): function (self, *args, **kwargs) - if self._TEXT_TO_SPEECH: - self._SESSIONAL_DATA["last_phrase"] = self._TEXT_TO_SPEECH - else: - self._SESSIONAL_DATA["last_phrase"] = self._OUTPUT_TEXT + self._SESSIONAL_DATA["last_output_text"] = self._OUTPUT_TEXT + self._SESSIONAL_DATA["last_text_to_speech"] = self._TEXT_TO_SPEECH self._SESSIONAL_DATA["last_buttons"] = self._BUTTONS.BUTTONS return _wrapper @@ -163,8 +128,7 @@ def _working_with_user_in_main_menu (self) -> None: elif self._has_one_word_in_text_in_lower ( "пожаловаться", "жалоба", "жалобу", "отчёт", "отчет"): self._SESSIONAL_DATA["state"] = "sending_report" - self._OUTPUT_TEXT = "Я не знаю, на какую почту отправлять жалобу...\n" - self._OUTPUT_TEXT += "Может, на главное меню?" + self._OUTPUT_TEXT = "Если вы хотите пожаловаться, то сейчас просто скажите вашу жалобу. Я вас внимательно слушаю." self._BUTTONS.add_buttons ("На главное меню", "Пока!", hide_all = True) elif self._has_one_word_in_text_in_lower ( @@ -212,7 +176,8 @@ def _user_wants_to_hear_last_phrase (self) -> bool: return False def _say_last_phrase (self) -> None: - self._OUTPUT_TEXT = self._SESSIONAL_DATA["last_phrase"] + self._OUTPUT_TEXT = self._SESSIONAL_DATA["last_output_text"] + self._TEXT_TO_SPEECH = self._SESSIONAL_DATA["last_text_to_speech"] self._BUTTONS.BUTTONS = self._SESSIONAL_DATA["last_buttons"] @@ -227,6 +192,8 @@ def _working_with_user_outside_main_menu (self) -> None: self._start_next_lesson_or_not ( ) case "working_with_tasks": self._working_with_tasks ( ) + case "choosing_right_answer_for_task": + self._choosing_right_answer_for_task ( ) case "working_with_quest": self._working_with_quest ( ) case "choosing_right_answer_for_quest": @@ -235,12 +202,6 @@ def _working_with_user_outside_main_menu (self) -> None: self._viewing_quest_results ( ) case "sending_report": self._sending_report ( ) - case "choosing_between_solve_and_code": - self._choosing_between_solve_and_code() - case "wish_to_see_solve": - self.wish_to_see_solve() - case "wish_to_see_code": - self.wish_to_see_code() case "consulting": self._consulting ( ) @@ -330,51 +291,6 @@ def _user_wants_to_end_session (self) -> bool: else: return False - def _choosing_between_solve_and_code(self) -> None: - entering = ["Ха! Сдаётесь?", "Сдаётесь?", "Ну что, у вас получилось?", "Что скажете?", "Уже?"] - a = random.choice(entering) - if self._has_one_word_in_text_in_lower ("решение", "решению", "реши", "решил", "ответ", "решай", "отвечай", "решении", "ответе"): - self._OUTPUT_TEXT = a + "\nИтак, решение: " + self._SESSIONAL_DATA["solve"] + "\nХотите услышать код решения на Python?" - self._SESSIONAL_DATA["state"] = "wish_to_see_code" - elif self._has_one_word_in_text_in_lower ("код", "коды", "кода", "скрипт", "скрипты", "скрипта", "скрипте", "коде"): - self._OUTPUT_TEXT = a + "\nИтак, код: " + self._SESSIONAL_DATA["code"] + "\nХотите услышать объяснение?" - self._TEXT_TO_SPEECH = a + "Итак код. " + code_to_speech(self._SESSIONAL_DATA["code"]) + ".Хотите услышать объяснение?" - self._SESSIONAL_DATA["state"] = "wish_to_see_solve" - elif self._user_wants_to_go_to_main_menu: - self._go_to_main_menu ( ) - - elif self._user_wants_to_end_session: - self._end_the_session ( ) - - else: - self._OUTPUT_TEXT = get_apology_text ( ) - - def wish_to_see_code(self): - if self._has_one_word_in_text_in_lower ("да", "ага", "давай", "поехали", "ес", "погнали", "говори", "гони"): - self._OUTPUT_TEXT = "Итак, код: " + self._SESSIONAL_DATA["code"] + "\nХотите ещё задачу? Тогда просто назовите желаемую сложность." - self._TEXT_TO_SPEECH = "итак код. " + code_to_speech(self._SESSIONAL_DATA["code"]) + ".хотите ещё задачу? Тогда просто назовите желаемую сложность." - self._SESSIONAL_DATA["state"] = "working_with_tasks" - elif self._user_wants_to_go_to_main_menu: - self._go_to_main_menu ( ) - - elif self._user_wants_to_end_session: - self._end_the_session ( ) - - else: - self._OUTPUT_TEXT = get_apology_text ( ) - - def wish_to_see_solve(self): - if self._has_one_word_in_text_in_lower ("да", "ага", "давай", "поехали", "ес", "погнали", "говори", "гони"): - self._OUTPUT_TEXT = "Итак, решение: " + self._SESSIONAL_DATA["solve"] + "\nХотите ещё задачу? Тогда просто назовите желаемую сложность." - self._SESSIONAL_DATA["state"] = "working_with_tasks" - elif self._user_wants_to_go_to_main_menu: - self._go_to_main_menu ( ) - - elif self._user_wants_to_end_session: - self._end_the_session ( ) - - else: - self._OUTPUT_TEXT = get_apology_text ( ) def _user_has_not_listened_to_any_lesson (self) -> None: self._OUTPUT_TEXT = "Вы ещё не прошли ни одного урока.\n" @@ -487,32 +403,23 @@ def _working_with_tasks (self) -> None: if self._has_one_word_in_text_in_lower ( "лёгкий", "лёгкого", "лёгкому", "лёгким", "лёгком", "легкий", "легкого", "легкому", "легким", "легком"): + self._OUTPUT_TEXT = random.choice (("Хорошо, ", "Отлично, ", "Прекрасно, ")) + "тогда начнём?\n" self._SESSIONAL_DATA["difficulty_level_of_task"] = DifficultyLevels.EASY.value self._SESSIONAL_DATA["state"] = "choosing_between_solve_and_code" - self._save_text_and_solve_of_easy_task_in_session_data() - a = ['Хорошо', 'Итак', "Отлично", "Так-с", "Ага", "Замечательно", "Супер"] - self._OUTPUT_TEXT = random.choice(a)+", давайте приступим. Задача называется \""+self._SESSIONAL_DATA["title"]+"\".\nЧитаю условие: \""+self._SESSIONAL_DATA["task_text"]+"\"\nПопробуйте решить сами. Если захотите услышать решение или код, просто скажите мне \"Решение\" или \"Код\"." - elif self._has_one_word_in_text_in_lower ( "средний", "среднего", "среднему", "среднем", "средняя", "средней", "среднюю"): + self._OUTPUT_TEXT = random.choice (("Хорошо, ", "Отлично, ", "Прекрасно, ")) + "тогда начнём?\n" self._SESSIONAL_DATA["difficulty_level_of_task"] = DifficultyLevels.MEDIUM.value self._SESSIONAL_DATA["state"] = "choosing_between_solve_and_code" - self._save_text_and_solve_of_medium_task_in_session_data() - a = ['Хорошо', 'Итак', "Отлично", "Так-с", "Ага", "Замечательно", "Супер"] - self._OUTPUT_TEXT = random.choice(a)+", давайте приступим. Задача называется \""+self._SESSIONAL_DATA["title"]+"\".\nЧитаю условие: \""+self._SESSIONAL_DATA["task_text"]+"\"\nПопробуйте решить сами. Если захотите услышать решение или код, просто скажите мне \"Решение\" или \"Код\"." - elif self._has_one_word_in_text_in_lower ( "высокий", "высокого", "высокому", "высоким", "высоком", "сложный", "сложного", "сложному", "сложным", "сложном"): + self._OUTPUT_TEXT = random.choice (("Хорошо, ", "Отлично, ", "Прекрасно, ")) + "тогда начнём?\n" self._SESSIONAL_DATA["difficulty_level_of_task"] = DifficultyLevels.HARD.value self._SESSIONAL_DATA["state"] = "choosing_between_solve_and_code" - self._save_text_and_solve_of_hard_task_in_session_data() - a = ['Хорошо', 'Итак', "Отлично", "Так-с", "Ага", "Замечательно", "Супер"] - self._OUTPUT_TEXT = random.choice(a)+", давайте приступим. Задача называется \""+self._SESSIONAL_DATA["title"]+"\".\nЧитаю условие: \""+self._SESSIONAL_DATA["task_text"]+"\"\nПопробуйте решить сами. Если захотите услышать решение или код, просто скажите мне \"Решение\" или \"Код\"." - elif self._has_one_word_in_text_in_lower ( "случайный", "случайного", "случайному", "случайным", "случайном", @@ -520,11 +427,9 @@ def _working_with_tasks (self) -> None: "рандом", "рандома", "рандому", "рандомом", "рандоме", "рандомный", "рандомного", "рандомному", "рандомном", "рандомная", "рандомной", "рандомную"): + self._OUTPUT_TEXT = random.choice (("Хорошо, ", "Отлично, ", "Прекрасно, ")) + "\n" self._SESSIONAL_DATA["difficulty_level_of_task"] = DifficultyLevels.get_random_difficulty_level_for_task ( ) self._SESSIONAL_DATA["state"] = "choosing_between_solve_and_code" - self._save_text_and_solve_of_random_task_in_session_data() - a = ['Хорошо', 'Итак', "Отлично", "Так-с", "Ага", "Замечательно", "Супер"] - self._OUTPUT_TEXT = random.choice(a)+", давайте приступим. Задача называется \""+self._SESSIONAL_DATA["title"]+"\".\nЧитаю условие: \""+self._SESSIONAL_DATA["task_text"]+"\"\nПопробуйте решить сами. Если захотите услышать решение или код, просто скажите мне \"Решение\" или \"Код\"." elif self._has_one_word_in_text_in_lower ("результат", "результаты"): pass @@ -542,13 +447,6 @@ def _working_with_tasks (self) -> None: self._OUTPUT_TEXT = get_apology_text ( ) self._BUTTONS.add_buttons ("На главное меню", "Пока!", hide_all = True) - def _save_text_and_solve_of_random_task_in_session_data(self): - task_getter = TaskGetter ( ) - task = task_getter.get_random_task ( ) - self._SESSIONAL_DATA["title"] = task["title"] - self._SESSIONAL_DATA["text_of_task"] = task["task_text"] - self._SESSIONAL_DATA["solve"] = task["solve"] - self._SESSIONAL_DATA["code"] = task["code"] @save_last_phrase def _choosing_right_answer_for_task (self) -> None: @@ -642,38 +540,6 @@ def _save_text_and_correct_answer_of_hard_quest_in_session_data (self) -> None: self._SESSIONAL_DATA["correct_answer_of_quest"] = quest_getter.correct_answer_of_random_hard_quest #self._TEXT_TO_SPEECH = quest_getter.answers_to_speech_of_random_hard_quest_as_str - def _save_text_and_solve_of_easy_task_in_session_data (self) -> None: - task_getter = TaskGetter ( ) - task = task_getter.get_random_easy_task ( ) - self._SESSIONAL_DATA["title"] = task["title"] - self._SESSIONAL_DATA["text_of_task"] = task["task_text"] - self._SESSIONAL_DATA["solve"] = task["solve"] - self._SESSIONAL_DATA["code"] = task["code"] - - def _save_text_and_solve_of_medium_task_in_session_data (self) -> None: - task_getter = TaskGetter ( ) - task = task_getter.get_random_medium_task ( ) - self._SESSIONAL_DATA["title"] = task["title"] - self._SESSIONAL_DATA["text_of_task"] = task["task_text"] - self._SESSIONAL_DATA["solve"] = task["solve"] - self._SESSIONAL_DATA["code"] = task["code"] - - def _save_text_and_solve_of_hard_task_in_session_data (self) -> None: - task_getter = TaskGetter ( ) - task = task_getter.get_random_hard_task ( ) - self._SESSIONAL_DATA["title"] = task["title"] - self._SESSIONAL_DATA["text_of_task"] = task["task_text"] - self._SESSIONAL_DATA["solve"] = task["solve"] - self._SESSIONAL_DATA["code"] = task["code"] - - def _save_text_and_solve_of_very_hard_task_in_session_data (self) -> None: - task_getter = TaskGetter ( ) - task = task_getter.get_random_very_hard_task ( ) - self._SESSIONAL_DATA["title"] = task["title"] - self._SESSIONAL_DATA["text_of_task"] = task["task_text"] - self._SESSIONAL_DATA["solve"] = task["solve"] - self._SESSIONAL_DATA["code"] = task["code"] - def _save_text_and_correct_answer_of_quest_in_session_data (self, difficulty_level: int) -> None: match difficulty_level: case DifficultyLevels.EASY.value: @@ -687,12 +553,12 @@ def _save_text_and_correct_answer_of_quest_in_session_data (self, difficulty_lev def _say_that_user_can_change_their_difficulty_level_of_quest_if_it_is_not_said_yet (self) -> None: if not self._SESSIONAL_DATA["was_said_that_user_can_change_difficulty_level_in_quest"]: - text = [ + text = ( "В любой момент вы можете сменить уровень сложности, сказав: \"Хочу сменить сложность\";\n", "или выйти на главное меню, сказав: \"На главное меню\".\n", "Так же вы можете узнать количество правильно отвеченных вопросов, сказав: \"Покажи результаты\".\n", "Вот квест.\n\n" - ] + ) self._OUTPUT_TEXT += "".join (text) self._SESSIONAL_DATA["was_said_that_user_can_change_difficulty_level_in_quest"] = True @@ -756,12 +622,13 @@ def _choosing_right_answer_for_quest (self) -> None: def _correct_answer_of_quest_is_selected (self) -> None: text_that_says_answer_is_correct = get_text_that_says_answer_is_correct ( ) + "\n\n" - self._OUTPUT_TEXT = text_that_says_answer_is_correct + text_of_next_quest = self._get_text_of_current_quest ( ) + self._CARD = self._make_big_win_picture (title = text_that_says_answer_is_correct, description = text_of_next_quest) self._TEXT_TO_SPEECH = get_random_win_sound ( ) + text_that_says_answer_is_correct current_difficulty_level = self._SESSIONAL_DATA["difficulty_level_of_quest"] self._save_text_and_correct_answer_of_quest_in_session_data (current_difficulty_level) - self._OUTPUT_TEXT += self._get_text_of_current_quest ( ) - self._TEXT_TO_SPEECH += self._get_text_of_current_quest ( ) + self._TEXT_TO_SPEECH += text_of_next_quest + self._OUTPUT_TEXT = text_that_says_answer_is_correct + "\n" + text_of_next_quest self._SESSIONAL_DATA["number_of_correct_quest_answers"] += 1 self._BUTTONS.add_buttons (*self._buttons_for_choosing_correct_answer, hide_all = True) @@ -835,7 +702,8 @@ def _sending_report (self) -> None: elif self._user_wants_to_end_session: self._end_the_session ( ) else: - self._OUTPUT_TEXT = get_apology_text ( ) + email_sender = EmailSender ("leha.bondar.05@mail.ru", "Sstrelo4gGvip") + email_sender.send_email ("leha.bondar.2005@mail.ru", "Test theme", "Какой-то текст...") @save_last_phrase @@ -881,17 +749,39 @@ def _end_the_session (self) -> None: self._IS_END_SESSION = True - def get_response (self) -> dict: + def _make_big_win_picture (self, title: str, description: str) -> dict: return { - "version": self._VERSION, - "response": { - "text": self._OUTPUT_TEXT, - "tts": self._TEXT_TO_SPEECH, - "end_session": self._IS_END_SESSION, - "buttons": self._BUTTONS.BUTTONS}, - "session_state": self._SESSIONAL_DATA, - "user_state_update": self._INTERSESSIONAL_DATA - } + "type": "BigImage", + "image_id": get_random_bonus_picture ( ), + "title": title, + "description": description + } + + + def get_response (self) -> dict: + if self._CARD: + return { + "version": self._VERSION, + "response": { + "text": self._OUTPUT_TEXT, + "tts": self._TEXT_TO_SPEECH, + "end_session": self._IS_END_SESSION, + "buttons": self._BUTTONS.BUTTONS, + "card": self._CARD}, + "session_state": self._SESSIONAL_DATA, + "user_state_update": self._INTERSESSIONAL_DATA + } + else: + return { + "version": self._VERSION, + "response": { + "text": self._OUTPUT_TEXT, + "tts": self._TEXT_TO_SPEECH, + "end_session": self._IS_END_SESSION, + "buttons": self._BUTTONS.BUTTONS}, + "session_state": self._SESSIONAL_DATA, + "user_state_update": self._INTERSESSIONAL_DATA + } # Даже если self._TEXT_TO_SPEECH ничего не содержит (""), # то будет сказан текст, который написан в поле ["response"]["text"] diff --git a/main4.py b/main4.py new file mode 100644 index 0000000..5b3bc9e --- /dev/null +++ b/main4.py @@ -0,0 +1,952 @@ +import random + +from json_manager import * +from useful_functions import * +from quest_getter import QuestGetter +from lesson_getter import LessonGetter +from task_getter import TaskGetter +from buttons import Buttons +from enums import * + +from typing import Literal + +def code_to_speech(code: str) -> str: + REPLACEMENTS = { + ")": " скобка закрывается ", + "(": " скобка открывается ", + "*": " звёздочка ", + "'": " кавычки ", + '"': " кавычки ", + "{": " фигурная скобка открывается ", + "}": " фигурная скобка закрывается ", + ":": " двоеточие ", + "!": " восклицательный знак ", + ".": " точка ", + ",": " запятая ", + "[": " квадратная скобка открывается ", + "]": " квадратная скобка закрывается ", + "||": " две вертикальные линии (операция или) ", + ">": " больше ", + "<": " меньше ", + "/": " разделить ", + "-": " минус ", + "+": " плюс ", + "%": " процент ", + "@": " собачка ", + "&": " амперсанд " + } + + PAUSE = "sil <[250]>" + lines = code.split("\n") + formatted_lines = [] + for i, line in enumerate(lines, start=1): + formatted_line = line + for k in REPLACEMENTS.keys(): + formatted_line = formatted_line.replace(k, REPLACEMENTS[k]) + formatted_lines.append(f"{PAUSE} строка {i} {PAUSE} {formatted_line}") + return "\n".join(formatted_lines) + PAUSE + +class HandlerOfAlisa: + def __init__ (self, request: dict): + self._VERSION: str = request["version"] + self._TEXT_IN_LOWER: str = request["request"]["command"] + self._ORIGINAL_TEXT: str = request["request"]["original_utterance"] + self._WORDS_OF_TEXT_IN_LOWER: list = request["request"]["nlu"]["tokens"] + self._IS_FIRST_MESSAGE: bool = request["session"]["new"] + self._IS_END_SESSION: bool = False + # Заранее создаются сессионные и межсессионные данные + self._SESSIONAL_DATA: dict = create_sessional_data (request["state"]["session"]) + self._INTERSESSIONAL_DATA: dict = create_intersessional_data (request["state"]["user"]) + self._TEXT_TO_SPEECH = "" + self._CARD = { } + self._BUTTONS = Buttons ( ) + self._working_with_user ( ) + + + # Декоратор, сохраняющий посленюю фразу и кнопки в сессионных данных + def save_last_phrase (function: callable) -> callable: + def _wrapper (self, *args, **kwargs): + function (self, *args, **kwargs) + if self._TEXT_TO_SPEECH: + self._SESSIONAL_DATA["last_phrase"] = self._TEXT_TO_SPEECH + else: + self._SESSIONAL_DATA["last_phrase"] = self._OUTPUT_TEXT + self._SESSIONAL_DATA["last_buttons"] = self._BUTTONS.BUTTONS + return _wrapper + + + @save_last_phrase + def _working_with_user (self) -> None: + """Во время запуска навыка Алиса получает пустой текстовый запрос, + на который она тут же отвечает. Этот ответ мы воспринимаем + как первое сообщение (хотя оно уже по факту второе, но это неважно). + """ + # Абсолютно новый пользователь + if self._INTERSESSIONAL_DATA["new_user"]: + self._OUTPUT_TEXT = get_text_for_new_user ( ) + self._TEXT_TO_SPEECH = get_introduction_sound ( ) + get_text_for_new_user ( ) + "\n" + self._TEXT_TO_SPEECH += get_main_commands_of_skill ( ) + self._INTERSESSIONAL_DATA["new_user"] = False + self._BUTTONS.add_buttons_of_main_menu_in_text ( ) + + # Пользователь в главном меню впервые + elif self._user_is_in_main_menu and self._IS_FIRST_MESSAGE: + user_greeting = get_user_greeting ( ) + self._OUTPUT_TEXT = user_greeting + self._TEXT_TO_SPEECH = get_introduction_sound ( ) + user_greeting + self._TEXT_TO_SPEECH += get_main_commands_of_skill ( ) + self._BUTTONS.add_buttons_of_main_menu_in_text ( ) + + # Пользователь просто в главном меню + elif self._user_is_in_main_menu: + text_that_says_user_is_just_in_main_menu = get_text_that_says_user_is_just_in_main_menu ( ) + self._OUTPUT_TEXT = text_that_says_user_is_just_in_main_menu + self._TEXT_TO_SPEECH = text_that_says_user_is_just_in_main_menu + self._TEXT_TO_SPEECH += get_main_commands_of_skill ( ) + self._BUTTONS.add_buttons_of_main_menu_in_text ( ) + self._working_with_user_in_main_menu ( ) + + # Пользователь не в главном меню + else: + self._working_with_user_outside_main_menu ( ) + + @property + def _user_is_in_main_menu (self) -> bool: + if self._SESSIONAL_DATA["state"] == "in_main_menu": + return True + else: + return False + + + @save_last_phrase + def _working_with_user_in_main_menu (self) -> None: + self._BUTTONS.remove_all_buttons ( ) + self._TEXT_TO_SPEECH = "" + # Пока навык в разработке + if self._has_all_words_in_text_in_lower ("сбрось", "настройки") or \ + self._has_all_words_in_text_in_lower ("сбросить", "настройки"): + self._INTERSESSIONAL_DATA["new_user"] = True + self._INTERSESSIONAL_DATA["last_lesson"] = 0 + self._INTERSESSIONAL_DATA["last_task"] = 0 + self._OUTPUT_TEXT = "Настройки сброшены.\n" + self._OUTPUT_TEXT = "Перезагрузите навык." + + elif self._has_one_word_in_text_in_lower ( + "курс", "курса", "курсу", "курсом", "курсе"): + self._SESSIONAL_DATA["state"] = "working_with_course" + self._OUTPUT_TEXT = "Вы находитесь в меню Курса.\n" + self._OUTPUT_TEXT += "Здесь вы можете посмотреть список тем и выбрать любую,\n" + self._OUTPUT_TEXT += "можете продолжить последнюю или переслушать текущую." + self._BUTTONS.add_buttons (*self._commands_of_course, hide_all = False) + + elif self._has_one_word_in_text_in_lower ( + "задачка", "задачки", "задачку", "задачке", "задачкой", + "задача", "задачи", "задачу", "задаче", "задачей", + "задачек", "задачкам", "задачками", "задачках"): + # FIXME + self._SESSIONAL_DATA["state"] = "working_with_tasks" + self._OUTPUT_TEXT = "Какой уровень сложности вы хотите выбрать?\n" + self._TEXT_TO_SPEECH = self._OUTPUT_TEXT + self._TEXT_TO_SPEECH += ", ".join (self._difficulty_levels_of_course) + self._BUTTONS.add_buttons (*self._difficulty_levels_of_course, hide_all = False) + self._BUTTONS.add_buttons ("На главное меню", "Пока", hide_all = True) + + elif self._has_one_word_in_text_in_lower ( + "квест", "квеста", "квесту", "квестом", "квесте", + "квесты", "квестов", "квестам", "квестами", "квестах"): + self._SESSIONAL_DATA["state"] = "working_with_quest" + self._OUTPUT_TEXT = "Какой уровень сложности вы хотите выбрать?\n" + self._TEXT_TO_SPEECH = self._OUTPUT_TEXT + self._TEXT_TO_SPEECH += ", ".join (self._difficulty_levels_of_quest) + self._BUTTONS.add_buttons (*self._difficulty_levels_of_quest, hide_all = False) + self._BUTTONS.add_buttons ("Узнать мои результаты", "На главное меню", "Пока", hide_all = True) + + elif self._has_one_word_in_text_in_lower ( + "пожаловаться", "жалоба", "жалобу", "отчёт", "отчет"): + self._SESSIONAL_DATA["state"] = "sending_report" + self._OUTPUT_TEXT = "Я не знаю, на какую почту отправлять жалобу...\n" + self._OUTPUT_TEXT += "Может, на главное меню?" + self._BUTTONS.add_buttons ("На главное меню", "Пока!", hide_all = True) + + elif self._has_one_word_in_text_in_lower ( + "консультант", "консультанта", "консультанту", "консультантом", "консультанте" + "консультация", "консультации", "консультацию", "консультацией", "проконсультируй"): + self._SESSIONAL_DATA["state"] = "consulting" + self._OUTPUT_TEXT = "Пока я не могу вас проконсультировать, извините...\n" + self._OUTPUT_TEXT += "Может, на главное меню?" + self._BUTTONS.add_buttons ("На главное меню", "Пока!", hide_all = True) + + elif self._has_all_words_in_text_in_lower ("оцени", "знания"): + self._OUTPUT_TEXT = "Зачем \"Оцени мои знания\", когда есть \"Квест\"?\n" + self._OUTPUT_TEXT += "Скажи \"Квест\", чтобы его попробовать." + self._BUTTONS.add_buttons_of_main_menu_in_text ( ) + + elif self._user_wants_to_go_to_main_menu: + self._OUTPUT_TEXT = "Вы уже на главном меню!" + + elif self._user_wants_to_hear_last_phrase: + self._say_last_phrase ( ) + + elif self._user_wants_to_end_session: + self._end_the_session ( ) + + else: + self._OUTPUT_TEXT = get_apology_text ( ) + + @property + def _commands_of_course (self) -> tuple[str]: + return "Посмотреть список тем", "Текущая тема", "Продолжить последнюю", "Переслушать текущую", "На главное меню", "Пока!" + + @property + def _difficulty_levels_of_quest (self) -> tuple[str, str, str, str]: + return "Лёгкий", "Средний", "Высокий", "Случайный" + + @property + def _difficulty_levels_of_course (self) -> tuple[str, str, str, str, str]: + return "Лёгкий", "Средний", "Высокий", "Очень высокий", "Случайный" + + @property + def _user_wants_to_hear_last_phrase (self) -> bool: + if self._has_one_word_in_text_in_lower ("повтори", "повторить", "что", "чего"): + return True + else: + return False + + def _say_last_phrase (self) -> None: + self._OUTPUT_TEXT = self._SESSIONAL_DATA["last_phrase"] + self._BUTTONS.BUTTONS = self._SESSIONAL_DATA["last_buttons"] + + + @save_last_phrase + def _working_with_user_outside_main_menu (self) -> None: + match self._SESSIONAL_DATA["state"]: + case "working_with_course": + self._working_with_course ( ) + case "choosing_course_theme": + self._choosing_course_theme ( ) + case "start_next_lesson_or_not": + self._start_next_lesson_or_not ( ) + case "working_with_tasks": + self._working_with_tasks ( ) + case "working_with_quest": + self._working_with_quest ( ) + case "choosing_right_answer_for_quest": + self._choosing_right_answer_for_quest ( ) + case "viewing_quest_results": + self._viewing_quest_results ( ) + case "sending_report": + self._sending_report ( ) + case "choosing_between_solve_and_code": + self._choosing_between_solve_and_code() + case "wish_to_see_solve": + self.wish_to_see_solve() + case "wish_to_see_code": + self.wish_to_see_code() + case "consulting": + self._consulting ( ) + + + def _working_with_course (self) -> None: + lesson_getter = LessonGetter ( ) + current_lesson_theme = self._INTERSESSIONAL_DATA["current_lesson"] + current_lesson_subtheme = self._INTERSESSIONAL_DATA["current_sublesson"] + + if self._has_one_word_in_text_in_lower ("список", "списка", "списку", "списком", "списке") or \ + self._has_one_word_in_text_in_lower ("списки", "списка", "спискам", "списками", "списках"): + self._SESSIONAL_DATA["state"] = "choosing_course_theme" + self._OUTPUT_TEXT = "Список тем уроков:" + self._TEXT_TO_SPEECH = self._OUTPUT_TEXT + for lesson_theme in lesson_getter.themes: + self._BUTTONS.add_buttons (lesson_theme, hide_all = False) + self._TEXT_TO_SPEECH += lesson_theme + "\n" + self._BUTTONS.add_buttons ("Назад", "На главное меню", "Выход", hide_all = True) + + elif self._has_one_word_in_text_in_lower ("продолжить", "дальше", "далее"): + if current_lesson_theme: + next_subtheme = lesson_getter.get_name_of_next_subtheme (theme = current_lesson_theme, + subtheme = current_lesson_subtheme) + else: + next_subtheme = None + + if next_subtheme: + self._INTERSESSIONAL_DATA["current_sublesson"] = next_subtheme + self._OUTPUT_TEXT = lesson_getter.get_subtheme_text (theme = current_lesson_theme, + subtheme = next_subtheme) + self._BUTTONS.add_buttons ("Продолжить", "Переслушать", "Список тем", + "На главное меню", "Пока", hide_all = True) + elif not next_subtheme and current_lesson_subtheme: + self._TEXT_TO_SPEECH = get_random_sound_of_looking_results ( ) + self._CARD = self._make_big_bonus_picture (title = "Поздравляю! Вы прошли целый урок.", description = "Поздравляю! Вы прошли целый урок.\n" + "Следующий - это " + lesson_getter.get_name_of_next_theme (current_lesson_theme) + "\n" + "Хотите продолжить?") + self._TEXT_TO_SPEECH += "Поздравляю! Вы прошли целый урок.\n" + self._TEXT_TO_SPEECH += "Следующий - это " + lesson_getter.get_name_of_next_theme (current_lesson_theme) + "\n" + self._TEXT_TO_SPEECH += "Хотите продолжить?" + self._OUTPUT_TEXT = self._TEXT_TO_SPEECH + self._SESSIONAL_DATA["state"] = "start_next_lesson_or_not" + self._BUTTONS.add_buttons ("Да, хочу!", "Нет, позже.", hide_all = False) + self._BUTTONS.add_buttons ("На главное меню", "Пока", hide_all = True) + + else: + self._user_has_not_listened_to_any_lesson ( ) + + elif self._has_all_words_in_text_in_lower ("переслушать"): + if current_lesson_theme: + self._OUTPUT_TEXT = lesson_getter.get_subtheme_text (theme = current_lesson_theme, + subtheme = current_lesson_subtheme) + self._OUTPUT_TEXT += "\nСкажите: \"Продолжить\", чтобы продолжить." + self._BUTTONS.add_buttons ("Продолжить", "Переслушать", "Список тем", "Текущая тема", + "На главное меню", "Пока", hide_all = True) + else: + self._user_has_not_listened_to_any_lesson ( ) + + elif self._has_one_word_in_text_in_lower ("текущая", "текущую"): + if current_lesson_theme: + self._OUTPUT_TEXT = "Текущая тема урока: " + current_lesson_theme + "\n" + self._OUTPUT_TEXT += "Подтема: " + current_lesson_subtheme + "\n" + self._OUTPUT_TEXT += "Скажите, если хотите переслушать или продолжить." + self._BUTTONS.add_buttons ("Продолжить", "Переслушать", "На главное меню", "Пока", hide_all = True) + else: + self._user_has_not_listened_to_any_lesson ( ) + + elif self._user_wants_to_go_to_main_menu: + self._go_to_main_menu ( ) + + elif self._user_wants_to_hear_last_phrase: + self._say_last_phrase ( ) + + elif self._user_wants_to_end_session: + self._end_the_session ( ) + + else: + self._OUTPUT_TEXT = get_apology_text ( ) + self._BUTTONS.add_buttons ("На главное меню", "Пока!", hide_all = True) + + @property + def _user_wants_to_go_to_main_menu (self) -> bool: + if self._has_all_words_in_text_in_lower ("на", "главное", "меню"): + return True + else: + return False + + @property + def _user_wants_to_end_session (self) -> bool: + if self._has_one_word_in_text_in_lower ("выход", "выйти", "пока", "прощай"): + return True + else: + return False + + + def _choosing_between_solve_and_code(self) -> None: + entering = ["Ха! Сдаётесь?", "Сдаётесь?", "Ну что, у вас получилось?", "Что скажете?", "Уже?"] + a = random.choice(entering) + if self._has_one_word_in_text_in_lower ("решение", "решению", "реши", "решил", "ответ", "решай", "отвечай", "решении", "ответе"): + self._OUTPUT_TEXT = a + "\nИтак, решение: " + self._SESSIONAL_DATA["solve_of_task"] + "\nХотите услышать код решения на Python?" + self._SESSIONAL_DATA["state"] = "wish_to_see_code" + self._BUTTONS.add_buttons ("Да", "На главное меню", "Пока", hide_all = True) + + elif self._has_one_word_in_text_in_lower ("код", "коды", "кода", "скрипт", "скрипты", "скрипта", "скрипте", "коде"): + self._OUTPUT_TEXT = a + "\nИтак, код: " + self._SESSIONAL_DATA["code_of_task"] + "\nХотите услышать объяснение?" + self._TEXT_TO_SPEECH = a + "Итак код. " + code_to_speech(self._SESSIONAL_DATA["code_of_task"]) + ".Хотите услышать объяснение?" + self._SESSIONAL_DATA["state"] = "wish_to_see_solve" + self._BUTTONS.add_buttons ("Да", "На главное меню", "Пока", hide_all = True) + + elif self._user_wants_to_go_to_main_menu: + self._go_to_main_menu ( ) + + elif self._user_wants_to_hear_last_phrase: + self._say_last_phrase ( ) + + elif self._user_wants_to_end_session: + self._end_the_session ( ) + + else: + self._OUTPUT_TEXT = get_apology_text ( ) + + + def wish_to_see_code(self): + if self._has_one_word_in_text_in_lower ("да", "ага", "давай", "поехали", "ес", "погнали", "говори", "гони"): + self._OUTPUT_TEXT = "Итак, код: " + self._SESSIONAL_DATA["code_of_task"] + "\nХотите ещё задачу? Тогда просто назовите желаемую сложность." + self._TEXT_TO_SPEECH = "итак код. " + code_to_speech(self._SESSIONAL_DATA["code_of_task"]) + ".хотите ещё задачу? Тогда просто назовите желаемую сложность." + self._SESSIONAL_DATA["state"] = "working_with_tasks" + self._BUTTONS.add_buttons ("Лёгкий", "Средний", "Высокий", "Очень высокий", "Рандом", hide_all = False) + self._BUTTONS.add_buttons ("Повторить", "На главное меню", "Пока", hide_all = True) + + elif self._user_wants_to_go_to_main_menu: + self._go_to_main_menu ( ) + + elif self._user_wants_to_hear_last_phrase: + self._say_last_phrase ( ) + + elif self._user_wants_to_end_session: + self._end_the_session ( ) + + else: + self._OUTPUT_TEXT = get_apology_text ( ) + + + def wish_to_see_solve(self): + if self._has_one_word_in_text_in_lower ("да", "ага", "давай", "поехали", "ес", "погнали", "говори", "гони"): + self._OUTPUT_TEXT = "Итак, решение: " + self._SESSIONAL_DATA["solve_of_task"] + "\nХотите ещё задачу? Тогда просто назовите желаемую сложность." + self._SESSIONAL_DATA["state"] = "working_with_tasks" + self._BUTTONS.add_buttons ("Лёгкий", "Средний", "Высокий", "Очень высокий", "Рандом", hide_all = False) + self._BUTTONS.add_buttons ("Повторить", "На главное меню", "Пока", hide_all = True) + + elif self._user_wants_to_go_to_main_menu: + self._go_to_main_menu ( ) + + elif self._user_wants_to_hear_last_phrase: + self._say_last_phrase ( ) + + elif self._user_wants_to_end_session: + self._end_the_session ( ) + + else: + self._OUTPUT_TEXT = get_apology_text ( ) + + + def _user_has_not_listened_to_any_lesson (self) -> None: + self._OUTPUT_TEXT = "Вы ещё не прошли ни одного урока.\n" + self._OUTPUT_TEXT += "Скажите: \"Покажи список тем\", чтобы начать изучать курс." + self._BUTTONS.add_buttons ("Покажи список тем", "На главное меню", "Выход", hide_all = True) + + + @save_last_phrase + def _choosing_course_theme (self) -> None: + if self._has_one_word_in_text_in_lower ("1", "введение"): + self._start_next_lesson_and_sublesson (1) + + elif self._has_one_word_in_text_in_lower ("2", "устанока"): + self._start_next_lesson_and_sublesson (2) + + elif self._has_one_word_in_text_in_lower ("3", "основы"): + self._start_next_lesson_and_sublesson (3) + + elif self._has_one_word_in_text_in_lower ("4", "операторы", "выражения"): + self._start_next_lesson_and_sublesson (4) + + elif self._has_one_word_in_text_in_lower ("5"): + self._start_next_lesson_and_sublesson (5) + + elif self._has_one_word_in_text_in_lower ("6"): + self._start_next_lesson_and_sublesson (6) + + elif self._has_one_word_in_text_in_lower ("7"): + self._start_next_lesson_and_sublesson (7) + + elif self._has_one_word_in_text_in_lower ("8"): + self._start_next_lesson_and_sublesson (8) + + elif self._has_one_word_in_text_in_lower ("9"): + self._start_next_lesson_and_sublesson (9) + + elif self._has_one_word_in_text_in_lower ("10"): + self._start_next_lesson_and_sublesson (10) + + elif self._has_one_word_in_text_in_lower ("назад", "обратно"): + self._SESSIONAL_DATA["state"] = "working_with_course" + self._OUTPUT_TEXT = "Вы находитесь в меню Курса.\n" + self._OUTPUT_TEXT += "Здесь вы можете посмотреть список тем и выбрать любую,\n" + self._OUTPUT_TEXT += "можете продолжить последнюю или переслушать текущую." + self._BUTTONS.add_buttons (*self._commands_of_course, hide_all = False) + self._BUTTONS.add_buttons ("Покажи список тем", "На главное меню", "Выход", hide_all = True) + + elif self._user_wants_to_go_to_main_menu: + self._go_to_main_menu ( ) + + elif self._user_wants_to_hear_last_phrase: + self._say_last_phrase ( ) + + elif self._user_wants_to_end_session: + self._end_the_session ( ) + + else: + self._OUTPUT_TEXT = get_apology_text ( ) + + def _start_next_lesson_and_sublesson (self, theme_number: Literal[1, 2, 3, 4, 5]) -> None: + lesson_getter = LessonGetter ( ) + theme_number = theme_number - 1 # Первый урок под номером 0, а не 1 + self._SESSIONAL_DATA["state"] = "working_with_course" + self._INTERSESSIONAL_DATA["current_lesson"] = (name_of_current_theme := lesson_getter.themes[theme_number]) # Морожовый, он самый) + self._INTERSESSIONAL_DATA["current_sublesson"] = (name_of_current_subtheme := lesson_getter.get_first_subtheme_name (name_of_current_theme)) + self._OUTPUT_TEXT = random.choice (("Хорошо, ", "Отлично, ", "Прекрасно, ")) + "тогда начнём?" + "\n\n" + self._OUTPUT_TEXT += "Предисловие первого занятия:\n" + self._OUTPUT_TEXT += lesson_getter.get_subtheme_text (theme = name_of_current_theme, + subtheme = name_of_current_subtheme) + self._TEXT_TO_SPEECH = self._OUTPUT_TEXT + self._BUTTONS.add_buttons ("Далее", "Переслушать", "На главное меню", "Пока", hide_all = True) + + + @save_last_phrase + def _start_next_lesson_or_not (self) -> None: + old_lesson_theme = self._INTERSESSIONAL_DATA["current_lesson"] + lesson_getter = LessonGetter ( ) + next_lesson_theme = lesson_getter.get_name_of_next_theme (old_lesson_theme) + first_lesson_subtheme = lesson_getter.get_first_subtheme_name (next_lesson_theme) + self._INTERSESSIONAL_DATA["current_lesson"] = next_lesson_theme + self._INTERSESSIONAL_DATA["current_sublesson"] = first_lesson_subtheme + + if self._has_one_word_in_text_in_lower ("да", "конечно", "дальше", "далее"): + self._SESSIONAL_DATA["state"] = "working_with_course" + self._OUTPUT_TEXT = lesson_getter.get_subtheme_text (theme = next_lesson_theme, + subtheme = first_lesson_subtheme) + self._BUTTONS.add_buttons ("Далее", "Переслушать", "На главное меню", "Пока", hide_all = True) + + elif self._has_one_word_in_text_in_lower ("не", "нет", "позже", "потом"): + self._SESSIONAL_DATA["state"] = "working_with_course" + self._OUTPUT_TEXT = "Как хотите. В любой момент скажите просто скажите: \"Продолжить\"." + self._BUTTONS.add_buttons (*self._commands_of_course, hide_all = False) + + elif self._user_wants_to_go_to_main_menu: + self._go_to_main_menu ( ) + + elif self._user_wants_to_hear_last_phrase: + self._say_last_phrase ( ) + + elif self._user_wants_to_end_session: + self._end_the_session ( ) + + else: + self._OUTPUT_TEXT = get_apology_text ( ) + self._BUTTONS.add_buttons ("Да, хочу!", "Нет, позже.", hide_all = True) + + + def _working_with_tasks (self) -> None: + if self._has_one_word_in_text_in_lower ( + "лёгкий", "лёгкого", "лёгкому", "лёгким", "лёгком", + "легкий", "легкого", "легкому", "легким", "легком"): + self._SESSIONAL_DATA["difficulty_level_of_task"] = DifficultyLevels.EASY.value + self._SESSIONAL_DATA["state"] = "choosing_between_solve_and_code" + self._save_text_and_solve_of_easy_task_in_session_data() + a = ['Хорошо', 'Итак', "Отлично", "Так-с", "Ага", "Замечательно", "Супер"] + self._OUTPUT_TEXT = random.choice(a)+", давайте приступим. Задача называется \""+self._SESSIONAL_DATA["title_of_task"]+"\".\nЧитаю условие: \""+self._SESSIONAL_DATA["text_of_task"]+"\"\nПопробуйте решить сами.\nЕсли захотите услышать решение или код, просто скажите мне \"Решение\" или \"Код\"." + self._BUTTONS.add_buttons ("Устное решение", "Код", "Повторить", "На главное меню", "Пока", hide_all = True) + + + elif self._has_one_word_in_text_in_lower ( + "средний", "среднего", "среднему", "среднем", + "средняя", "средней", "среднюю"): + self._SESSIONAL_DATA["difficulty_level_of_task"] = DifficultyLevels.MEDIUM.value + self._SESSIONAL_DATA["state"] = "choosing_between_solve_and_code" + self._save_text_and_solve_of_medium_task_in_session_data() + a = ['Хорошо', 'Итак', "Отлично", "Так-с", "Ага", "Замечательно", "Супер"] + self._OUTPUT_TEXT = random.choice(a)+", давайте приступим. Задача называется \""+self._SESSIONAL_DATA["title_of_task"]+"\".\nЧитаю условие: \""+self._SESSIONAL_DATA["text_of_task"]+"\"\nПопробуйте решить сами.\nЕсли захотите услышать решение или код, просто скажите мне \"Решение\" или \"Код\"." + self._BUTTONS.add_buttons ("Устное решение", "Код", "Повторить", "На главное меню", "Пока", hide_all = True) + + + elif self._has_one_word_in_text_in_lower ( + "высокий", "высокого", "высокому", "высоким", "высоком", + "сложный", "сложного", "сложному", "сложным", "сложном"): + self._SESSIONAL_DATA["difficulty_level_of_task"] = DifficultyLevels.HARD.value + self._SESSIONAL_DATA["state"] = "choosing_between_solve_and_code" + self._save_text_and_solve_of_hard_task_in_session_data() + a = ['Хорошо', 'Итак', "Отлично", "Так-с", "Ага", "Замечательно", "Супер"] + self._OUTPUT_TEXT = random.choice(a)+", давайте приступим. Задача называется \""+self._SESSIONAL_DATA["title_of_task"]+"\".\nЧитаю условие: \""+self._SESSIONAL_DATA["text_of_task"]+"\"\nПопробуйте решить сами.\nЕсли захотите услышать решение или код, просто скажите мне \"Решение\" или \"Код\"." + self._BUTTONS.add_buttons ("Устное решение", "Код", "Повторить", "На главное меню", "Пока", hide_all = True) + + + elif self._has_one_word_in_text_in_lower ( + "случайный", "случайного", "случайному", "случайным", "случайном", + "случайная", "случайной", "случайную", + "рандом", "рандома", "рандому", "рандомом", "рандоме", + "рандомный", "рандомного", "рандомному", "рандомном", + "рандомная", "рандомной", "рандомную"): + self._SESSIONAL_DATA["difficulty_level_of_task"] = DifficultyLevels.get_random_difficulty_level_for_task ( ) + self._SESSIONAL_DATA["state"] = "choosing_between_solve_and_code" + self._save_text_and_solve_of_random_task_in_session_data() + a = ['Хорошо', 'Итак', "Отлично", "Так-с", "Ага", "Замечательно", "Супер"] + self._OUTPUT_TEXT = random.choice(a)+", давайте приступим. Задача называется \""+self._SESSIONAL_DATA["title_of_task"]+"\".\nЧитаю условие: \""+self._SESSIONAL_DATA["text_of_task"]+"\"\nПопробуйте решить сами.\nЕсли захотите услышать решение или код, просто скажите мне \"Решение\" или \"Код\"." + self._BUTTONS.add_buttons ("Устное решение", "Код", "Повторить", "На главное меню", "Пока", hide_all = True) + + elif self._user_wants_to_go_to_main_menu: + self._go_to_main_menu ( ) + + elif self._user_wants_to_hear_last_phrase: + self._say_last_phrase ( ) + + elif self._user_wants_to_end_session: + self._end_the_session ( ) + + else: + self._OUTPUT_TEXT = get_apology_text ( ) + self._BUTTONS.add_buttons ("На главное меню", "Пока!", hide_all = True) + + def _save_text_and_solve_of_random_task_in_session_data(self): + task_getter = TaskGetter ( ) + task = task_getter.get_random_task ( ) + self._SESSIONAL_DATA["title_of_task"] = task["title"] + self._SESSIONAL_DATA["text_of_task"] = task["task_text"] + self._SESSIONAL_DATA["solve_of_task"] = task["solve"] + self._SESSIONAL_DATA["code_of_task"] = task["code"] + + @save_last_phrase + def _choosing_right_answer_for_task (self) -> None: + # FIXME + if self._user_wants_to_go_to_main_menu: + self._go_to_main_menu ( ) + + elif self._user_wants_to_hear_last_phrase: + self._say_last_phrase ( ) + + elif self._user_wants_to_end_session: + self._end_the_session ( ) + + else: + self._OUTPUT_TEXT = get_apology_text ( ) + self._BUTTONS.add_buttons ("На главное меню", "Пока!", hide_all = True) + + + @save_last_phrase + def _working_with_quest (self) -> None: + if self._has_one_word_in_text_in_lower ( + "лёгкий", "лёгкого", "лёгкому", "лёгким", "лёгком", + "легкий", "легкого", "легкому", "легким", "легком"): + self._SESSIONAL_DATA["difficulty_level_of_quest"] = DifficultyLevels.EASY.value + self._save_text_and_correct_answer_of_easy_quest_in_session_data ( ) + self._show_quest ( ) + + elif self._has_one_word_in_text_in_lower ( + "средний", "среднего", "среднему", "среднем", + "средняя", "средней", "среднюю"): + self._SESSIONAL_DATA["difficulty_level_of_quest"] = DifficultyLevels.MEDIUM.value + self._save_text_and_correct_answer_of_medium_quest_in_session_data ( ) + self._show_quest ( ) + + elif self._has_one_word_in_text_in_lower ( + "высокий", "высокого", "высокому", "высоким", "высоком", + "сложный", "сложного", "сложному", "сложным", "сложном"): + self._SESSIONAL_DATA["difficulty_level_of_quest"] = DifficultyLevels.HARD.value + self._save_text_and_correct_answer_of_hard_quest_in_session_data ( ) + self._show_quest ( ) + + elif self._has_one_word_in_text_in_lower ( + "случайный", "случайного", "случайному", "случайным", "случайном", + "случайная", "случайной", "случайную", + "рандом", "рандома", "рандому", "рандомом", "рандоме", + "рандомный", "рандомного", "рандомному", "рандомном", + "рандомная", "рандомной", "рандомную"): + difficulty_level = DifficultyLevels.get_random_difficulty_level_for_quest ( ) + self._SESSIONAL_DATA["difficulty_level_of_quest"] = difficulty_level + self._save_text_and_correct_answer_of_quest_in_session_data (difficulty_level) + self._show_quest ( ) + + elif self._has_one_word_in_text_in_lower ("результат", "результаты"): + self._show_results_of_quest_and_next_quest ( ) + + elif self._user_wants_to_go_to_main_menu: + self._go_to_main_menu ( ) + + elif self._user_wants_to_hear_last_phrase: + self._say_last_phrase ( ) + + elif self._user_wants_to_end_session: + self._end_the_session ( ) + + else: + self._OUTPUT_TEXT = get_apology_text ( ) + self._BUTTONS.add_buttons (*self._buttons_for_choosing_difficutly_level, hide_all = True) + + @property + def _buttons_for_choosing_difficutly_level (self) -> dict: + return "Лёгкий", "Средний", "Высокий", "Случайный", "Узнать мои результаты", "На главное меню", "Пока!" + + def _save_text_and_correct_answer_of_easy_quest_in_session_data (self) -> None: + quest_getter = QuestGetter ( ) + quest_getter.save_random_easy_quest ( ) + self._SESSIONAL_DATA["text_of_quest"] = quest_getter.prepared_text_of_random_easy_quest + self._SESSIONAL_DATA["correct_answer_of_quest"] = quest_getter.correct_answer_of_random_easy_quest + #self._TEXT_TO_SPEECH = quest_getter.answers_to_speech_of_random_easy_quest_as_str + + def _save_text_and_correct_answer_of_medium_quest_in_session_data (self) -> None: + quest_getter = QuestGetter ( ) + quest_getter.save_random_medium_quest ( ) + self._SESSIONAL_DATA["text_of_quest"] = quest_getter.prepared_text_of_random_medium_quest + self._SESSIONAL_DATA["correct_answer_of_quest"] = quest_getter.correct_answer_of_random_medium_quest + #self._TEXT_TO_SPEECH = quest_getter.answers_to_speech_of_random_medium_quest_as_str + + def _save_text_and_correct_answer_of_hard_quest_in_session_data (self) -> None: + quest_getter = QuestGetter ( ) + quest_getter.save_random_hard_quest ( ) + self._SESSIONAL_DATA["text_of_quest"] = quest_getter.prepared_text_of_random_hard_quest + self._SESSIONAL_DATA["correct_answer_of_quest"] = quest_getter.correct_answer_of_random_hard_quest + #self._TEXT_TO_SPEECH = quest_getter.answers_to_speech_of_random_hard_quest_as_str + + def _save_text_and_solve_of_easy_task_in_session_data (self) -> None: + task_getter = TaskGetter ( ) + task = task_getter.get_random_easy_task ( ) + self._SESSIONAL_DATA["title_of_task"] = task["title"] + self._SESSIONAL_DATA["text_of_task"] = task["task_text"] + self._SESSIONAL_DATA["solve_of_task"] = task["solve"] + self._SESSIONAL_DATA["code_of_task"] = task["code"] + + def _save_text_and_solve_of_medium_task_in_session_data (self) -> None: + task_getter = TaskGetter ( ) + task = task_getter.get_random_medium_task ( ) + self._SESSIONAL_DATA["title_of_task"] = task["title"] + self._SESSIONAL_DATA["text_of_task"] = task["task_text"] + self._SESSIONAL_DATA["solve_of_task"] = task["solve"] + self._SESSIONAL_DATA["code_of_task"] = task["code"] + + def _save_text_and_solve_of_hard_task_in_session_data (self) -> None: + task_getter = TaskGetter ( ) + task = task_getter.get_random_hard_task ( ) + self._SESSIONAL_DATA["title_of_task"] = task["title"] + self._SESSIONAL_DATA["text_of_task"] = task["task_text"] + self._SESSIONAL_DATA["solve_of_task"] = task["solve"] + self._SESSIONAL_DATA["code_of_task"] = task["code"] + + def _save_text_and_solve_of_task_of_very_hard_task_in_session_data (self) -> None: + task_getter = TaskGetter ( ) + task = task_getter.get_random_very_hard_task ( ) + self._SESSIONAL_DATA["title_of_task"] = task["title"] + self._SESSIONAL_DATA["text_of_task"] = task["task_text"] + self._SESSIONAL_DATA["solve_of_task"] = task["solve"] + self._SESSIONAL_DATA["code_of_task"] = task["code"] + + def _save_text_and_correct_answer_of_quest_in_session_data (self, difficulty_level: int) -> None: + match difficulty_level: + case DifficultyLevels.EASY.value: + self._save_text_and_correct_answer_of_easy_quest_in_session_data ( ) + case DifficultyLevels.MEDIUM.value: + self._save_text_and_correct_answer_of_medium_quest_in_session_data ( ) + case DifficultyLevels.HARD.value: + self._save_text_and_correct_answer_of_hard_quest_in_session_data ( ) + case _: + raise ValueError ("Указан неправильный уровень сложности!") + + def _say_that_user_can_change_their_difficulty_level_of_quest_if_it_is_not_said_yet (self) -> None: + if not self._SESSIONAL_DATA["was_said_that_user_can_change_difficulty_level_in_quest"]: + text = [ + "В любой момент вы можете сменить уровень сложности, сказав: \"Хочу сменить сложность\";\n", + "или выйти на главное меню, сказав: \"На главное меню\".\n", + "Так же вы можете узнать количество правильно отвеченных вопросов, сказав: \"Покажи результаты\".\n", + "Вот квест.\n\n" + ] + self._OUTPUT_TEXT += "".join (text) + self._SESSIONAL_DATA["was_said_that_user_can_change_difficulty_level_in_quest"] = True + + def _get_text_of_current_quest (self) -> str: + return self._SESSIONAL_DATA["text_of_quest"] + + @property + def _buttons_for_choosing_correct_answer (self) -> dict: + return "Первое", "Второе", "Третье", "Изменить уровень сложности", "Узнать мои результаты", "На главное меню", "Пока!" + + def _show_quest (self) -> None: + self._SESSIONAL_DATA["state"] = "choosing_right_answer_for_quest" + self._OUTPUT_TEXT = random.choice (("Хорошо.", "Отлично.", "Прекрасно.")) + "\n\n" + self._say_that_user_can_change_their_difficulty_level_of_quest_if_it_is_not_said_yet ( ) + self._OUTPUT_TEXT += self._get_text_of_current_quest ( ) + self._BUTTONS.add_buttons (*self._buttons_for_choosing_correct_answer, hide_all = True) + + + @save_last_phrase + def _choosing_right_answer_for_quest (self) -> None: + if self._has_one_word_in_text_in_lower ("1", "один", "первый", "первое"): + if self._SESSIONAL_DATA["correct_answer_of_quest"] == 1: + self._correct_answer_of_quest_is_selected ( ) + else: + self._wrong_answer_of_quest_is_selected ( ) + + elif self._has_one_word_in_text_in_lower ("2", "два", "второй", "второе"): + if self._SESSIONAL_DATA["correct_answer_of_quest"] == 2: + self._correct_answer_of_quest_is_selected ( ) + else: + self._wrong_answer_of_quest_is_selected ( ) + + elif self._has_one_word_in_text_in_lower ("3", "три", "третий", "третье"): + if self._SESSIONAL_DATA["correct_answer_of_quest"] == 3: + self._correct_answer_of_quest_is_selected ( ) + else: + self._wrong_answer_of_quest_is_selected ( ) + + elif self._has_all_words_in_text_in_lower ("уровень", "сложности") or \ + self._has_one_word_in_text_in_lower ("сложность"): + self._SESSIONAL_DATA["state"] = "working_with_quest" + self._OUTPUT_TEXT = random.choice (("Хорошо.", "Отлично.")) + "\n" + self._OUTPUT_TEXT += "Теперь просто скажите нужный уровень сложности." + self._BUTTONS.add_buttons (*self._buttons_for_choosing_difficutly_level, hide_all = True) + + elif self._has_one_word_in_text_in_lower ("результат", "результаты"): + self._show_results_of_quest_and_next_quest ( ) + + elif self._user_wants_to_go_to_main_menu: + self._go_to_main_menu ( ) + + elif self._user_wants_to_hear_last_phrase: + self._say_last_phrase ( ) + + elif self._user_wants_to_end_session: + self._end_the_session ( ) + + else: + self._OUTPUT_TEXT = get_text_that_says_there_is_no_answer_like_that ( ) + self._BUTTONS.add_buttons (*self._buttons_for_choosing_correct_answer, hide_all = True) + + def _correct_answer_of_quest_is_selected (self) -> None: + text_that_says_answer_is_correct = get_text_that_says_answer_is_correct ( ) + "\n\n" + self._OUTPUT_TEXT = text_that_says_answer_is_correct + self._TEXT_TO_SPEECH = get_random_win_sound ( ) + text_that_says_answer_is_correct + current_difficulty_level = self._SESSIONAL_DATA["difficulty_level_of_quest"] + self._save_text_and_correct_answer_of_quest_in_session_data (current_difficulty_level) + self._OUTPUT_TEXT += self._get_text_of_current_quest ( ) + self._TEXT_TO_SPEECH += self._get_text_of_current_quest ( ) + self._SESSIONAL_DATA["number_of_correct_quest_answers"] += 1 + self._BUTTONS.add_buttons (*self._buttons_for_choosing_correct_answer, hide_all = True) + + def _show_results_of_quest_and_next_quest (self) -> None: + correct_quest_answers = int (self._SESSIONAL_DATA["number_of_correct_quest_answers"]) + wrong_quest_answers = int (self._SESSIONAL_DATA["number_of_wrong_quest_answers"]) + if correct_quest_answers and wrong_quest_answers: + self._OUTPUT_TEXT = f"Количество правильных ответов: {correct_quest_answers}.\n" + self._OUTPUT_TEXT += f"Количество неправильных ответов: {wrong_quest_answers}.\n" + python_knowledge = calculate_python_knowledge (correct_quest_answers, wrong_quest_answers) + self._OUTPUT_TEXT += f"Ваше знание Python: {python_knowledge}%." + self._SESSIONAL_DATA["state"] = "viewing_quest_results" + self._BUTTONS.add_buttons ("Продолжить квест", "На главное меню", "Пока", hide_all = True) + + elif not correct_quest_answers and wrong_quest_answers: + self._OUTPUT_TEXT = "Жаль, но у вас нет ни одного правильного ответа на квест." + self._SESSIONAL_DATA["state"] = "viewing_quest_results" + self._BUTTONS.add_buttons ("Продолжить квест", "На главное меню", "Пока", hide_all = True) + + elif correct_quest_answers and not wrong_quest_answers: + self._OUTPUT_TEXT = "Все ваши ответы верны! Похоже, вы профессиональный программист!" + self._SESSIONAL_DATA["state"] = "viewing_quest_results" + self._BUTTONS.add_buttons ("Продолжить квест", "На главное меню", "Пока", hide_all = True) + + else: + self._OUTPUT_TEXT = "Пока вы не ответили ни на один квест." + self._make_all_sessional_data_false ( ) + self._BUTTONS.add_buttons_of_main_menu_in_text ( ) + + self._TEXT_TO_SPEECH = get_random_sound_of_looking_results ( ) + self._OUTPUT_TEXT + + + def _wrong_answer_of_quest_is_selected (self) -> None: + self._OUTPUT_TEXT = get_text_that_says_answer_is_wrong ( ) + self._TEXT_TO_SPEECH = get_random_lose_sound ( ) + self._OUTPUT_TEXT + self._SESSIONAL_DATA["number_of_wrong_quest_answers"] += 1 + self._BUTTONS.add_buttons (*self._buttons_for_choosing_correct_answer, hide_all = True) + + + @save_last_phrase + def _viewing_quest_results (self) -> None: + if self._has_one_word_in_text_in_lower ("продолжить"): + self._SESSIONAL_DATA["state"] = "choosing_right_answer_for_quest" + current_difficulty_level = self._SESSIONAL_DATA["difficulty_level_of_quest"] + self._save_text_and_correct_answer_of_quest_in_session_data (current_difficulty_level) + self._OUTPUT_TEXT = self._get_text_of_current_quest ( ) + self._BUTTONS.add_buttons (*self._buttons_for_choosing_correct_answer, hide_all = True) + + elif self._user_wants_to_go_to_main_menu: + self._go_to_main_menu ( ) + + elif self._user_wants_to_hear_last_phrase: + self._say_last_phrase ( ) + + elif self._user_wants_to_end_session: + self._end_the_session ( ) + + else: + self._OUTPUT_TEXT = get_apology_text ( ) + self._BUTTONS.add_buttons ("Продолжить квест", "На главное меню", "Пока", hide_all = True) + + + @save_last_phrase + def _sending_report (self) -> None: + # Доработать # FIXME + self._BUTTONS.add_buttons ("На главное меню", "Пока!", hide_all = True) + if self._user_wants_to_go_to_main_menu: + self._go_to_main_menu ( ) + elif self._user_wants_to_hear_last_phrase: + self._say_last_phrase ( ) + elif self._user_wants_to_end_session: + self._end_the_session ( ) + else: + self._OUTPUT_TEXT = get_apology_text ( ) + + + @save_last_phrase + def _consulting (self) -> None: + # Доработать # FIXME + self._BUTTONS.add_buttons ("На главное меню", "Пока!", hide_all = True) + if self._user_wants_to_go_to_main_menu: + self._go_to_main_menu ( ) + + elif self._user_wants_to_hear_last_phrase: + self._say_last_phrase ( ) + elif self._user_wants_to_end_session: + self._end_the_session ( ) + else: + self._OUTPUT_TEXT = get_apology_text ( ) + + + def _has_all_words_in_text_in_lower (self, *words) -> bool: + """Есть ли все слова в ответе пользователя?""" + for word in words: + if not word in self._WORDS_OF_TEXT_IN_LOWER: + return False + return True + + def _has_one_word_in_text_in_lower (self, *words) -> bool: + """Есть ли хоть одно слово в ответе пользователя?""" + for word in words: + if word in self._WORDS_OF_TEXT_IN_LOWER: + return True + return False + + + def _go_to_main_menu (self) -> None: + self._OUTPUT_TEXT = get_text_that_says_user_is_just_in_main_menu ( ) + self._TEXT_TO_SPEECH = get_text_that_says_user_is_just_in_main_menu ( ) + self._TEXT_TO_SPEECH += get_main_commands_of_skill ( ) + self._SESSIONAL_DATA["state"] = "in_main_menu" + self._BUTTONS.add_buttons_of_main_menu_in_text ( ) + + + def _end_the_session (self) -> None: + self._OUTPUT_TEXT = get_farewell_text ( ) + self._IS_END_SESSION = True + + + def _make_big_bonus_picture (self, title: str, description: str) -> dict: + return { + "type": "BigImage", + "image_id": get_random_bonus_picture ( ), + "title": title, + "description": description + } + + + def get_response (self) -> dict: + if self._CARD: + return { + "version": self._VERSION, + "response": { + "text": self._OUTPUT_TEXT, + "tts": self._TEXT_TO_SPEECH, + "end_session": self._IS_END_SESSION, + "buttons": self._BUTTONS.BUTTONS, + "card": self._CARD}, + "session_state": self._SESSIONAL_DATA, + "user_state_update": self._INTERSESSIONAL_DATA + } + else: + return { + "version": self._VERSION, + "response": { + "text": self._OUTPUT_TEXT, + "tts": self._TEXT_TO_SPEECH, + "end_session": self._IS_END_SESSION, + "buttons": self._BUTTONS.BUTTONS}, + "session_state": self._SESSIONAL_DATA, + "user_state_update": self._INTERSESSIONAL_DATA + } + # Даже если self._TEXT_TO_SPEECH ничего не содержит (""), + # то будет сказан текст, который написан в поле ["response"]["text"] + + + +# Функция, вызываемая Яндексом для запуска скрипта Алисы (в коде вызывать её не нужно). +def main (request_from_alisa: dict, context) -> dict: + handler_of_alisa = HandlerOfAlisa (request_from_alisa) + return handler_of_alisa.get_response ( ) \ No newline at end of file diff --git a/quest_getter.py b/quest_getter.py index 94ff83e..6c10232 100644 --- a/quest_getter.py +++ b/quest_getter.py @@ -77,7 +77,7 @@ def correct_answer_of_random_easy_quest (self) -> Literal[1, 2, 3]: @property def answers_of_random_easy_quest_as_str (self) -> list[str]: - return ", ".join (self.saved_random_easy_quest["answers"] ) + return "\n".join (self.saved_random_easy_quest["answers"] ) @property def answers_to_speech_of_random_easy_quest (self) -> list[str]: @@ -101,7 +101,7 @@ def correct_answer_of_random_medium_quest (self) -> Literal[1, 2, 3]: @property def answers_of_random_medium_quest_as_str (self) -> list[str]: - return ", ".join (self.saved_random_medium_quest["answers"] ) + return "\n".join (self.saved_random_medium_quest["answers"] ) @property def answers_to_speech_of_random_medium_quest (self) -> list[str]: @@ -125,7 +125,7 @@ def correct_answer_of_random_hard_quest (self) -> Literal[1, 2, 3]: @property def answers_of_random_hard_quest_as_str (self) -> list[str]: - return ", ".join (self.saved_random_hard_quest["answers"] ) + return "\n".join (self.saved_random_hard_quest["answers"] ) @property def answers_to_speech_of_random_hard_quest (self) -> list[str]: diff --git a/task_getter.py b/task_getter.py index 3d3db28..4812d37 100644 --- a/task_getter.py +++ b/task_getter.py @@ -50,6 +50,4 @@ def get_random_hard_task (self) -> dict[str, str]: return random.choice (self.hard_tasks) def get_random_very_hard_task (self) -> dict[str, str]: - return random.choice (self.very_hard_tasks) - def get_random_task(self): - return random.choice(self.all_tasks) \ No newline at end of file + return random.choice (self.very_hard_tasks) \ No newline at end of file diff --git a/texts_for_users.json b/texts_for_users.json index 76f05ef..3ee0a26 100644 --- a/texts_for_users.json +++ b/texts_for_users.json @@ -119,5 +119,18 @@ ], "sound_of_looking_results": [ "" + ], + "big_win_pictures": [ + "965417/7161a486d1e7e0670ec5", + "213044/db4371540b8acfcb6317", + "937455/60c021bd3b03311e07c3", + "213044/eb8fd3fd258b4d6f44aa", + "213044/33d58e43a4a48fe10a7d" + ], + "bonus_pictures": [ + "997614/a46a6eeb5da6e2fc4082", + "997614/e29905186dfd5971e3d3", + "213044/e4dde40f438b8fded539", + "1540737/2fef8f86192b49200d8b" ] } \ No newline at end of file diff --git a/useful_functions.py b/useful_functions.py index 17db0bc..4aa60c6 100644 --- a/useful_functions.py +++ b/useful_functions.py @@ -1,13 +1,12 @@ from json_manager import * - - def create_sessional_data (sessional_data: dict) -> dict: if sessional_data == { }: # То есть это первое сообщение return { "state": "in_main_menu", - "last_phrase": "", + "last_output_text": "", + "last_text_to_speech": "", "last_buttons": [ ], "text_of_quest": "", "correct_answer_of_quest": 0, From d647ee84bb548fc65cfa83d5a804ac992a79205f Mon Sep 17 00:00:00 2001 From: TchTech <67865526+TchTech@users.noreply.github.com> Date: Mon, 27 Mar 2023 00:10:37 +0300 Subject: [PATCH 21/31] smth --- lessons.json | 311 +++++++++++++++++++++++++++------------------------ main4.py | 9 +- 2 files changed, 172 insertions(+), 148 deletions(-) diff --git a/lessons.json b/lessons.json index bb93462..c91bb38 100644 --- a/lessons.json +++ b/lessons.json @@ -1,160 +1,177 @@ + { - "Урок 1: Введение в Python": { - "Предисловие": "Python – простой и минималистичный язык. Чтение хорошей программы на Python очень напоминает чтение английского текста, хотя и достаточно строгого! Такая псевдо-кодовая природа Python является одной из его самых сильных сторон. Она позволяет вам сосредоточиться на решении задачи, а не на самом языке.", - "Python - Язык высокого уровня": "При написании программы на Python вам никогда не придётся отвлекаться на такие низкоуровневые детали, как управление памятью, используемой вашей программой, и т.п.", - "Python - Язык объектно-ориентированный": "Python поддерживает как процедурно-ориентированное, так и объектноориентированное программирование. В процедурно-ориентированных языках программы строятся на основе процедур или функций, которые представляют собой просто-напросто многократно используемые фрагменты программы. В объектно-ориентированных языках программирования программы строятся на основе объектов, объединяющих в себе данные и функционал. \n\n__Python предоставляет простые, но мощные средства для ООП, особенно в сравнении с такими большими языками программирования, как C++ или Java.__" , - "Python - Язык встраиваемый": "В Python можно встраивать в программы на C/C++, чтобы предоставлять возможности написания сценариев их пользователям." + "Урок 0: Введение в Python": { + "0": " ** Предисловие ** \n\nPython – простой и минималистичный язык. Чтение хорошей программы на Python очень напоминает чтение английского текста, хотя и достаточно строгого! Такая псевдо-кодовая природа Python является одной из его самых сильных сторон. Она позволяет вам сосредоточиться на решении задачи, а не на самом языке.", + "1": " ** Python - Язык высокого уровня ** \n\nПри написании программы на Python вам никогда не придётся отвлекаться на такие низкоуровневые детали, как управление памятью, используемой вашей программой, и т.п.", + "2": " ** Python - Язык объектно-ориентированный ** \n\nPython поддерживает как процедурно-ориентированное, так и объектноориентированное программирование. В процедурно-ориентированных языках программы строятся на основе процедур или функций, которые представляют собой просто-напросто многократно используемые фрагменты программы. В объектно-ориентированных языках программирования программы строятся на основе объектов, объединяющих в себе данные и функционал. \n\n__Python предоставляет простые, но мощные средства для ООП, особенно в сравнении с такими большими языками программирования, как C++ или Java.__" , + "3": " ** Python - Язык встраиваемый ** \n\nВ Python можно встраивать в программы на C/C++, чтобы предоставлять возможности написания сценариев их пользователям." }, - "Урок 2: Установка Python": { - "Предисловие": "Итак для того чтобы нам начать писать код нужно установть сам Python, а так же редактор для него ", - "Установка в Windows": "Посетите страницу http://www.python.org/download/ и загрузите последнюю версию. Установка производится так же, как и для любых других программ для Windows.", - "Выбор редактора": "Поскольку мы не можем набирать программу в командной т.к, нам понадобится сохранять программы в файлах. \n\nИтак нам нужен редактор для работы с файлами программ. Выбор редактора крайне важен. Хороший редактор поможет вам легко писать программы на Python, делая ваше путешествие более комфортным, а также позволяя быстрее и безопаснее достичь вашей цели. \n\nОдно из самых основных требований – это __подсветка синтаксиса__, когда разные элементы программы на Python раскрашены так, чтобы вы могли легко видеть вашу программу и ход её выполнения. \n\nЕсли вы не знаете, с чего начать, мы бы порекомендовали вам пользоваться программой PyCharm", - "Создание проекта": "Запустите выбранный вами редактор, введите следующую программу и сохраните её под именем helloworld.py . \n\nЕсли вы пользуетесь PyCharm, нажмите «New Project» → «выберете путь где будут хранится ваши программы» → «создавайте проект!»" + "Урок 1: Установка Python": { + "0": " ** Предисловие ** \n\nИтак для того чтобы нам начать писать код нужно установть сам Python, а так же редактор для него ", + "1": " ** Установка в Windows ** \n\nПосетите страницу http://www.python.org/download/ и загрузите последнюю версию. Установка производится так же, как и для любых других программ для Windows.", + "2": " ** Выбор редактора ** \n\nПоскольку мы не можем набирать программу в командной т.к, нам понадобится сохранять программы в файлах. \n\nИтак нам нужен редактор для работы с файлами программ. Выбор редактора крайне важен. Хороший редактор поможет вам легко писать программы на Python, делая ваше путешествие более комфортным, а также позволяя быстрее и безопаснее достичь вашей цели. \n\nОдно из самых основных требований – это __подсветка синтаксиса__, когда разные элементы программы на Python раскрашены так, чтобы вы могли легко видеть вашу программу и ход её выполнения. \n\nЕсли вы не знаете, с чего начать, мы бы порекомендовали вам пользоваться программой PyCharm", + "3": " ** Создание проекта ** \n\nЗапустите выбранный вами редактор, введите следующую программу и сохраните её под именем helloworld.py . \n\nЕсли вы пользуетесь PyCharm, нажмите «New Project» → «выберете путь где будут хранится ваши программы» → «создавайте проект!»" }, - "Урок 3: Основы": { - "Предисловие": "Python – это, один из немногих языков программирования, простых в освоении и одновременно мощных. \n\nЭто очень важно и для начинающих, и для специалистов, но что ещё важнее – на нём приятно программировать.", - "Комментарии": "Комментарии – это то, что пишется после символа #, и представляет интерес лишь как заметка для читающего программу. \n\nНапример: \nprint(Привет, Мир!) # print -- это функция", - "Строка": "Строка – это последовательность символов. Чаще всего строки – это просто некоторые наборы слов. \n\nСлова могут быть как на английском языке, так и на любом другом, поддерживаемом стандартом Unicode, что означает почти на любом языке мира.", - "Одинарные кавычки": "Строку можно указать, используя одинарные кавычки, как например, 'Фраза в кавычках'. Все пробелы и знаки табуляции сохранятся, как есть.", - "Двойные кавычки": "Строки в двойных кавычках работают точно так же, как и в одинарных. Например,\"Как тебя зовут?\".", - "Типы данных": "Переменные могут хранить значения разных типов, называемых типами данных. Основными типами являются числа и строки, о которых мы уже говорили. В дальнейших главах мы увидим, как создавать свои собственные типы при помощи классов.", - "Переменные": "Использование одних лишь литеральных констант может скоро наскучить – нам ведь нужен способ хранения любой информации и манипулирования ею. Вот здесь на сцену выходят переменные. Слово «переменные» говорит само за себя – их значение может меняться, а значит, вы можете хранить в переменной всё, что угодно. \n\nПеременные – это просто области памяти компьютера, в которых вы храните некоторую информацию. В отличие от констант, к такой информации нужно каким-то образом получать доступ, поэтому переменным даются имена." + "Урок 2: Основы": { + "0": " ** Предисловие ** \n\nPython – это, один из немногих языков программирования, простых в освоении и одновременно мощных. \n\nЭто очень важно и для начинающих, и для специалистов, но что ещё важнее – на нём приятно программировать.", + "1": " ** Комментарии ** \n\nКомментарии – это то, что пишется после символа #, и представляет интерес лишь как заметка для читающего программу. \n\nНапример: \nprint(Привет, Мир!) # print -- это функция", + "2": " ** Строка ** \n\nСтрока – это последовательность символов. Чаще всего строки – это просто некоторые наборы слов. \n\nСлова могут быть как на английском языке, так и на любом другом, поддерживаемом стандартом Unicode, что означает почти на любом языке мира.", + "3": " ** Одинарные кавычки ** \n\nСтроку можно указать, используя одинарные кавычки, как например, 'Фраза в кавычках'. Все пробелы и знаки табуляции сохранятся, как есть.", + "4": " ** Двойные кавычки ** \n\nСтроки в двойных кавычках работают точно так же, как и в одинарных. Например,\"Как тебя зовут?\".", + "5": " ** Типы данных ** \n\nПеременные могут хранить значения разных типов, называемых типами данных. Основными типами являются числа и строки, о которых мы уже говорили. В дальнейших главах мы увидим, как создавать свои собственные типы при помощи классов.", + "6": " ** Переменные ** \n\nИспользование одних лишь литеральных констант может скоро наскучить – нам ведь нужен способ хранения любой информации и манипулирования ею. Вот здесь на сцену выходят переменные. Слово «переменные» говорит само за себя – их значение может меняться, а значит, вы можете хранить в переменной всё, что угодно. \n\nПеременные – это просто области памяти компьютера, в которых вы храните некоторую информацию. В отличие от констант, к такой информации нужно каким-то образом получать доступ, поэтому переменным даются имена." }, - "Урок 4:Операторы и выражения": { - "Предисловие": "Большинство предложений (логических строк) в программах содержат выражения. Простой пример выражения: 2 + 3. Выражение можно разделить на операторы и операнды. Операторы – это некий функционал, производящий какие-либо действия, который может быть представлен в виде символов, как например +, или специальных зарезервированных слов. Операторы могут производить некоторые действия над данными, и эти данные называются операндами. В нашем случае 2 и 3 – это операнды.", - "Оператор сложение": "Объяснение: суммирует два объекта. \n\nПример: 3 + 5 даст 8; 'a' + 'b' даст 'ab'", - "Оператор вычитание": "Объяснение: Даёт разность двух чисел; если первый операнд отсутствует, он считается равным нулю. \n\nПример: -5.2 даст отрицательное число, а 50 - 24 даст 26.", - "Оператор умножение": "Объяснение: Даёт произведение двух чисел или возвращает строку, повторённую заданное число раз. \n\nПример: 2 * 3 даст 6. 'la' * 3 даст 'lalala'", - "Оператор деление": "Объяснение: Возвращает частное от деления x на y. \n\nПример: 4 / 2 даст 2", - "Оператор меньше": "Объяснение: Определяет, верно ли, что x меньше y. Все операторы сравнения возвращают True или False. Обратите внимание на заглавные буквы в этих словах. \n\nПример: 5 < 3 даст False", - "Оператор больше": "Объяснение: Определяет, верно ли, что x больше y. \n\nПример: 5 > 3 даст True", - "Оператор равно": "Объяснение: Проверяет,одинаковы ли объекты. \n\nПример: x = 2; y = 2; x == y даёт True", - "Оператор не равно": "Объяснение: Проверяет, верно ли, что объекты не равны. \n\nПример: x = 2; y = 3; x != y даёт True", - "Оператор логическое НЕ": "Объяснение: Если x равно True, оператор вернёт False. Если же x равно False, получим True. \n\nПример: x = True; not x даёт False", - "Оператор логическое И": "Объяснение: x and y даёт False, если x равно False , в противном случае возвращает значение y. \n\nПример: x = False; y = True; x and y возвращает False, поскольку x равно False", - "Оператор логическое ИЛИ": "Объяснение: Если x равно True, в результате получим True, в противном случае получим значение y. \n\nПример: x = True; y = False; x or y даёт True" + "Урок 3:Операторы и выражения": { + "0": " ** Предисловие ** \n\nБольшинство предложений (логических строк) в программах содержат выражения. Простой пример выражения: 2 + 3. Выражение можно разделить на операторы и операнды. Операторы – это некий функционал, производящий какие-либо действия, который может быть представлен в виде символов, как например +, или специальных зарезервированных слов. Операторы могут производить некоторые действия над данными, и эти данные называются операндами. В нашем случае 2 и 3 – это операнды.", + "1": " ** Оператор сложение ** \"+\" \n\nОбъяснение: суммирует два объекта. \n\nПример: 3 + 5 даст 8; 'a' + 'b' даст 'ab'", + "2": " ** Оператор вычитание ** \"-\" \n\nОбъяснение: Даёт разность двух чисел; если первый операнд отсутствует, он считается равным нулю. \n\nПример: -5.2 даст отрицательное число, а 50 - 24 даст 26.", + "3": " ** Оператор умножение ** \"*\" \n\nОбъяснение: Даёт произведение двух чисел или возвращает строку, повторённую заданное число раз. \n\nПример: 2 * 3 даст 6. 'la' * 3 даст 'lalala'", + "4": " ** Оператор деление ** \"/\" \n\nОбъяснение: Возвращает частное от деления x на y. \n\nПример: 4 / 2 даст 2", + "5": " ** Оператор меньше ** \"<\" \n\nОбъяснение: Определяет, верно ли, что x меньше y. Все операторы сравнения возвращают True или False. Обратите внимание на заглавные буквы в этих словах. \n\nПример: 5 < 3 даст False", + "6": " ** Оператор больше ** \">\" \n\nОбъяснение: Определяет, верно ли, что x больше y. \n\nПример: 5 > 3 даст True", + "7": " ** Оператор равно ** \"==\" \n\nОбъяснение: Проверяет,одинаковы ли объекты. \n\nПример: x = 2; y = 2; x == y даёт True", + "8": " ** Оператор не равно ** \"!=\" \n\nОбъяснение: Проверяет, верно ли, что объекты не равны. \n\nПример: x = 2; y = 3; x != y даёт True", + "9": " ** Оператор логическое НЕ ** \"not\" \n\nОбъяснение: Если x равно True, оператор вернёт False. Если же x равно False, получим True. \n\nПример: x = True; not x даёт False", + "10": " ** Оператор логическое И ** \"and\" \n\nОбъяснение: x and y даёт False, если x равно False , в противном случае возвращает значение y. \n\nПример: x = False; y = True; x and y возвращает False, поскольку x равно False", + "11": " ** Оператор логическое ИЛИ ** \"or\" \n\nОбъяснение: Если x равно True, в результате получим True, в противном случае получим значение y. \n\nПример: x = True; y = False; x or y даёт True" + }, + "Урок 4: Поток команд": { + "0": " ** Предисловие ** \n\nВ программах, которые мы до сих пор рассматривали, последовательность команд всегда выполнялась Python по порядку строго сверху вниз. А что, если нам необходимо изменить поток выполняющихся команд? Например, если требуется, чтобы программа принимала некоторое решение и выполняла различные действия в зависимости от ситуации; скажем, печатала «Доброе утро» или «Добрый вечер» в зависимости от времени суток. \n\nКак вы уже, наверное, догадались, этого можно достичь при помощи операторов управления потоком. В Python есть три оператора управления потоком: if, for и while.", + "1": " ** Оператор if ** \n\nОператор if используется для проверки условий: если условие верно, выполняется блок выражений (называемый «if-блок»), иначе выполняется другой блок выражений (называемый «else-блок»). Блок «else» является необязательным.", + "2": " ** Пример: ** \n\n`number = 23`\n`guess = int(input('Введите целое число : '))`\n\n`if guess == number:`\n `print('Поздравляю, вы угадали,') # Начало нового блока`\n `print('(хотя и не выиграли никакого приза!)')`\n`elif guess < number:`\n `print('Нет, загаданное число немного больше этого.') # Ещё один блок`\n`else:`\n `print('Нет, загаданное число немного меньше этого.')`", + "3": " ** Оператор while ** \n\nОператор while позволяет многократно выполнять блок команд до тех пор, пока выполняется некоторое условие. Это один из так называемых операторов цикла. Он также может иметь необязательный пункт else.", + "4": " ** Пример: ** \n\n`number = 23`\n`running = True`\n\n`while running:`\n `guess = int(input('Введите целое число : '))`\n\n `if guess == number:`\n `print('Поздравляю, вы угадали.')`\n `running = False`\n `elif guess < number:`\n `print('Нет, загаданное число немного больше этого.')`\n `else:`\n `print('Нет, загаданное число немного меньше этого.')`\n`else:`\n `print('Цикл while закончен.')`", + "5": " ** Цикл for ** \n\nОператор for..in также является оператором цикла, который осуществляет итерацию по последовательности объектов, т.е. проходит через каждый элемент в последовательности. __Мы узнаем больше о последовательностях в дальнейших главах, а пока просто запомните, что последовательность – это упорядоченный набор элементов.__", + "6": " ** Пример: ** \n\n`for i in range(1, 5):`\n `print(i)\nelse:`\n `print('Цикл for закончен')`", + "7": " ** Оператор break ** \n\nОператор break служит для прерывания цикла, т.е. остановки выполнения команд даже если условие выполнения цикла ещё не приняло значения False или последовательность элементов не закончилась.\n\n__Важно отметить, что если циклы for или while прервать оператором break, соответствующие им блоки else выполняться не будут.__", + "8": " ** Пример: ** \n\n`while True:`\n `s = input('Введите что-нибудь : ')`\n `if s == 'выход'`:\n `break`\n `print('Длина строки:', len(s))`", + "9": " ** Оператор continue ** \n\nОператор continue используется для указания Python, что необходимо пропустить все оставшиеся команды в текущем блоке цикла и продолжить со следующей итерации цикла", + "10": " ** Пример: ** \n\n`while True:`\n `s = input('Введите что-нибудь : ')`\n `if s == 'выход':`\n `break`\n `if len(s) < 3:`\n `print('Слишком мало')`\n `continue`\n `print('Введённая строка достаточной длины')`" }, - "Урок 5: Поток команд": { - "Предисловие": "В программах, которые мы до сих пор рассматривали, последовательность команд всегда выполнялась Python по порядку строго сверху вниз. А что, если нам необходимо изменить поток выполняющихся команд? Например, если требуется, чтобы программа принимала некоторое решение и выполняла различные действия в зависимости от ситуации; скажем, печатала «Доброе утро» или «Добрый вечер» в зависимости от времени суток. \n\nКак вы уже, наверное, догадались, этого можно достичь при помощи операторов управления потоком. В Python есть три оператора управления потоком: if, for и while.", - "Оператор if": "Оператор if используется для проверки условий: если условие верно, выполняется блок выражений (называемый «if-блок»), иначе выполняется другой блок выражений (называемый «else-блок»). Блок «else» является необязательным.", - "Пример оператора if": "`number = 23`\n`guess = int(input('Введите целое число : '))`\n\n`if guess == number:`\n `print('Поздравляю, вы угадали,') # Начало нового блока`\n `print('(хотя и не выиграли никакого приза!)')`\n`elif guess < number:`\n `print('Нет, загаданное число немного больше этого.') # Ещё один блок`\n`else:`\n `print('Нет, загаданное число немного меньше этого.')`", - "Оператор while": "Оператор while позволяет многократно выполнять блок команд до тех пор, пока выполняется некоторое условие. Это один из так называемых операторов цикла. Он также может иметь необязательный пункт else.", - "Пример оператора while": "`number = 23`\n`running = True`\n\n`while running:`\n `guess = int(input('Введите целое число : '))`\n\n `if guess == number:`\n `print('Поздравляю, вы угадали.')`\n `running = False`\n `elif guess < number:`\n `print('Нет, загаданное число немного больше этого.')`\n `else:`\n `print('Нет, загаданное число немного меньше этого.')`\n`else:`\n `print('Цикл while закончен.')`", - "Цикл for": "Оператор for..in также является оператором цикла, который осуществляет итерацию по последовательности объектов, т.е. проходит через каждый элемент в последовательности. __Мы узнаем больше о последовательностях в дальнейших главах, а пока просто запомните, что последовательность – это упорядоченный набор элементов.__", - "Пример цикла for": "`for i in range(1, 5):`\n `print(i)\nelse:`\n `print('Цикл for закончен')`", - "Оператор break": "Оператор break служит для прерывания цикла, т.е. остановки выполнения команд даже если условие выполнения цикла ещё не приняло значения False или последовательность элементов не закончилась.\n\n__Важно отметить, что если циклы for или while прервать оператором break, соответствующие им блоки else выполняться не будут.__", - "Пример оператора break": "`while True:`\n `s = input('Введите что-нибудь : ')`\n `if s == 'выход'`:\n `break`\n `print('Длина строки:', len(s))`", - "Оператор continue": "Оператор continue используется для указания Python, что необходимо пропустить все оставшиеся команды в текущем блоке цикла и продолжить со следующей итерации цикла", - "Пример оператора continue": "`while True:`\n `s = input('Введите что-нибудь : ')`\n `if s == 'выход':`\n `break`\n `if len(s) < 3:`\n `print('Слишком мало')`\n `continue`\n `print('Введённая строка достаточной длины')`" + "Урок 5: Функции": { + "0": " ** Предисловие ** \n\nФункции – это многократно используемые фрагменты программы. Они позволяют дать имя определённому блоку команд с тем, чтобы впоследствии запускать этот блок по указанному имени в любом месте программы и сколь угодно много раз. Это называется вызовом функции. Мы уже использовали много встроенных функций, как то len и range.\n\nФункции определяются при помощи зарезервированного слова def. После этого слова указывается имя функции, за которым следует пара скобок, в которых можно указать имена некоторых переменных, и заключительное двоеточие в конце строки. Далее следует блок команд, составляющих функцию.", + "1": " ** Пример: ** \n\n`def sayHello():`\n `print('Привет, Мир!')`\n`sayHello() # вызов функции`", + "2": " ** Как это работает: ** \n\nМы определили функцию с именем sayHello, используя описанный выше синтаксис. Эта функция не принимает параметров, поэтому в скобках не объявлены какие-либо переменные. Параметры функции – это некие входные данные, которые мы можем передать функции, чтобы получить соответствующий им результат.", + "3": " ** Параметры функций ** \n\nФункции могут принимать параметры, т.е. некоторые значения, передаваемые функции для того, чтобы она что-либо сделала с ними. Эти параметры похожи на переменные, за исключением того, что значение этих переменных указывается при вызове функции, и во время работы функции им уже присвоены их значения.\n\nПараметры указываются в скобках при объявлении функции и разделяются запятыми. Аналогично мы передаём значения, когда вызываем функцию. __Обратите внимание на терминологию: имена, указанные в объявлении функции, называются параметрами, тогда как значения, которые вы передаёте в функцию при её вызове, – аргументами.__", + "4": " ** Пример: ** \n\n`def printMax(a, b):`\n `if a > b:`\n `print(a, 'максимально')`\n `elif a == b:`\n `print(a, 'равно', b)`\n `else:`\n `print(b, 'максимально')`\n\n`printMax(3, 4) # прямая передача значений`\n\n`x = 5`\n`y = 7`\n\n`printMax(x, y) # передача переменных в качестве аргументов`", + "5": " ** Как это работает: ** \n\nЗдесь мы определили функцию с именем printMax, которая использует два параметра с именами a и b. Мы находим наибольшее число с применением простого оператора if..else и выводим это число.\n\nПри первом вызове функции printMax мы напрямую передаём числа в качестве аргументов. Во втором случае мы вызываем функцию с переменными в качестве аргументов. printMax(x, y) назначает значение аргумента x параметру a, а значение аргумента y – параметру b. В обоих случаях функция printMax работает одинаково.", + "6": " ** Локальные переменные ** \n\nПри объявлении переменных внутри определения функции, они никоим образом не связаны с другими переменными с таким же именем за пределами функции – т.е. имена переменных являются локальными в функции. Это называется областью видимости переменной. Область видимости всех переменных ограничена блоком, в котором они объявлены, начиная с точки объявления имени.", + "7": " ** Пример: ** \n\n`x = 50`\n\n`def func(x):`\n `print('x равен', x`\n `x = 2`\n `print('Замена локального x на', x)`\n\n`func(x)`\n`print('x по-прежнему', x)`", + "8": " ** Как это работает: ** \n\nПри первом выводе значения, присвоенного имени x, в первой строке функции Python sиспользует значение параметра, объявленного в основном блоке, выше определения функции.\n\nДалее мы назначаем x значение 2. Имя x локально для нашей функции. Поэтому когда мы заменяем значение x в функции, x, объявленный в основном блоке, остаётся незатронутым.\n\nПоследним вызовом функции print мы выводим значение x, указанное в основном блоке, подтверждая таким образом, что оно не изменилось при локальном присваивании значения в ранее вызванной функции.", + "9": " ** Зарезервированное слово global ** \n\nЧтобы присвоить некоторое значение переменной, определённой на высшем уровне программы необходимо указать глобально. Сделаем это при помощи зарезервированного слова global. Без применения global невозможно присвоить значение переменной, определённой за пределами функции.\n\nИспользование зарезервированного слова global достаточно ясно показывает, что переменная объявлена в самом внешнем блоке.", + "10": " ** Пример: ** \n\n`x = 50`\n\n`def func():`\n `global x`\n\n `print('x равно', x)`\n `x = 2`\n `print('Заменяем глобальное значение x на', x)`\n\n`func()`\n`print('Значение x составляет', x)`", + "11": " ** Как это работает: ** \n\nЗарезервированное слово global используется для того, чтобы объявить, что x – это глобальная переменная, а значит, когда мы присваиваем значение имени x внутри функции, это изменение отразится на значении переменной x в основном блоке программы.\n\n__Используя одно зарезервированное слово global, можно объявить сразу несколько переменных: global x, y, z.__", + "12": " ** Зарезервированное слово nonlocal ** \n\nМы увидели, как получать доступ к переменным в локальной и глобальной области видимости. Есть ещё один тип области видимости, называемый «нелокальной» (nonlocal) областью видимости, который представляет собой нечто среднее между первыми двумя. Нелокальные области видимости встречаются, когда вы определяете функции внутри функций.", + "13": " ** Пример: ** \n\n`def func_outer():`\n `x = 2`\n `print('x равно', x)`\n\n `def func_inner():`\n `nonlocal x`\n `x = 5`\n\n `func_inner()`\n `print('Локальное x сменилось на', x)`\n\n`func_outer()`", + "14": " ** Как это работает: ** \n\nКогда мы находимся внутри func_inner, переменная x, определённая в первой строке func_outer находится ни в локальной области видимости (определение переменной не входит в блок func_inner), ни в глобальной области видимости (она также и не в основном блоке программы). Мы объявляем, что хотим использовать именно эту переменную x, следующим образом: nonlocal x.", + "15": " ** Значения аргументов по умолчанию ** \n\nЗачастую часть параметров функций могут быть необязательными, и для них будут использоваться некоторые заданные значения по умолчанию, если пользователь не укажет собственных. Этого можно достичь с помощью значений аргументов по умолчанию. Их можно указать, добавив к имени параметра в определении функции оператор присваивания (=) с последующим значением.", + "16": " ** Пример: ** \n\n`def say(message, times = 1):`\n `print(message * times)`\n\n`say('Привет')`\n`say('Мир', 5)`", + "17": " ** Как это работает: ** \n\nФункция под именем say используется для вывода на экран строки указанное число раз. Если мы не указываем значения, по умолчанию строка выводится\nодин раз. Мы достигаем этого указанием значения аргумента по умолчанию, равного 1 для параметра times.\n\nПри первом вызове say мы указываем только строку, и функция выводит её один раз. При втором вызове say мы указываем также и аргумент 5, обозначая таким образом, что мы хотим сказать фразу 5 раз.", + "18": " ** Ключевые аргументы ** \n\nЕсли имеется некоторая функция с большим числом параметров, и при её вызове требуется указать только некоторые из них, значения этих параметров могут задаваться по их имени – это называется ключевые параметры. В этом случае для передачи аргументов функции используется имя (ключ) вместо позиции (как было до сих пор).\n\nЕсть два преимущества такого подхода: во-первых, использование функции становится легче, поскольку нет необходимости отслеживать порядок аргументов; во-вторых, можно задавать значения только некоторым избранным аргументам, при условии, что остальные параметры имеют значения аргумента по умолчанию.", + "19": " ** Пример: ** \n\n`def func(a, b=5, c=10):`\n `print('a равно', a, ', b равно', b, ', а c равно', c)`\n\n`func(3, 7)`\n`func(25, c=24)`\n`func(c=50, a=100)`", + "20": " ** Как это работает: ** \n\nФункция с именем func имеет один параметр без значения по умолчанию, за которым следуют два параметра со значениями по умолчанию.\n\nПри первом вызове, func(3, 7), параметр a получает значение 3, параметр b получает значение 7, а c получает своё значение по умолчанию, равное 10.\n\nПри втором вызове func(25, c=24) переменная a получает значение 25 в силу позиции аргумента. После этого параметр c получает значение 24 по имени, т.е. как ключевой параметр. Переменная b получает значение по умолчанию, равное 5.\n\nПри третьем обращении func(c=50, a=100) мы используем ключевые аргументы для всех указанных значений. Обратите внимание на то, что мы указываем значение для параметра c перед значением для a, даже несмотря на то, что в определении функции параметр a указан раньше c.", + "21": " ** Переменное число параметров ** \n\nИногда бывает нужно определить функцию, способную принимать любое число параметров. Этого можно достичь при помощи звёздочек", + "22": " ** Пример: ** \n\n`def total(a=5, *numbers,**phonebook):`\n `print('a', a)`\n\n `#проход по всем элементам кортежа`\n `for single_item in numbers:`\n `print('single_item', single_item)`\n\n `#проход по всем элементам словаря`\n `for first_part, second_part in phonebook.items():`\n `print(first_part,second_part)`\n\n`print(total(10,1,2,3,Jack=1123,John=2231,Inge=1560))`", + "23": " ** Как это работает: ** \n\nКогда мы объявляем параметр со звёздочкой (например, *param), все позиционные аргументы начиная с этой позиции и до конца будут собраны в кортеж под именем param.\n\nАналогично, когда мы объявляем параметры с двумя звёздочками (**param), все ключевые аргументы начиная с этой позиции и до конца будут собраны в словарь под именем param.", + "24": " ** Оператор return ** \n\nОператор return используется для возврата5 из функции, т.е. для прекращения её работы и выхода из неё. При этом можно также вернуть некоторое значение из функции.", + "25": " ** Пример: ** \n\n`def maximum(x, y):`\n `if x > y:`\n `return x`\n `elif x == y:`\n `return 'Числа равны.'`\n `else:`\n `return y`\n\n`print(maximum(2, 3))`", + "26": " ** Как это работает: ** \n\nФункция maximum возвращает максимальный из двух параметров, которые в\nданном случае передаются ей при вызове. Она использует обычный условный оператор if..else для определения наибольшего числа, а затем возвращает это число." }, - "Урок 6: Функции": { - "Предисловие": "Функции – это многократно используемые фрагменты программы. Они позволяют дать имя определённому блоку команд с тем, чтобы впоследствии запускать этот блок по указанному имени в любом месте программы и сколь угодно много раз. Это называется вызовом функции. Мы уже использовали много встроенных функций, как то len и range.\n\nФункции определяются при помощи зарезервированного слова def. После этого слова указывается имя функции, за которым следует пара скобок, в которых можно указать имена некоторых переменных, и заключительное двоеточие в конце строки. Далее следует блок команд, составляющих функцию.", - "Пример применения функций": "`def sayHello():`\n `print('Привет, Мир!')`\n`sayHello() # вызов функции`", - "Как это работают функции": "Мы определили функцию с именем sayHello, используя описанный выше синтаксис. Эта функция не принимает параметров, поэтому в скобках не объявлены какие-либо переменные. Параметры функции – это некие входные данные, которые мы можем передать функции, чтобы получить соответствующий им результат.", - "Параметры функций": "Функции могут принимать параметры, т.е. некоторые значения, передаваемые функции для того, чтобы она что-либо сделала с ними. Эти параметры похожи на переменные, за исключением того, что значение этих переменных указывается при вызове функции, и во время работы функции им уже присвоены их значения.\n\nПараметры указываются в скобках при объявлении функции и разделяются запятыми. Аналогично мы передаём значения, когда вызываем функцию. __Обратите внимание на терминологию: имена, указанные в объявлении функции, называются параметрами, тогда как значения, которые вы передаёте в функцию при её вызове, – аргументами.__", - "Пример": "`def printMax(a, b):`\n `if a > b:`\n `print(a, 'максимально')`\n `elif a == b:`\n `print(a, 'равно', b)`\n `else:`\n `print(b, 'максимально')`\n\n`printMax(3, 4) # прямая передача значений`\n\n`x = 5`\n`y = 7`\n\n`printMax(x, y) # передача переменных в качестве аргументов`", - "Как это работает": "Здесь мы определили функцию с именем printMax, которая использует два параметра с именами a и b. Мы находим наибольшее число с применением простого оператора if..else и выводим это число.\n\nПри первом вызове функции printMax мы напрямую передаём числа в качестве аргументов. Во втором случае мы вызываем функцию с переменными в качестве аргументов. printMax(x, y) назначает значение аргумента x параметру a, а значение аргумента y – параметру b. В обоих случаях функция printMax работает одинаково.", - "Локальные переменные": "При объявлении переменных внутри определения функции, они никоим образом не связаны с другими переменными с таким же именем за пределами функции – т.е. имена переменных являются локальными в функции. Это называется областью видимости переменной. Область видимости всех переменных ограничена блоком, в котором они объявлены, начиная с точки объявления имени.", - "Пример": "`x = 50`\n\n`def func(x):`\n `print('x равен', x`\n `x = 2`\n `print('Замена локального x на', x)`\n\n`func(x)`\n`print('x по-прежнему', x)`", - "Как это работает": "При первом выводе значения, присвоенного имени x, в первой строке функции Python sиспользует значение параметра, объявленного в основном блоке, выше определения функции.\n\nДалее мы назначаем x значение 2. Имя x локально для нашей функции. Поэтому когда мы заменяем значение x в функции, x, объявленный в основном блоке, остаётся незатронутым.\n\nПоследним вызовом функции print мы выводим значение x, указанное в основном блоке, подтверждая таким образом, что оно не изменилось при локальном присваивании значения в ранее вызванной функции.", - "Зарезервированное слово global": "Чтобы присвоить некоторое значение переменной, определённой на высшем уровне программы необходимо указать глобально. Сделаем это при помощи зарезервированного слова global. Без применения global невозможно присвоить значение переменной, определённой за пределами функции.\n\nИспользование зарезервированного слова global достаточно ясно показывает, что переменная объявлена в самом внешнем блоке.", - "Пример": "`x = 50`\n\n`def func():`\n `global x`\n\n `print('x равно', x)`\n `x = 2`\n `print('Заменяем глобальное значение x на', x)`\n\n`func()`\n`print('Значение x составляет', x)`", - "Как это работает": "Зарезервированное слово global используется для того, чтобы объявить, что x – это глобальная переменная, а значит, когда мы присваиваем значение имени x внутри функции, это изменение отразится на значении переменной x в основном блоке программы.\n\n__Используя одно зарезервированное слово global, можно объявить сразу несколько переменных: global x, y, z.__", - "Зарезервированное слово nonlocal": "****\n\nМы увидели, как получать доступ к переменным в локальной и глобальной области видимости. Есть ещё один тип области видимости, называемый «нелокальной» (nonlocal) областью видимости, который представляет собой нечто среднее между первыми двумя. Нелокальные области видимости встречаются, когда вы определяете функции внутри функций.", - "Пример": "`def func_outer():`\n `x = 2`\n `print('x равно', x)`\n\n `def func_inner():`\n `nonlocal x`\n `x = 5`\n\n `func_inner()`\n `print('Локальное x сменилось на', x)`\n\n`func_outer()`", - "Как это работает": "Когда мы находимся внутри func_inner, переменная x, определённая в первой строке func_outer находится ни в локальной области видимости (определение переменной не входит в блок func_inner), ни в глобальной области видимости (она также и не в основном блоке программы). Мы объявляем, что хотим использовать именно эту переменную x, следующим образом: nonlocal x.", - "Значения аргументов по умолчанию": "Зачастую часть параметров функций могут быть необязательными, и для них будут использоваться некоторые заданные значения по умолчанию, если пользователь не укажет собственных. Этого можно достичь с помощью значений аргументов по умолчанию. Их можно указать, добавив к имени параметра в определении функции оператор присваивания (=) с последующим значением.", - "Пример": "`def say(message, times = 1):`\n `print(message * times)`\n\n`say('Привет')`\n`say('Мир', 5)`", - "Как это работает": "Функция под именем say используется для вывода на экран строки указанное число раз. Если мы не указываем значения, по умолчанию строка выводится\nодин раз. Мы достигаем этого указанием значения аргумента по умолчанию, равного 1 для параметра times.\n\nПри первом вызове say мы указываем только строку, и функция выводит её один раз. При втором вызове say мы указываем также и аргумент 5, обозначая таким образом, что мы хотим сказать фразу 5 раз.", - "Ключевые аргументы": "Если имеется некоторая функция с большим числом параметров, и при её вызове требуется указать только некоторые из них, значения этих параметров могут задаваться по их имени – это называется ключевые параметры. В этом случае для передачи аргументов функции используется имя (ключ) вместо позиции (как было до сих пор).\n\nЕсть два преимущества такого подхода: во-первых, использование функции становится легче, поскольку нет необходимости отслеживать порядок аргументов; во-вторых, можно задавать значения только некоторым избранным аргументам, при условии, что остальные параметры имеют значения аргумента по умолчанию.", - "Пример": "`def func(a, b=5, c=10):`\n `print('a равно', a, ', b равно', b, ', а c равно', c)`\n\n`func(3, 7)`\n`func(25, c=24)`\n`func(c=50, a=100)`", - "Как это работает": "Функция с именем func имеет один параметр без значения по умолчанию, за которым следуют два параметра со значениями по умолчанию.\n\nПри первом вызове, func(3, 7), параметр a получает значение 3, параметр b получает значение 7, а c получает своё значение по умолчанию, равное 10.\n\nПри втором вызове func(25, c=24) переменная a получает значение 25 в силу позиции аргумента. После этого параметр c получает значение 24 по имени, т.е. как ключевой параметр. Переменная b получает значение по умолчанию, равное 5.\n\nПри третьем обращении func(c=50, a=100) мы используем ключевые аргументы для всех указанных значений. Обратите внимание на то, что мы указываем значение для параметра c перед значением для a, даже несмотря на то, что в определении функции параметр a указан раньше c.", - "Переменное число параметров": "Иногда бывает нужно определить функцию, способную принимать любое число параметров. Этого можно достичь при помощи звёздочек", - "Пример": "`def total(a=5, *numbers, **phonebook):`\n `print('a', a)`\n\n `#проход по всем элементам кортежа`\n `for single_item in numbers:`\n `print('single_item', single_item)`\n\n `#проход по всем элементам словаря`\n `for first_part, second_part in phonebook.items():`\n `print(first_part,second_part)`\n\n`print(total(10,1,2,3,Jack=1123,John=2231,Inge=1560))`", - "Как это работает": "Когда мы объявляем параметр со звёздочкой (например, *param), все позиционные аргументы начиная с этой позиции и до конца будут собраны в кортеж под именем param.\n\nАналогично, когда мы объявляем параметры с двумя звёздочками (**param), все ключевые аргументы начиная с этой позиции и до конца будут собраны в словарь под именем param.", - "Оператор return": "Оператор return используется для возврата5 из функции, т.е. для прекращения её работы и выхода из неё. При этом можно также вернуть некоторое значение из функции.", - "Пример": "`def maximum(x, y):`\n `if x > y:`\n `return x`\n `elif x == y:`\n `return 'Числа равны.'`\n `else:`\n `return y`\n\n`print(maximum(2, 3))`", - "Как это работает": "Функция maximum возвращает максимальный из двух параметров, которые в\nданном случае передаются ей при вызове. Она использует обычный условный оператор if..else для определения наибольшего числа, а затем возвращает это число." + "Урок 6: Модули": { + "0": " ** Предисловие ** \n\nКак можно использовать код повторно, помещая его в функции, мы уже видели. А что, если нам понадобится повторно использовать различные функции в других наших программах? Как вы уже, наверное, догадались, ответ – модули.\n\nСуществуют разные способы составления модулей, но самый простой – это создать файл с расширением .py, содержащий функции и переменные.\n\nДругой способ – написать модуль на том языке программирования, на котором написан сам интерпретатор Python. Например, можно писать модули на языке программирования C, которые после компиляции могут использоваться стандартным интерпретатором Python\n\nСперва посмотрим, как использовать модули стандартной библиотеки.", + "1": " ** Пример: ** \n\n`import sys`\n\n`print('Аргументы командной строки:')`\n`for i in sys.argv:`\n `print(i)`\n\n`print('\\n\\nПеременная PYTHONPATH содержит', sys.path, '\\n')`", + "2": " ** Как это работает: ** \n\nМы импортируем модуль sys.\n\nКогда выполняется команда import sys, идёт поиск модуля sys.\n\nДоступ к переменной argv в модуле sys предоставляется при помощи точки, т.е. sys.argv. Это явно показывает, что это имя является частью модуля sys.\n\nКогда мы запускаем «python using_sys.py we are arguments», мы запускаем модуль using_sys.py командой python, а всё, что следует далее – аргументы, передаваемые программе. Python сохраняет аргументы командной строки в переменной sys.argv для дальнейшего использования.", + "3": " ** Файлы байткода .pyc ** \n\nИмпорт модуля – относительно дорогостоящее мероприятие, поэтому Python предпринимает некоторые трюки для ускорения этого процесса. Один из способов – создать байткомпилированные файлы (или байткод) с расширением .pyc, которые являются некой промежуточной формой, в которую Python переводит программу (помните раздел «Введение» о том, как работает Python?). Такой файл .pyc полезен при импорте модуля в следующий раз в другую программу – это произойдёт намного быстрее, поскольку значительная часть обработки, требуемой при импорте модуля, будет уже проделана. Этот байткод также является платформо-независимым.", + "4": " ** Оператор from... import... ** \n\nЧтобы импортировать переменную argv прямо в программу и не писать всякий раз sys. При обращении к ней, можно воспользоваться выражением «from sys import argv».\n\nДля импорта всех имён, использующихся в модуле sys, можно выполнить команду «from sys import *». Это работает для любых модулей.\n\nВ общем случае вам следует избегать использования этого оператора и использовать вместо этого оператор import, чтобы предотвратить конфликты имён и не затруднять чтение программы.", + "5": " ** Создание собственных модулей ** \n\nСоздать собственный модуль очень легко. Да вы всё время делали это! Ведь каждая программа на Python также является и модулем. Необходимо лишь убедиться, что у неё установлено расширение .py.", + "6": " ** Пример: ** \n\n`def sayhi():`\n `print('Привет! Это говорит мой модуль.')`\n\n`__version__ = '0.1'`\n\n`# Конец модуля mymodule.py`", + "7": " ** Функция dir ** \n\nВстроенная функция dir() возвращает список имён, определяемых объектом. Например, для модуля в этот список входят функции, классы и переменные, определённые в этом модуле.\n\nЭта функция может принимать аргументы. Если в качестве аргумента указано имя модуля, она возвращает список имён, определённых в этом модуле. Если никакого аргумента не передавать, она вернёт список имён, определённых в текущем модуле.", + "8": " ** Пример: ** \n\n`$ python3`\n\n`>>> import sys # получим список атрибутов модуля 'sys'`\n\n`>>> dir(sys)`\n`['getfilesystemencoding', 'getprofile', 'getrecursionlimit', 'getrefcount', 'getsizeof', 'gettrace', porter_cache', 'platform', 'prefix', 'ps1', 'ps2', 'setcheckinterval', 'setprofile', 'setrecursionlimit', 'settrace', 'stderr', 'stdin', 'stdout', 'subversion', 'version', 'version_info', 'warnoptions', 'winver']`\n\n`>>> dir() # получим список атрибутов текущего модуля`\n`['__builtins__', '__doc__', '__name__', '__package__', 'sys']`\n\n`>>> a = 5 # создадим новую переменную 'a'`\n\n`>>> dir()`\n`['__builtins__', '__doc__', '__name__', '__package__', 'a', 'sys']`\n\n`>>> del a # удалим имя 'a'`\n\n`>>> dir()`\n`['__builtins__', '__doc__', '__name__', '__package__', 'sys']`\n\n`>>>`", + "9": " ** Как это работает: ** \n\nМы вызываем функцию dir, не передавая ей параметров. По умолчанию, она возвращает список атрибутов текущего модуля. __Обратите внимание, что список импортированных модулей также входит туда.__\n\nЧтобы пронаблюдать за действием dir, мы определяем новую переменную a и присваиваем ей значение, а затем снова вызываем dir. Видим, что в полученном списке появилось дополнительное значение. Удалим переменную/атрибут из текущего модуля при помощи оператора del, и изменения вновь отобразятся на выводе функции dir.\n\nЗамечание по поводу del: этот оператор используется для удаления переменной/имени, и после его выполнения, в данном случае – del a, к переменной a больше невозможно обратиться – её как будто никогда и не было.", + "10": " ** Пакеты ** \n\nК настоящему времени вы, вероятно, начали наблюдать некоторую иерархию в организации ваших программ. Переменные обычно находятся в функциях. Функции и глобальные переменные обычно находятся в модулях. А что, если возникнет необходимость как-то организовать модули? Вот здесь-то и выходят на сцену пакеты.\n\nПакеты – это просто каталоги с модулями и специальным файлом __init__.py, который показывает Python, что этот каталог особый, так как содержит модули Python.\n\nПредставим, что мы хотим создать пакет под названием «world» с субпакетами «asia», «africa» и т.д., которые, в свою очередь, будут содержать модули «india», «madagascar» и т.д.", + "11": " ** Пример: ** \n\nПредставим, что мы хотим создать пакет под названием «world» с субпакетами «asia», «africa» и т.д., которые, в свою очередь, будут содержать модули «india», «madagascar» и т.д.\n\nДля этого следовало бы создать следующую структуру каталогов:\n\n`| - <некоторый каталог из sys.path>/`\n`| |---- world/`\n`| |---- __init__.py`\n`| |---- asia/`\n`| | |---- __init__.py`\n`| | |---- india/`\n`| | |---- __init__.py`\n`| | |---- foo.py`\n`| |---- africa/`\n`| |---- __init__.py`\n`| |---- madagascar/`\n`| |---- __init__.py`\n`| |---- bar.py`" }, - "Урок 7: Модули": { - "Предисловие": "Как можно использовать код повторно, помещая его в функции, мы уже видели. А что, если нам понадобится повторно использовать различные функции в других наших программах? Как вы уже, наверное, догадались, ответ – модули.\n\nСуществуют разные способы составления модулей, но самый простой – это создать файл с расширением .py, содержащий функции и переменные.\n\nДругой способ – написать модуль на том языке программирования, на котором написан сам интерпретатор Python. Например, можно писать модули на языке программирования C, которые после компиляции могут использоваться стандартным интерпретатором Python\n\nСперва посмотрим, как использовать модули стандартной библиотеки.", - "Пример": "`import sys`\n\n`print('Аргументы командной строки:')`\n`for i in sys.argv:`\n `print(i)`\n\n`print('\\n\\nПеременная PYTHONPATH содержит', sys.path, '\\n')`", - "Как это работает": "Мы импортируем модуль sys.\n\nКогда выполняется команда import sys, идёт поиск модуля sys.\n\nДоступ к переменной argv в модуле sys предоставляется при помощи точки, т.е. sys.argv. Это явно показывает, что это имя является частью модуля sys.\n\nКогда мы запускаем «python using_sys.py we are arguments», мы запускаем модуль using_sys.py командой python, а всё, что следует далее – аргументы, передаваемые программе. Python сохраняет аргументы командной строки в переменной sys.argv для дальнейшего использования.", - "Файлы байткода .pyc": "Импорт модуля – относительно дорогостоящее мероприятие, поэтому Python предпринимает некоторые трюки для ускорения этого процесса. Один из способов – создать байткомпилированные файлы (или байткод) с расширением .pyc, которые являются некой промежуточной формой, в которую Python переводит программу (помните раздел «Введение» о том, как работает Python?). Такой файл .pyc полезен при импорте модуля в следующий раз в другую программу – это произойдёт намного быстрее, поскольку значительная часть обработки, требуемой при импорте модуля, будет уже проделана. Этот байткод также является платформо-независимым.", - "Оператор from... import...": "Чтобы импортировать переменную argv прямо в программу и не писать всякий раз sys. При обращении к ней, можно воспользоваться выражением «from sys import argv».\n\nДля импорта всех имён, использующихся в модуле sys, можно выполнить команду «from sys import *». Это работает для любых модулей.\n\nВ общем случае вам следует избегать использования этого оператора и использовать вместо этого оператор import, чтобы предотвратить конфликты имён и не затруднять чтение программы.", - "Создание собственных модулей": "Создать собственный модуль очень легко. Да вы всё время делали это! Ведь каждая программа на Python также является и модулем. Необходимо лишь убедиться, что у неё установлено расширение .py.", - "Пример": "`def sayhi():`\n `print('Привет! Это говорит мой модуль.')`\n\n`__version__ = '0.1'`\n\n`# Конец модуля mymodule.py`", - "Функция dir": "Встроенная функция dir() возвращает список имён, определяемых объектом. Например, для модуля в этот список входят функции, классы и переменные, определённые в этом модуле.\n\nЭта функция может принимать аргументы. Если в качестве аргумента указано имя модуля, она возвращает список имён, определённых в этом модуле. Если никакого аргумента не передавать, она вернёт список имён, определённых в текущем модуле.", - "Пример": "`$ python3`\n\n`>>> import sys # получим список атрибутов модуля 'sys'`\n\n`>>> dir(sys)`\n`['getfilesystemencoding', 'getprofile', 'getrecursionlimit', 'getrefcount', 'getsizeof', 'gettrace', porter_cache', 'platform', 'prefix', 'ps1', 'ps2', 'setcheckinterval', 'setprofile', 'setrecursionlimit', 'settrace', 'stderr', 'stdin', 'stdout', 'subversion', 'version', 'version_info', 'warnoptions', 'winver']`\n\n`>>> dir() # получим список атрибутов текущего модуля`\n`['__builtins__', '__doc__', '__name__', '__package__', 'sys']`\n\n`>>> a = 5 # создадим новую переменную 'a'`\n\n`>>> dir()`\n`['__builtins__', '__doc__', '__name__', '__package__', 'a', 'sys']`\n\n`>>> del a # удалим имя 'a'`\n\n`>>> dir()`\n`['__builtins__', '__doc__', '__name__', '__package__', 'sys']`\n\n`>>>`", - "Как это работает": "Мы вызываем функцию dir, не передавая ей параметров. По умолчанию, она возвращает список атрибутов текущего модуля. __Обратите внимание, что список импортированных модулей также входит туда.__\n\nЧтобы пронаблюдать за действием dir, мы определяем новую переменную a и присваиваем ей значение, а затем снова вызываем dir. Видим, что в полученном списке появилось дополнительное значение. Удалим переменную/атрибут из текущего модуля при помощи оператора del, и изменения вновь отобразятся на выводе функции dir.\n\nЗамечание по поводу del: этот оператор используется для удаления переменной/имени, и после его выполнения, в данном случае – del a, к переменной a больше невозможно обратиться – её как будто никогда и не было.", - "Пакеты": "К настоящему времени вы, вероятно, начали наблюдать некоторую иерархию в организации ваших программ. Переменные обычно находятся в функциях. Функции и глобальные переменные обычно находятся в модулях. А что, если возникнет необходимость как-то организовать модули? Вот здесь-то и выходят на сцену пакеты.\n\nПакеты – это просто каталоги с модулями и специальным файлом __init__.py, который показывает Python, что этот каталог особый, так как содержит модули Python.\n\nПредставим, что мы хотим создать пакет под названием «world» с субпакетами «asia», «africa» и т.д., которые, в свою очередь, будут содержать модули «india», «madagascar» и т.д.", - "Пример": "Представим, что мы хотим создать пакет под названием «world» с субпакетами «asia», «africa» и т.д., которые, в свою очередь, будут содержать модули «india», «madagascar» и т.д.\n\nДля этого следовало бы создать следующую структуру каталогов:\n\n`| - <некоторый каталог из sys.path>/`\n`| |---- world/`\n`| |---- __init__.py`\n`| |---- asia/`\n`| | |---- __init__.py`\n`| | |---- india/`\n`| | |---- __init__.py`\n`| | |---- foo.py`\n`| |---- africa/`\n`| |---- __init__.py`\n`| |---- madagascar/`\n`| |---- __init__.py`\n`| |---- bar.py`" + "Урок 7: Структуры данных": { + "0": " ** Предисловие ** \n\nСтруктуры данных – это, по сути, и есть структуры, которые могут хранить некоторые данные вместе. Другими словами, они используются для хранения связанных данных.\n\nВ Python существуют четыре встроенных структуры данных: список, кортеж, словарь и множество. Посмотрим, как ими пользоваться, и как они могут облегчить нам жизнь.", + "1": " ** Список ** \n\nСписок – это структура данных, которая содержит упорядоченный набор элементов, т.е. хранит последовательность элементов. Это легко представить, если вспомнить список покупок, в котором перечисляется, что нужно купить, с тем лишь исключением, что в списке покупок каждый элемент обычно размещается на отдельной строке, тогда как в Python они разделяются запятыми.\n\nСписок элементов должен быть заключён в квадратные скобки, чтобы Python понял, что это список. Как только список создан, можно добавлять, удалять или искать элементы в нём. Поскольку элементы можно добавлять и удалять, мы говорим, что список – это изменяемый тип данных, т.е. его можно модифицировать.", + "2": " ** Краткое введение в объекты и классы ** \n\nСписок – это один из примеров использования объектов и классов. Когда мы назначаем некоторой переменной i значение, скажем, целое число 5, это можно представить себе как создание объекта (т.е. экземпляра) i класса (т.е. типа) int. Чтобы лучше понять это, прочитайте help(int).\n\nКласс может также иметь методы, т.е. функции, определённые для использования только применительно к данному классу. Этот функционал будет доступен только когда имеется объект данного класса. Например, Python предоставляет метод append для класса list, который позволяет добавлять элемент к концу списка. Так mylist.append('and item') добавит эту строку к списку mylist. Обратите внимание на обозначение точкой для доступа к методам объектов.", + "3": " ** Пример: ** \n\n`shoplist = ['яблоки', 'манго', 'морковь', 'бананы']`\n\n`print('Я должен сделать', len(shoplist), 'покупки.')`\n\n`print('Покупки:', end=' ')`\n`for item in shoplist:`\n `print(item, end=' ')`\n\n`print('\\nТакже нужно купить риса.')`\n`shoplist.append('рис')`\n`print('Теперь мой список покупок таков:', shoplist)`\n\n`print('Отсортирую-ка я свой список')`\n`shoplist.sort()`\n`print('Отсортированный список покупок выглядит так:', shoplist)`\n\n`print('Первое, что мне нужно купить, это', shoplist[0])`\n`olditem = shoplist[0]`\n`del shoplist[0]`\n`print('Я купил', olditem)`\n`print('Теперь мой список покупок:', shoplist)`", + "4": " ** Как это работает: ** \n\nВ shoplist мы храним только строки с названиями того, что нужно купить.\n\nДалее мы добавляем элемент к списку при помощи append – метода объекта списка. Затем мы проверяем, действительно ли элемент был добавлен к списку, выводя содержимое списка на экран.\n\nЗатем мы сортируем список, используя метод sort объекта списка.\n\nДалее после совершения покупки мы хотим удалить её из списка. Это достигается применением оператора del.", + "5": " ** Кортеж ** \n\nКортежи служат для хранения нескольких объектов вместе. Их можно рассматривать как аналог списков, но без такой обширной функциональности, которую предоставляет класс списка. Одна из важнейших особенностей кортежей заключается в том, что они неизменяемы, так же, как и строки. Т.е. модифицировать кортежи невозможно.\n\nКортежи обозначаются указанием элементов, разделённых запятыми; по желанию их можно ещё заключить в круглые скобки.\n\nКортежи обычно используются в тех случаях, когда оператор или пользовательская функция должны наверняка знать, что набор значений, т.е. кортеж значений, не изменится.", + "6": " ** Пример: ** \n\n`zoo = ('питон', 'слон', 'пингвин') # помните, что скобки не обязательны`\n`print('Количество животных в зоопарке -', len(zoo))`\n\n`new_zoo = 'обезьяна', 'верблюд', zoo`\n`print('Количество клеток в зоопарке -', len(new_zoo))`\n`print('Все животные в новом зоопарке:', new_zoo)`\n`print('Животные, привезённые из старого зоопарка:', new_zoo[2])`\n`print('Последнее животное, привезённое из старого зоопарка -', new_zoo[2][2])`\n`print('Количество животных в новом зоопарке -', len(new_zoo)-1 + \\`\n `len(new_zoo[2])`", + "7": " ** Как это работает: ** \n\nПеременная zoo обозначает кортеж элементов. Функция len позволяет получить длину кортежа.\n\nТеперь мы перемещаем этих животных в новый зоопарк. Поэтому кортеж new_zoo содержит тех животных, которые уже там, наряду с привезёнными из старого зоопарка.\n\nДоступ к элементам кортежа осуществляется указанием позиции элемента, заключённой в квадратные скобки. Это называется оператором индексирования. Доступ к третьему элементу в new_zoo мы получаем, указывая new_zoo[2], а доступ к третьему элементу внутри третьего элемента в кортеже new_zoo – указывая new_zoo[2][2].", + "8": " ** Словарь ** \n\nСловарь – это некий аналог адресной книги, в которой можно найти адрес или контактную информацию о человеке, зная лишь его имя; т.е. некоторые ключи связаны со значениями.\n\nПары ключ-значение указываются в словаре следующим образом: «d = {key1 : value1, key2 : value2 }». Обратите внимание, что ключ и значение разделяются двоеточием, а пары друг от друга отделяются запятыми, а затем всё это заключается в фигурные скобки.", + "9": " ** Пример: ** \n\n`ab = { 'Swaroop' : 'swaroop@swaroopch.com',`\n `'Larry' : 'larry@wall.org',`\n `'Matsumoto' : 'matz@ruby-lang.org',`\n `'Spammer' : 'spammer@hotmail.com'`\n `}`\n\n`print(\"Адрес Swaroop'а:\", ab['Swaroop'])`\n\n`# Удаление пары ключ-значение`\n`del ab['Spammer']`\n\n`print('\\nВ адресной книге {0} контакта\\n'.format(len(ab)))`\n `print('Контакт {0} с адресом {1}'.format(name, address))`\n\n`# Добавление пары ключ-значение`\n`ab['Guido'] = 'guido@python.org'`\n\n`if 'Guido' in ab:`\n `print(\"\\nАдрес Guido:\", ab['Guido'])`", + "10": " ** Как это работает: ** \n\nМы создаём словарь ab. Затем мы обращаемся к парам ключ-значение. Как видите, синтаксис прост.\n\nУдалять пары ключ-значение можно при помощи оператора del. Мы указываем имя словаря и оператор индексирования для удаляемого ключа, после чего передаём это оператору del.\n\nДалее мы обращаемся ко всем парам ключ-значение нашего словаря, используя метод items, который возвращает список кортежей, каждый из которых содержит пару элементов: ключ и значение. Мы получаем эту пару и присваиваем её значение переменным name и address соответственно в цикле for..in, а затем выводим эти значения на экран в блоке for.", + "11": " ** Последовательности ** \n\nСписки, кортежи и строки являются примерами последовательностей. Но что такое последовательности и что в них такого особенного?\n\nОсновные возможности – это проверка принадлежности (т.е. выражения «in» и «not in») и оператор индексирования, позволяющий получить напрямую некоторый элемент последовательности.\n\nВсе три типа последовательностей, упоминавшиеся выше (списки, кортежи и строки), также предоставляют операцию получения вырезки, которая позволяет получить вырезку последовательности, т.е. её фрагмент.", + "12": " ** Пример: ** \n\n`shoplist = ['яблоки', 'манго', 'морковь', 'бананы']`\n`name = 'swaroop'`\n\n`# Операция индексирования`\n`print('Элемент 0 -', shoplist[0])`\n`print('Элемент 1 -', shoplist[1])`\n`print('Элемент 2 -', shoplist[2])`\n`print('Элемент 3 -', shoplist[3])`\n`print('Элемент -1 -', shoplist[-1])`\n`print('Элемент -2 -', shoplist[-2])`\n`print('Символ 0 -', name[0])`\n\n`# Вырезка из списка`\n`print('Элементы с 1 по 3:', shoplist[1:3])`\n`print('Элементы с 2 до конца:', shoplist[2:])`\n`print('Элементы с 1 по -1:', shoplist[1:-1])`\n`print('Элементы от начала до конца:', shoplist[:])`\n\n`# Вырезка из строки`\n`print('Символы с 1 по 3:', name[1:3])`\n`print('Символы с 2 до конца:', name[2:])`\n`print('Символы с 1 до -1:', name[1:-1])`\n`print('Символы от начала до конца:', name[:])`" }, - "Урок 8: Структуры данных": { - "Предисловие": "Структуры данных – это, по сути, и есть структуры, которые могут хранить некоторые данные вместе. Другими словами, они используются для хранения связанных данных.\n\nВ Python существуют четыре встроенных структуры данных: список, кортеж, словарь и множество. Посмотрим, как ими пользоваться, и как они могут облегчить нам жизнь.", - "Список": "Список – это структура данных, которая содержит упорядоченный набор элементов, т.е. хранит последовательность элементов. Это легко представить, если вспомнить список покупок, в котором перечисляется, что нужно купить, с тем лишь исключением, что в списке покупок каждый элемент обычно размещается на отдельной строке, тогда как в Python они разделяются запятыми.\n\nСписок элементов должен быть заключён в квадратные скобки, чтобы Python понял, что это список. Как только список создан, можно добавлять, удалять или искать элементы в нём. Поскольку элементы можно добавлять и удалять, мы говорим, что список – это изменяемый тип данных, т.е. его можно модифицировать.", - "Краткое введение в объекты и классы": "Список – это один из примеров использования объектов и классов. Когда мы назначаем некоторой переменной i значение, скажем, целое число 5, это можно представить себе как создание объекта (т.е. экземпляра) i класса (т.е. типа) int. Чтобы лучше понять это, прочитайте help(int).\n\nКласс может также иметь методы, т.е. функции, определённые для использования только применительно к данному классу. Этот функционал будет доступен только когда имеется объект данного класса. Например, Python предоставляет метод append для класса list, который позволяет добавлять элемент к концу списка. Так mylist.append('and item') добавит эту строку к списку mylist. Обратите внимание на обозначение точкой для доступа к методам объектов.", - "Пример": "`shoplist = ['яблоки', 'манго', 'морковь', 'бананы']`\n\n`print('Я должен сделать', len(shoplist), 'покупки.')`\n\n`print('Покупки:', end=' ')`\n`for item in shoplist:`\n `print(item, end=' ')`\n\n`print('\\nТакже нужно купить риса.')`\n`shoplist.append('рис')`\n`print('Теперь мой список покупок таков:', shoplist)`\n\n`print('Отсортирую-ка я свой список')`\n`shoplist.sort()`\n`print('Отсортированный список покупок выглядит так:', shoplist)`\n\n`print('Первое, что мне нужно купить, это', shoplist[0])`\n`olditem = shoplist[0]`\n`del shoplist[0]`\n`print('Я купил', olditem)`\n`print('Теперь мой список покупок:', shoplist)`", - "Как это работает": "В shoplist мы храним только строки с названиями того, что нужно купить.\n\nДалее мы добавляем элемент к списку при помощи append – метода объекта списка. Затем мы проверяем, действительно ли элемент был добавлен к списку, выводя содержимое списка на экран.\n\nЗатем мы сортируем список, используя метод sort объекта списка.\n\nДалее после совершения покупки мы хотим удалить её из списка. Это достигается применением оператора del.", - "Кортеж": "Кортежи служат для хранения нескольких объектов вместе. Их можно рассматривать как аналог списков, но без такой обширной функциональности, которую предоставляет класс списка. Одна из важнейших особенностей кортежей заключается в том, что они неизменяемы, так же, как и строки. Т.е. модифицировать кортежи невозможно.\n\nКортежи обозначаются указанием элементов, разделённых запятыми; по желанию их можно ещё заключить в круглые скобки.\n\nКортежи обычно используются в тех случаях, когда оператор или пользовательская функция должны наверняка знать, что набор значений, т.е. кортеж значений, не изменится.", - "Пример": "`zoo = ('питон', 'слон', 'пингвин') # помните, что скобки не обязательны`\n`print('Количество животных в зоопарке -', len(zoo))`\n\n`new_zoo = 'обезьяна', 'верблюд', zoo`\n`print('Количество клеток в зоопарке -', len(new_zoo))`\n`print('Все животные в новом зоопарке:', new_zoo)`\n`print('Животные, привезённые из старого зоопарка:', new_zoo[2])`\n`print('Последнее животное, привезённое из старого зоопарка -', new_zoo[2][2])`\n`print('Количество животных в новом зоопарке -', len(new_zoo)-1 + \\`\n `len(new_zoo[2])`", - "Как это работает": "Переменная zoo обозначает кортеж элементов. Функция len позволяет получить длину кортежа.\n\nТеперь мы перемещаем этих животных в новый зоопарк. Поэтому кортеж new_zoo содержит тех животных, которые уже там, наряду с привезёнными из старого зоопарка.\n\nДоступ к элементам кортежа осуществляется указанием позиции элемента, заключённой в квадратные скобки. Это называется оператором индексирования. Доступ к третьему элементу в new_zoo мы получаем, указывая new_zoo[2], а доступ к третьему элементу внутри третьего элемента в кортеже new_zoo – указывая new_zoo[2][2].", - "Словарь": "Словарь – это некий аналог адресной книги, в которой можно найти адрес или контактную информацию о человеке, зная лишь его имя; т.е. некоторые ключи связаны со значениями.\n\nПары ключ-значение указываются в словаре следующим образом: «d = {key1 : value1, key2 : value2 }». Обратите внимание, что ключ и значение разделяются двоеточием, а пары друг от друга отделяются запятыми, а затем всё это заключается в фигурные скобки.", - "Пример": "`ab = { 'Swaroop' : 'swaroop@swaroopch.com',`\n `'Larry' : 'larry@wall.org',`\n `'Matsumoto' : 'matz@ruby-lang.org',`\n `'Spammer' : 'spammer@hotmail.com'`\n `}`\n\n`print(\"Адрес Swaroop'а:\", ab['Swaroop'])`\n\n`# Удаление пары ключ-значение`\n`del ab['Spammer']`\n\n`print('\\nВ адресной книге {0} контакта\\n'.format(len(ab)))`\n `print('Контакт {0} с адресом {1}'.format(name, address))`\n\n`# Добавление пары ключ-значение`\n`ab['Guido'] = 'guido@python.org'`\n\n`if 'Guido' in ab:`\n `print(\"\\nАдрес Guido:\", ab['Guido'])`", - "Как это работает": "Мы создаём словарь ab. Затем мы обращаемся к парам ключ-значение. Как видите, синтаксис прост.\n\nУдалять пары ключ-значение можно при помощи оператора del. Мы указываем имя словаря и оператор индексирования для удаляемого ключа, после чего передаём это оператору del.\n\nДалее мы обращаемся ко всем парам ключ-значение нашего словаря, используя метод items, который возвращает список кортежей, каждый из которых содержит пару элементов: ключ и значение. Мы получаем эту пару и присваиваем её значение переменным name и address соответственно в цикле for..in, а затем выводим эти значения на экран в блоке for.", - "Последовательности": "Списки, кортежи и строки являются примерами последовательностей. Но что такое последовательности и что в них такого особенного?\n\nОсновные возможности – это проверка принадлежности (т.е. выражения «in» и «not in») и оператор индексирования, позволяющий получить напрямую некоторый элемент последовательности.\n\nВсе три типа последовательностей, упоминавшиеся выше (списки, кортежи и строки), также предоставляют операцию получения вырезки, которая позволяет получить вырезку последовательности, т.е. её фрагмент.", - "Пример": "`shoplist = ['яблоки', 'манго', 'морковь', 'бананы']`\n`name = 'swaroop'`\n\n`# Операция индексирования`\n`print('Элемент 0 -', shoplist[0])`\n`print('Элемент 1 -', shoplist[1])`\n`print('Элемент 2 -', shoplist[2])`\n`print('Элемент 3 -', shoplist[3])`\n`print('Элемент -1 -', shoplist[-1])`\n`print('Элемент -2 -', shoplist[-2])`\n`print('Символ 0 -', name[0])`\n\n`# Вырезка из списка`\n`print('Элементы с 1 по 3:', shoplist[1:3])`\n`print('Элементы с 2 до конца:', shoplist[2:])`\n`print('Элементы с 1 по -1:', shoplist[1:-1])`\n`print('Элементы от начала до конца:', shoplist[:])`\n\n`# Вырезка из строки`\n`print('Символы с 1 по 3:', name[1:3])`\n`print('Символы с 2 до конца:', name[2:])`\n`print('Символы с 1 до -1:', name[1:-1])`\n`print('Символы от начала до конца:', name[:])`" + "Урок 8: Исключения": { + "0": "Предисловие \n\nИсключения возникают тогда, когда в программе возникает некоторая исключительная ситуация. Например, к чему приведёт попытка чтения несуществующего файла? Или если файл был случайно удалён, пока программа работала? Такие ситуации обрабатываются при помощи исключений.\n\nЭто касается и программ, содержащих недействительные команды. В этом случае Python поднимает руки и сообщает, что обнаружил ошибку.", + "1": " ** Ошибки ** \n\nРассмотрим простой вызов функции print. Что, если мы ошибочно напишем print как Print? Обратите внимание на заглавную букву. В этом случае Python поднимает синтаксическую ошибку.", + "2": " ** Пример: ** \n\n`>>> Print('Привет, Мир!')`\n`Traceback (most recent call last):`\n `File \"\", line 1, in `\n `Print('Привет, Мир!')`\n`NameError: name 'Print' is not defined`\n\nОбратите внимание, что была поднята ошибка NameError, а также указано место, где была обнаружена ошибка. Так в данном случае действует обработчик ошибок.", + "3": " ** Исключения ** \n\nПопытаемся считать что-либо от пользователя. Нажмите Сtrl-D (или Ctrl+Z в Windows) и посмотрите, что произойдёт.", + "4": " ** Пример: ** \n\n`>>> s = input('Введите что-нибудь --> ')`\n\n`Введите что-нибудь -->`\n`Traceback (most recent call last):`\n `File \"\", line 1, in `\n `s = input('Введите что-нибудь --> ') `\n`EOFError: EOF when reading a line`\n\nPython поднимает ошибку с именем EOFError, что означает, что он обнаружил символ конца файла (который вводится при помощи Ctrl-D) там, где не ожидал.", + "5": " ** Обработка исключений ** \n\nОбрабатывать исключения можно при помощи оператора try..except. При этом все обычные команды помещаются внутрь try-блока, а все обработчики исключений – в except-блок.", + "6": " ** Пример: ** \n\n`try:`\n `text = input('Введите что-нибудь --> ')`\n`except EOFError:`\n `print('Ну зачем вы сделали мне EOF?')`\n`except KeyboardInterrupt:`\n `print('Вы отменили операцию.')`\n`else:`\n `print('Вы ввели {0}'.format(text))`", + "7": " ** Как это работает: ** \n\nЗдесь мы поместили все команды, которые могут вызвать исключения/ошибки, внутрь блока try, а затем поместили обработчики соответствующих ошибок/исключений в блок except. Выражение except может обрабатывать как одиночную ошибку или исключение, так и список ошибок/исключений в скобках. Если не указано имя ошибки или исключения, обрабатываться будут все ошибки и исключения.", + "8": " ** Вызов исключения ** \n\nИсключение можно поднять при помощи оператора raise, передав ему имя ошибки/исключения, а также объект исключения, который нужно выбросить.\n\nВызываемая ошибка или исключение должна быть классом, который прямо или непрямо является производным от класса Exception.", + "9": " ** Пример: ** \n\n`class ShortInputException(Exception):`\n `'''Пользовательский класс исключения.'''`\n `def __init__(self, length, atleast):`\n `Exception.__init__(self)`\n `self.length = length`\n `self.atleast = atleast`\n\n`try:`\n `text = input('Введите что-нибудь --> ')`\n `if len(text) < 3:`\n `raise ShortInputException(len(text), 3)`\n `# Здесь может происходить обычная работа`\n`except EOFError:`\n `print('Ну зачем вы сделали мне EOF?')`\n`except ShortInputException as ex:`\n `print('ShortInputException: Длина введённой строки -- {0}; \\`\n `ожидалось, как минимум, {1}'.format(ex.length, ex.atleast))`\n`else:`\n `print('Не было исключений.')`", + "10": " ** Как это работает: ** \n\nЗдесь мы создаём наш собственный тип исключения. Этот новый тип исключения называется ShortInputException. Он содержит два поля: length, хранящее длину введённого текста, и atleast, указывающее, какую минимальную длину текста ожидала программа.\n\nВ пункте except мы указываем класс ошибки ShortInputException, который будет сохранён как переменная ex, содержащая соответствующий объект ошибки/исключения. Это аналогично параметрам и аргументам при вызове функции. Внутри этого пункта except мы используем поля length и atleast объекта исключения для вывода необходимых сообщений пользователю.", + "11": " ** Try .. Finally ** \n\nПредставим, что в программе происходит чтение файла и необходимо убедиться, что объект файла был корректно закрыт и что не возникло никакого исключения. Этого можно достичь с применением блока finally.", + "12": " ** Пример: ** \n\n`import time`\n\n`try:`\n `f = open('poem.txt')`\n `while True: # наш обычный способ читать файлы`\n `line = f.readline()`\n `if len(line) == 0:`\n `break`\n `print(line, end='')`\n `time.sleep(2) # Пусть подождёт некоторое время`\n`except KeyboardInterrupt:`\n `print('!! Вы отменили чтение файла.')`\n`finally:`\n `f.close()`\n `print('(Очистка: Закрытие файла)')`", + "13": " ** Как это работает: ** \n\nЗдесь мы производим обычные операции чтения из файла, но в данном случае добавляем двухсекундный сон после вывода каждой строки при помощи функции time.sleep, чтобы программа выполнялась медленно (ведь Python очень быстр от природы). Во время выполнения программы нажмите ctrl-c, чтобы прервать/отменить выполнение программы.\n\nПронаблюдайте, как при этом выдаётся исключение KeyboardInterrupt, и программа выходит. Однако, прежде чем программа выйдет, выполняется пункт finally, и файловый объект будет всегда закрыт.", + "14": " ** Оператор with ** \n\nТипичной схемой является запрос некоторого ресурса в блоке try с последующим освобождением этого ресурса в блоке finally. Для того, чтобы сделать это более «чисто»,существует оператор with:", + "15": " ** Пример: ** \n\n`with open(\"poem.txt\") as f:`\n `for line in f:`\n `print(line, end='')`", + "16": " ** Как это работает: ** \n\nСуществует некий протокол, используемый оператором with. Он считывает объект, возвращаемый операторомopen.Назовём его в данном случае «thefile».\n\nПеред запуском блока кода, содержащегося в нём, оператор with всегда вызывает функцию thefile.__enter__, а также всегда вызывает thefile.__exit__ после завершения выполнения этого блока кода.\n\nТак что код, который мы бы написали в блоке finally, будет автоматически обработан методом __exit__. Это избавляет нас от необходимости повторно в явном виде указывать операторы try..finally." }, - "Урок 9: Исключения": { - "Предисловие": "Исключения возникают тогда, когда в программе возникает некоторая исключительная ситуация. Например, к чему приведёт попытка чтения несуществующего файла? Или если файл был случайно удалён, пока программа работала? Такие ситуации обрабатываются при помощи исключений.\n\nЭто касается и программ, содержащих недействительные команды. В этом случае Python поднимает руки и сообщает, что обнаружил ошибку.", - "Ошибки": "Рассмотрим простой вызов функции print. Что, если мы ошибочно напишем print как Print? Обратите внимание на заглавную букву. В этом случае Python поднимает синтаксическую ошибку.", - "Пример": "`>>> Print('Привет, Мир!')`\n`Traceback (most recent call last):`\n `File \"\", line 1, in `\n `Print('Привет, Мир!')`\n`NameError: name 'Print' is not defined`\n\nОбратите внимание, что была поднята ошибка NameError, а также указано место, где была обнаружена ошибка. Так в данном случае действует обработчик ошибок.", - "Исключения": "Попытаемся считать что-либо от пользователя. Нажмите Сtrl-D (или Ctrl+Z в Windows) и посмотрите, что произойдёт.", - "Пример": "`>>> s = input('Введите что-нибудь --> ')`\n\n`Введите что-нибудь -->`\n`Traceback (most recent call last):`\n `File \"\", line 1, in `\n `s = input('Введите что-нибудь --> ') `\n`EOFError: EOF when reading a line`\n\nPython поднимает ошибку с именем EOFError, что означает, что он обнаружил символ конца файла (который вводится при помощи Ctrl-D) там, где не ожидал.", - "Обработка исключений": "Обрабатывать исключения можно при помощи оператора try..except. При этом все обычные команды помещаются внутрь try-блока, а все обработчики исключений – в except-блок.", - "Пример": "`try:`\n `text = input('Введите что-нибудь --> ')`\n`except EOFError:`\n `print('Ну зачем вы сделали мне EOF?')`\n`except KeyboardInterrupt:`\n `print('Вы отменили операцию.')`\n`else:`\n `print('Вы ввели {0}'.format(text))`", - "Как это работает": "Здесь мы поместили все команды, которые могут вызвать исключения/ошибки, внутрь блока try, а затем поместили обработчики соответствующих ошибок/исключений в блок except. Выражение except может обрабатывать как одиночную ошибку или исключение, так и список ошибок/исключений в скобках. Если не указано имя ошибки или исключения, обрабатываться будут все ошибки и исключения.", - "Вызов исключения": "Исключение можно поднять при помощи оператора raise, передав ему имя ошибки/исключения, а также объект исключения, который нужно выбросить.\n\nВызываемая ошибка или исключение должна быть классом, который прямо или непрямо является производным от класса Exception.", - "Пример": "`class ShortInputException(Exception):`\n `'''Пользовательский класс исключения.'''`\n `def __init__(self, length, atleast):`\n `Exception.__init__(self)`\n `self.length = length`\n `self.atleast = atleast`\n\n`try:`\n `text = input('Введите что-нибудь --> ')`\n `if len(text) < 3:`\n `raise ShortInputException(len(text), 3)`\n `# Здесь может происходить обычная работа`\n`except EOFError:`\n `print('Ну зачем вы сделали мне EOF?')`\n`except ShortInputException as ex:`\n `print('ShortInputException: Длина введённой строки -- {0}; \\`\n `ожидалось, как минимум, {1}'.format(ex.length, ex.atleast))`\n`else:`\n `print('Не было исключений.')`", - "Как это работает": "Здесь мы создаём наш собственный тип исключения. Этот новый тип исключения называется ShortInputException. Он содержит два поля: length, хранящее длину введённого текста, и atleast, указывающее, какую минимальную длину текста ожидала программа.\n\nВ пункте except мы указываем класс ошибки ShortInputException, который будет сохранён как переменная ex, содержащая соответствующий объект ошибки/исключения. Это аналогично параметрам и аргументам при вызове функции. Внутри этого пункта except мы используем поля length и atleast объекта исключения для вывода необходимых сообщений пользователю.", - "Try .. Finally": "Представим, что в программе происходит чтение файла и необходимо убедиться, что объект файла был корректно закрыт и что не возникло никакого исключения. Этого можно достичь с применением блока finally.", - "Пример": "`import time`\n\n`try:`\n `f = open('poem.txt')`\n `while True: # наш обычный способ читать файлы`\n `line = f.readline()`\n `if len(line) == 0:`\n `break`\n `print(line, end='')`\n `time.sleep(2) # Пусть подождёт некоторое время`\n`except KeyboardInterrupt:`\n `print('!! Вы отменили чтение файла.')`\n`finally:`\n `f.close()`\n `print('(Очистка: Закрытие файла)')`", - "Как это работает": "Здесь мы производим обычные операции чтения из файла, но в данном случае добавляем двухсекундный сон после вывода каждой строки при помощи функции time.sleep, чтобы программа выполнялась медленно (ведь Python очень быстр от природы). Во время выполнения программы нажмите ctrl-c, чтобы прервать/отменить выполнение программы.\n\nПронаблюдайте, как при этом выдаётся исключение KeyboardInterrupt, и программа выходит. Однако, прежде чем программа выйдет, выполняется пункт finally, и файловый объект будет всегда закрыт.", - "Оператор with": "Типичной схемой является запрос некоторого ресурса в блоке try с последующим освобождением этого ресурса в блоке finally. Для того, чтобы сделать это более «чисто»,существует оператор with:", - "Пример": "`with open(\"poem.txt\") as f:`\n `for line in f:`\n `print(line, end='')`", - "Как это работает": "Существует некий протокол, используемый оператором with. Он считывает объект, возвращаемый операторомopen.Назовём его в данном случае «thefile».\n\nПеред запуском блока кода, содержащегося в нём, оператор with всегда вызывает функцию thefile.__enter__, а также всегда вызывает thefile.__exit__ после завершения выполнения этого блока кода.\n\nТак что код, который мы бы написали в блоке finally, будет автоматически обработан методом __exit__. Это избавляет нас от необходимости повторно в явном виде указывать операторы try..finally." + "Урок 9: Дополнительно": { + "0": " ** Предисловие ** \n\nК настоящему моменту мы уже рассмотрели большую часть того, что вам придётся использовать при работе с Python. В этой главе мы охватим некоторые дополнительные аспекты, которые помогут отшлифовать ваши знания.", + "1": " ** Self ** \n\nМетоды класса имеют одно отличие от обычных функций: они должны иметь дополнительно имя, добавляемое к началу списка параметров. Однако, при вызове метода никакого значения этому параметру присваивать не нужно – его укажет Python. Эта переменная указывает на сам объект экземпляра класса, и по традиции она называется self.\n\nХотя этому параметру можно дать любое имя, настоятельно рекомендуется использовать только имя self; использование любого другого имени не приветствуется. Есть много достоинств использования стандартного имени: во-первых, любой человек, просматривающий вашу программу, легко узнает его; во-вторых, некоторые специализированные Интегрированные среды разработки (IDE) изначально рассчитаны на использование self.", + "2": " ** Классы ** \n\nКлассы предоставляют средства объединения данных и функциональности вместе. Создание нового класса создает объект нового типа, позволяя создавать новые экземпляры этого типа. К каждому экземпляру класса могут быть прикреплены атрибуты для поддержания его состояния. Экземпляры класса также могут иметь методы (определенные его классом) для изменения его состояния.", + "3": " ** Пример: ** \n\n`class Person:`\n `pass # Пустой блок`\n\n`p = Person()`\n`print(p)`", + "4": " ** Как это работает: ** \n\nМы создаём новый класс при помощи оператора class и имени класса. За этим следует блок выражений, формирующих тело класса. В данном случае блок у нас пуст, на что указывает оператор pass.\n\nДалее мы создаём объект-экземпляр класса, записывая имя класса со скобками. (Мы узнаем больше о реализации в следующем разделе). Для проверки мы выясняем тип переменной, просто выводя её на экран. Так мы видим, что у нас есть экземпляр класса Person в модуле __main__.\n\nОбратите внимание, что выводится также и адрес в памяти компьютера, где хранится ваш объект. На вашем компьютере адрес будет другим, так как Python хранит объекты там, где имеется свободное место.", + "5": " ** Методы объектов ** \n\nИтак, мы выяснили что классы/объекты могут иметь методы, представляющие собой функции, за исключением дополнительной переменной self. А теперь давайте рассмотрим пример", + "6": " ** Пример: ** \n\n`class Person:`\n `def sayHi(self):`\n `print('Привет! Как дела?')`\n\n`p = Person()`\n`p.sayHi()`", + "7": " ** Как это работает: ** \n\nЗдесь мы видим self в действии. __Обратите внимание, что метод sayHi не принимает параметров, но тем не менее, имеет self в определении функции.__", + "8": " ** Блоки в одно выражение ** \n\nМы неоднократно говорили, что каждый блок команд отделяется от других своим собственным уровнем отступа. Однако, существует и исключение. Если блок команд содержит только одно выражение, его можно указывать в одной строке с условным оператором или, скажем, оператором цикла. Рассмотрим это на примере:", + "9": " ** Пример: ** \n\n`>>> flag = True`\n`>>> if flag: print('Да')`\n`Да`\n\nОбратите внимание, что единственный оператор расположен в той же строке, а не отдельным блоком. Этот способ может подкупить тем, что якобы «сокращает» программу, но мы настоятельно рекомендуем избегать его во всех случаях, кроме проверки ошибок. Прежде всего, потому что гораздо легче добавлять команды, когда уже есть необходимый уровень отступа.", + "10": " ** Lambda-формы ** \n\nКлючевое слово lambda используется для создания функций и возврата их значения во время выполнения программы. lambda принимает параметр, за которым следует одно выражение, которое становится телом функции, а значение этого выражения возвращается новой функцией.", + "11": " ** Пример: ** \n\n`points = [ { 'x' : 2, 'y' : 3 }, { 'x' : 4, 'y' : 1 } ]`\n`points.sort(key=lambda i : i['y'])`\n`print(points)`", + "12": " ** Как это работает: ** \n\nОбратите внимание на то, что метод sort класса list может принимать параметр key, определяющий способ сортировки списка (обычно мы думаем только о сортировке по возрастанию или по убыванию). В данном случае мы хотим провести сортировку по собственному принципу, для чего нам необходимо написать соответствующую функцию. Но вместо того, чтобы создавать отдельный блок def для описания функции, которая будет использоваться только в этом месте, мы применяем лямбда-выражение.", + "13": " ** Генераторы списков ** \n\nГенераторы списков служат для создания новых списков на основе существующих. Представьте, что имеется список чисел, на основе которого требуется получить новый список, состоящий из всех чисел, умноженных на 2, но только при условии, что само число больше 2. Генераторы списков подходят для таких задач как нельзя лучше.", + "14": " ** Пример: ** \n\n`listone = [2, 3, 4]`\n`listtwo = [2*i for i in listone if i > 2]`\n`print(listtwo)`", + "15": " ** Как это работает: ** \n\nВ этом примере мы создаём новый список, указав операцию, которую необходимо произвести (2 * i), когда выполняется некоторое условие (if i > 2).Обратите внимание, что исходный список при этом не изменяется.", + "16": " ** Передача кортежей и словарей в функции ** \n\nДля получения параметров, переданных функции, в виде кортежа или словаря, существуют специальные приставки «*» или «**» соответственно. Это особенно полезно в случаях, когда функция может принимать переменное число параметров.", + "17": " ** Пример: ** \n\n`>>> def powersum(power, *args):`\n`... '''Возвращает сумму аргументов, возведённых в указанную степень.'''`\n`... total = 0`\n`... for i in args:`\n`... total += pow(i, power)`\n`... return total`\n`...`\n`>>> powersum(2, 3, 4)`\n`25`\n`>>> powersum(2, 10)`\n`100`\n\nПоскольку перед переменной args указана приставка «*», все дополнительные аргументы, переданные функции, сохранятся в args в виде кортежа. В случае использования приставки « ** » все дополнительные параметры будут рассматриваться как пары ключ/значение в словаре.", + "18": " ** exec и eval ** \n\nФункция exec служит для выполнения команд Python, содержащихся в строке или файле, в отличие от самого текста программы. Например, во время выполнения программы можно сформировать строку, содержащую текст программы на Python, и запустить его при помощи exec:", + "19": " ** Пример: ** \n\n`>>> exec('print(\"Здравствуй, Мир!\")')`\n`Здравствуй, Мир!`", + "20": " ** Оператор assert ** \n\nОператор assert существует для того, чтобы указать, что нечто является истиной. Например, если требуется гарантировать, что в списке будет хотя бы один элемент, и вызвать ошибку, если это не так, то оператор assert идеально подойдёт для такой задачи. Когда заявленное выражение ложно, вызывается ошибка AssertionError. Метод pop() возвращает последний элемент списка, одновременно удаляя его оттуда.", + "21": " ** Пример: ** \n\n`>>> mylist = ['item']`\n`>>> assert len(mylist) >= 1`\n`>>> mylist.pop()`\n`'item'`\n`>>> mylist`\n`[]`\n`>>> assert len(mylist) >= 1`\n`Traceback (most recent call last):`\n `File \"\", line 1, in `\n`AssertionError`", + "22": " ** Функция repr ** \n\nФункция repr используется для получения канонического строкового представления объекта. Любопытно, что в большинстве случаев eval(repr(object)) == object.", + "23": " ** Пример: ** \n\n`>>> i = []`\n`>>> i.append('item')`\n`>>> repr(i)`\n`\"['item']\"`\n`>>> eval(repr(i))`\n`['item']`\n`>>> eval(repr(i)) == i`\n`True`\n\nПо большому счёту, функция repr служит для получения печатаемого представления объекта. Определив метод __repr__ в собственном классе, можно указать, что он будет возвращать по вызову функции repr.", + "24": " ** Асинхронность ** \n\nАсинхронность в Python позволяет выполнять операции в неблокирующем режиме, тем самым, не тратя время на ожидание окончания операции. Для реализации асинхронности в Python используются:\n\n1. Ключевое слово async для создания асинхронной функции.\n\n2. Ключевое слово await для ожидания выполнения асинхронной операции.\n\n3. Библиотека asyncio для управления работой асинхронных функций." + }, + "Урок 10: Библиотеки":{ + "0": " ** Предисловие. Установка библиотек ** \n\nВ Каталоге пакетов Python существует колоссальное количество открытых библиотек, которые вы можете использовать в своих программах. Для их установки можно воспользоваться pip.", + "1": " ** Графические программы ** \n\nДля создания собственной графической программы на Python понадобится какая-нибудь библиотека ГИП (графического интерфейса пользователя) со своими привязками к Python. Привязки позволяют писать программу на Python, используя библиотеки, которые сами по себе написаны на C, C++ или других языках.", + "2": " ** Kivy \n\nhttps://kivy.org", + "3": "PyGTK ** \n\nЭто привязки Python к инструментарию GTK+, на основе которого построен GNOME. У GTK+ есть много своих особенностей, но как только вы освоитесь, вы сможете создавать ГИП очень быстро. Что касается дизайнера графического интерфейса Glade, то он просто незаменим. Документация же всё ещё требует некоторых улучшений. GTK+ хорошо работает в GNU/Linux, но его порт на Windows пока не закончен. При помощи GTK+ можно создавать как свободные, так и проприетарные программы. Для начала прочитайте Учебник по PyGTK.", + "4": "PyQt ** \n\nЭто привязки Python к инструментарию Qt, на основе которого построена KDE. Qt чрезвычайно прост в использовании, особенно благодаря Qt Designer и изумительной документации Qt. PyQt бесплатно, если используется для создания свободных программ (с лицензией GPL). Для создания закрытых проприетарных программ вам придётся его купить. Начиная с Qt 4.5, разрешается создавать при помощи него не только GPL’ные программы.", + "5": " ** wxPython ** \n\nЭто привязки Python к инструментарию wxWidgets. wxPython не так прост в освоении, но зато он переносим и работает на GNU/Linux, Windows, Mac и даже на встраиваемых платформах. Многие среды разработки для wxPython, такие как SPE (Stani’s Python Editor) и wxGlade включают дизайнеры графического интерфейса. При помощи wxPython можно создавать как свободные, так и проприетарные программы.", + "6": " ** NumPy ** \n\nNumPy - библиотека , которая предоставляет набор функциональных возможностей для работы с многомерными массивами, выполнения математических операций с ними и широким спектром других математических функций. Если вы работаете с большими объемами данных и выполняете численные расчеты, NumPy предоставляет мощный инструментарий для управления данными и обработки их в Python. ", + "7": " ** Создание массива ** \n\nNumPy позволяет просто создавать одномерные, двумерные и многомерные массивы, используя функции array()", + "8": " ** Индексация и срезы ** \n\nNumPy позволяет получать доступ к элементам массива и создавать срезы массива, как и в простом списке Python", + "9": " ** Математические операции ** \n\nС помощью NumPy легко выполнять математические операции с массивами, такие как сложение, вычитание, умножение и деление", + "10": " ** Статистические функции ** \n\nNumPy также предоставляет полезные статистические функции для работы с массивами, такие как среднее значение, медиана, минимальное и максимальное значения", + "11": " ** Matplotlib ** \n\nMatplotlib - библиотека, которая позволяет создавать графики и диаграммы из данных с помощью различных типов диаграмм и методов настройки.", + "12": " ** Создание графика ** \n\nMatplotlib предоставляет объективно много возможностей для создания графиков, включая гистограммы, диаграммы рассеивания и линейные графики.", + "13": " ** Настройка графика ** \n\nMatplotlib предоставляет множество методов для редактирования элементов графика - цвета, шрифтов, маркеров, заголовков и множество других функций.", + "14": " ** Создание нескольких графиков ** \n\nMatplotlib также предоставляет способ создания нескольких графиков в одной рабочей области. Это полезно, когда необходимо сравнить или отобразить несколько наборов данных на одном графике", + "15": " ** Создание гистограммы ** \n\nЕсли вы работаете с данными, гистограммы в Matplotlib могут помочь лучше понимать распределение данных." }, - "Урок 10: Дополнительно": { - "Предисловие": "К настоящему моменту мы уже рассмотрели большую часть того, что вам придётся использовать при работе с Python. В этой главе мы охватим некоторые дополнительные аспекты, которые помогут отшлифовать ваши знания.", - "Self": "Методы класса имеют одно отличие от обычных функций: они должны иметь дополнительно имя, добавляемое к началу списка параметров. Однако, при вызове метода никакого значения этому параметру присваивать не нужно – его укажет Python. Эта переменная указывает на сам объект экземпляра класса, и по традиции она называется self.\n\nХотя этому параметру можно дать любое имя, настоятельно рекомендуется использовать только имя self; использование любого другого имени не приветствуется. Есть много достоинств использования стандартного имени: во-первых, любой человек, просматривающий вашу программу, легко узнает его; во-вторых, некоторые специализированные Интегрированные среды разработки (IDE) изначально рассчитаны на использование self.", - "Классы": "Классы предоставляют средства объединения данных и функциональности вместе. Создание нового класса создает объект нового типа, позволяя создавать новые экземпляры этого типа. К каждому экземпляру класса могут быть прикреплены атрибуты для поддержания его состояния. Экземпляры класса также могут иметь методы (определенные его классом) для изменения его состояния.", - "Пример": "`class Person:`\n `pass # Пустой блок`\n\n`p = Person()`\n`print(p)`", - "Как это работает": "Мы создаём новый класс при помощи оператора class и имени класса. За этим следует блок выражений, формирующих тело класса. В данном случае блок у нас пуст, на что указывает оператор pass.\n\nДалее мы создаём объект-экземпляр класса, записывая имя класса со скобками. (Мы узнаем больше о реализации в следующем разделе). Для проверки мы выясняем тип переменной, просто выводя её на экран. Так мы видим, что у нас есть экземпляр класса Person в модуле __main__.\n\nОбратите внимание, что выводится также и адрес в памяти компьютера, где хранится ваш объект. На вашем компьютере адрес будет другим, так как Python хранит объекты там, где имеется свободное место.", - "Методы объектов": "Итак, мы выяснили что классы/объекты могут иметь методы, представляющие собой функции, за исключением дополнительной переменной self. А теперь давайте рассмотрим пример", - "Пример": "`class Person:`\n `def sayHi(self):`\n `print('Привет! Как дела?')`\n\n`p = Person()`\n`p.sayHi()`", - "Как это работает": "Здесь мы видим self в действии. __Обратите внимание, что метод sayHi не принимает параметров, но тем не менее, имеет self в определении функции.__", - "Блоки в одно выражение": "Мы неоднократно говорили, что каждый блок команд отделяется от других своим собственным уровнем отступа. Однако, существует и исключение. Если блок команд содержит только одно выражение, его можно указывать в одной строке с условным оператором или, скажем, оператором цикла. Рассмотрим это на примере:", - "Пример": "`>>> flag = True`\n`>>> if flag: print('Да')`\n`Да`\n\nОбратите внимание, что единственный оператор расположен в той же строке, а не отдельным блоком. Этот способ может подкупить тем, что якобы «сокращает» программу, но мы настоятельно рекомендуем избегать его во всех случаях, кроме проверки ошибок. Прежде всего, потому что гораздо легче добавлять команды, когда уже есть необходимый уровень отступа.", - "Lambda-функции": "Ключевое слово lambda используется для создания функций и возврата их значения во время выполнения программы. lambda принимает параметр, за которым следует одно выражение, которое становится телом функции, а значение этого выражения возвращается новой функцией.", - "Пример": "`points = [ { 'x' : 2, 'y' : 3 }, { 'x' : 4, 'y' : 1 } ]`\n`points.sort(key=lambda i : i['y'])`\n`print(points)`", - "Как это работает": "Обратите внимание на то, что метод sort класса list может принимать параметр key, определяющий способ сортировки списка (обычно мы думаем только о сортировке по возрастанию или по убыванию). В данном случае мы хотим провести сортировку по собственному принципу, для чего нам необходимо написать соответствующую функцию. Но вместо того, чтобы создавать отдельный блок def для описания функции, которая будет использоваться только в этом месте, мы применяем лямбда-выражение.", - "Генераторы списков": "Генераторы списков служат для создания новых списков на основе существующих. Представьте, что имеется список чисел, на основе которого требуется получить новый список, состоящий из всех чисел, умноженных на 2, но только при условии, что само число больше 2. Генераторы списков подходят для таких задач как нельзя лучше.", - "Пример": "`listone = [2, 3, 4]`\n`listtwo = [2*i for i in listone if i > 2]`\n`print(listtwo)`", - "Как это работает": "В этом примере мы создаём новый список, указав операцию, которую необходимо произвести (2 * i), когда выполняется некоторое условие (if i > 2).Обратите внимание, что исходный список при этом не изменяется.", - "Передача кортежей и словарей в функции": "Для получения параметров, переданных функции, в виде кортежа или словаря, существуют специальные приставки «*» или «**» соответственно. Это особенно полезно в случаях, когда функция может принимать переменное число параметров.", - "Пример": "`>>> def powersum(power, *args):`\n`... '''Возвращает сумму аргументов, возведённых в указанную степень.'''`\n`... total = 0`\n`... for i in args:`\n`... total += pow(i, power)`\n`... return total`\n`...`\n`>>> powersum(2, 3, 4)`\n`25`\n`>>> powersum(2, 10)`\n`100`\n\nПоскольку перед переменной args указана приставка «*», все дополнительные аргументы, переданные функции, сохранятся в args в виде кортежа. В случае использования приставки «**» все дополнительные параметры будут рассматриваться как пары ключ/значение в словаре.", - "exec и eval": "Функция exec служит для выполнения команд Python, содержащихся в строке или файле, в отличие от самого текста программы. Например, во время выполнения программы можно сформировать строку, содержащую текст программы на Python, и запустить его при помощи exec:", - "Пример": "`>>> exec('print(\"Здравствуй, Мир!\")')`\n`Здравствуй, Мир!`", - "Оператор assert": "Оператор assert существует для того, чтобы указать, что нечто является истиной. Например, если требуется гарантировать, что в списке будет хотя бы один элемент, и вызвать ошибку, если это не так, то оператор assert идеально подойдёт для такой задачи. Когда заявленное выражение ложно, вызывается ошибка AssertionError. Метод pop() возвращает последний элемент списка, одновременно удаляя его оттуда.", - "Пример": "`>>> mylist = ['item']`\n`>>> assert len(mylist) >= 1`\n`>>> mylist.pop()`\n`'item'`\n`>>> mylist`\n`[]`\n`>>> assert len(mylist) >= 1`\n`Traceback (most recent call last):`\n `File \"\", line 1, in `\n`AssertionError`", - "Функция repr": "Функция repr используется для получения канонического строкового представления объекта. Любопытно, что в большинстве случаев eval(repr(object)) == object.", - "Пример": "`>>> i = []`\n`>>> i.append('item')`\n`>>> repr(i)`\n`\"['item']\"`\n`>>> eval(repr(i))`\n`['item']`\n`>>> eval(repr(i)) == i`\n`True`\n\nПо большому счёту, функция repr служит для получения печатаемого представления объекта. Определив метод __repr__ в собственном классе, можно указать, что он будет возвращать по вызову функции repr.", - "Установка библиотек": "В Каталоге пакетов Python существует колоссальное количество открытых библиотек, которые вы можете использовать в своих программах. Для их установки можно воспользоваться pip.", - "Графические программы": "Для создания собственной графической программы на Python понадобится какая-нибудь библиотека ГИП (графического интерфейса пользователя) со своими привязками к Python. Привязки позволяют писать программу на Python, используя библиотеки, которые сами по себе написаны на C, C++ или других языках.", - "Kivy": "https://kivy.org", - "PyGTK": "Это привязки Python к инструментарию GTK+, на основе которого построен GNOME. У GTK+ есть много своих особенностей, но как только вы освоитесь, вы сможете создавать ГИП очень быстро. Что касается дизайнера графического интерфейса Glade, то он просто незаменим. Документация же всё ещё требует некоторых улучшений. GTK+ хорошо работает в GNU/Linux, но его порт на Windows пока не закончен. При помощи GTK+ можно создавать как свободные, так и проприетарные программы. Для начала прочитайте Учебник по PyGTK.", - "PyQt": "Это привязки Python к инструментарию Qt, на основе которого построена KDE. Qt чрезвычайно прост в использовании, особенно благодаря Qt Designer и изумительной документации Qt. PyQt бесплатно, если используется для создания свободных программ (с лицензией GPL). Для создания закрытых проприетарных программ вам придётся его купить. Начиная с Qt 4.5, разрешается создавать при помощи него не только GPL’ные программы.", - "wxPython": "Это привязки Python к инструментарию wxWidgets. wxPython не так прост в освоении, но зато он переносим и работает на GNU/Linux, Windows, Mac и даже на встраиваемых платформах. Многие среды разработки для wxPython, такие как SPE (Stani’s Python Editor) и wxGlade включают дизайнеры графического интерфейса. При помощи wxPython можно создавать как свободные, так и проприетарные программы." + "Послесловие":{ + "0": " ** В каких сферах используется Python ** \n\nPython широко используется в различных сферах. Некоторые из основных областей применения Python:\n\n1. Data Science: Python использовуется для анализа данных, машинного обучения, интеллектуального анализа данных, обработки изображений и звука.\n\n2. Web-разработка: Python используется для разработки веб-сайтов, создания веб-приложений, обработки запросов и проектирования RESTful API.\n\n3. Научное моделирование: Python используется для разработки математических моделей, численных вычислений, решения уравнений и моделирования физических процессов.\n\n4. Разработка игр: Python используется для создания игр и игровых движков.\n\n5. Кибербезопасность: Python используется для разработки криптографического программного обеспечения, инструментов для тестирования на проникновение, систем обнаружения вторжений и анализа логов." } } \ No newline at end of file diff --git a/main4.py b/main4.py index 5b3bc9e..b5d15ed 100644 --- a/main4.py +++ b/main4.py @@ -109,7 +109,14 @@ def _working_with_user (self) -> None: # Пользователь не в главном меню else: self._working_with_user_outside_main_menu ( ) - + if self._has_all_words_in_text_in_lower("помощь", "помоги", "помочь", "помощи", "помощью", "помог"): + self._OUTPUT_TEXT = '''Всегда к вашим услугам! Послушайте мои функции:\n1: Если вы хотите продолжить изучение курса с последней темы, просто скажите: "курс".\n2: Если вы хотите проверить свои знания, просто скажите: "квест".\n3: Если вы хотите проверить свои знания и заняться практикой, скажите: "задачки."\n4: Если вы достаточно смелый, я могу оценить ваши знания, просто скажите: "оцени мои знания."\n5: Если у вас возникла ошибка в коде, скажите: "пофикси ошибку"\n6: Если вам нужна консультация, скажите: "консультация"\n7: Если вы хотите написать жалобу или предложение насчет нашего навыка, скажите: "отчет"\n8: Для того чтобы покинуть навык скажите: "выйти из навыка."\nТак чем я могу вам помочь?''' + self._BUTTONS.add_buttons_of_main_menu_in_text ( ) + self._working_with_user_in_main_menu ( ) + elif self._has_all_words_in_text_in_lower("умеешь", "уметь", "умеете"): + self._OUTPUT_TEXT = '''Давайте расскажу, Я - ваш личный эксперт в области Python. Хотите отдохнуть и послушать курс? или потренироваться на практике в задачах и квесте? А может получить оценку своих знаний теории? Я всегда готова вам помочь! Может вы хотите получить консультацию от моего гениального интеллекта либо узнать как пофиксить ошибку? Тут я тоже могу подсказать. Так чем бы вы хотели заняться?''' + self._BUTTONS.add_buttons_of_main_menu_in_text ( ) + self._working_with_user_in_main_menu ( ) @property def _user_is_in_main_menu (self) -> bool: if self._SESSIONAL_DATA["state"] == "in_main_menu": From a576e3026a381a532aec41cace715aea71165301 Mon Sep 17 00:00:00 2001 From: Alexonys1 <107358560+Alexonys1@users.noreply.github.com> Date: Mon, 27 Mar 2023 11:03:57 +0300 Subject: [PATCH 22/31] =?UTF-8?q?=D0=95=D1=89=D1=91=20=D0=BE=D0=B4=D0=BD?= =?UTF-8?q?=D0=BE=20=D0=BE=D0=B1=D0=BD=D0=BE=D0=B2=D0=BB=D0=B5=D0=BD=D0=B8?= =?UTF-8?q?=D0=B5=20=D0=B7=D0=B2=D1=83=D0=BA=D0=BE=D0=B2=20=D0=B8=20=D0=BA?= =?UTF-8?q?=D0=B0=D1=80=D1=82=D0=B8=D0=BD=D0=BE=D0=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Поставил новые звуки, картинки, пофиксил баги. --- email_sender.py | 51 ++++--- json_manager.py | 12 +- lessons.json | 311 ++++++++++++++++++++----------------------- main3.py | 2 + main4.py | 210 ++++++++++++----------------- task_getter.py | 12 +- texts_for_users.json | 45 +++++-- useful_functions.py | 80 ++++++++++- 8 files changed, 390 insertions(+), 333 deletions(-) diff --git a/email_sender.py b/email_sender.py index 8c5d0ea..cc769a1 100644 --- a/email_sender.py +++ b/email_sender.py @@ -1,34 +1,41 @@ import smtplib from email.mime.text import MIMEText from email.mime.multipart import MIMEMultipart -from email.mime.application import MIMEApplication -# Написано ChatGPT class EmailSender: - def __init__(self, email: str, password: str): + def __init__(self, email, password, smtp_server='smtp.gmail.com', smtp_port=587): self.email = email self.password = password + self.smtp_server = smtp_server + self.smtp_port = smtp_port + self.server = None - def send_email(self, to_email: str, theme: str, text: str, attachment=None): - """Отправляет сообщение на указанную почту.""" - msg = MIMEMultipart() - msg['From'] = self.email - msg['To'] = to_email - msg['Subject'] = theme + def login(self): + try: + self.server = smtplib.SMTP(self.smtp_server, self.smtp_port) + self.server.starttls() + self.server.login(self.email, self.password) + print('Logged in successfully.') + except Exception as e: + print(f'Error: Could not login to the email server.\n{e}') - msg.attach(MIMEText(text, 'plain')) + def send_email(self, to_addr, subject, body): + if self.server is None: + self.login() + from_addr = self.email + message = MIMEMultipart() + message['From'] = from_addr + message['To'] = to_addr + message['Subject'] = subject + message.attach(MIMEText(body, 'plain')) + try: + self.server.sendmail(from_addr, to_addr, message.as_string()) + print(f'Sent email to {to_addr} with subject "{subject}" and message: {body}') + except Exception as e: + print(f'Error: Could not send email.\n{e}') - if attachment: - with open(attachment, 'rb') as f: - file_data = f.read() - part = MIMEApplication(file_data) - part.add_header('Content-Disposition', f'attachment; filename="{attachment}"') - msg.attach(part) - server = smtplib.SMTP('smtp.gmail.com', 587) - server.starttls() - server.login(self.email, self.password) - text = msg.as_string() - server.sendmail(self.email, to_email, text) - server.quit() \ No newline at end of file +if __name__ == '__main__': + email_sender = EmailSender ("leha.bondar.05@mail.ru", "Sstrelo4gGvip") + email_sender.send_email ("leha.bondar.05@mail.ru", "Test message", "Test text...") \ No newline at end of file diff --git a/json_manager.py b/json_manager.py index 74121f4..7469fa1 100644 --- a/json_manager.py +++ b/json_manager.py @@ -94,7 +94,13 @@ def get_introduction_sound ( ) -> str: def get_random_win_picture ( ) -> str: - return random.choice (texts_for_users["big_win_pictures"]) + return random.choice (texts_for_users["win_pictures"]) -def get_random_bonus_picture ( ) -> str: - return random.choice (texts_for_users["bonus_pictures"]) \ No newline at end of file +def get_random_looking_results_pictures ( ) -> str: + return random.choice (texts_for_users["looking_results_pictures"]) + +def get_random_level_up_picture ( ) -> str: + return random.choice (texts_for_users["level_up_pictures"]) + +def get_random_farewell_picture ( ) -> str: + return random.choice (texts_for_users["farewell_pictures"]) \ No newline at end of file diff --git a/lessons.json b/lessons.json index c91bb38..81019d7 100644 --- a/lessons.json +++ b/lessons.json @@ -1,177 +1,160 @@ - { - "Урок 0: Введение в Python": { - "0": " ** Предисловие ** \n\nPython – простой и минималистичный язык. Чтение хорошей программы на Python очень напоминает чтение английского текста, хотя и достаточно строгого! Такая псевдо-кодовая природа Python является одной из его самых сильных сторон. Она позволяет вам сосредоточиться на решении задачи, а не на самом языке.", - "1": " ** Python - Язык высокого уровня ** \n\nПри написании программы на Python вам никогда не придётся отвлекаться на такие низкоуровневые детали, как управление памятью, используемой вашей программой, и т.п.", - "2": " ** Python - Язык объектно-ориентированный ** \n\nPython поддерживает как процедурно-ориентированное, так и объектноориентированное программирование. В процедурно-ориентированных языках программы строятся на основе процедур или функций, которые представляют собой просто-напросто многократно используемые фрагменты программы. В объектно-ориентированных языках программирования программы строятся на основе объектов, объединяющих в себе данные и функционал. \n\n__Python предоставляет простые, но мощные средства для ООП, особенно в сравнении с такими большими языками программирования, как C++ или Java.__" , - "3": " ** Python - Язык встраиваемый ** \n\nВ Python можно встраивать в программы на C/C++, чтобы предоставлять возможности написания сценариев их пользователям." + "Урок 1: Введение в Python": { + "Предисловие": "Python – простой и минималистичный язык. Чтение хорошей программы на Python очень напоминает чтение английского текста, хотя и достаточно строгого! Такая псевдо-кодовая природа Python является одной из его самых сильных сторон. Она позволяет вам сосредоточиться на решении задачи, а не на самом языке.", + "Python - Язык высокого уровня": "При написании программы на Python вам никогда не придётся отвлекаться на такие низкоуровневые детали, как управление памятью, используемой вашей программой, и т.п.", + "Python - Язык объектно-ориентированный": "Python поддерживает как процедурно-ориентированное, так и объектноориентированное программирование. В процедурно-ориентированных языках программы строятся на основе процедур или функций, которые представляют собой просто-напросто многократно используемые фрагменты программы. В объектно-ориентированных языках программирования программы строятся на основе объектов, объединяющих в себе данные и функционал. \n\n__Python предоставляет простые, но мощные средства для ООП, особенно в сравнении с такими большими языками программирования, как C++ или Java.__" , + "Python - Язык встраиваемый": "В Python можно встраивать в программы на C/C++, чтобы предоставлять возможности написания сценариев их пользователям." }, - "Урок 1: Установка Python": { - "0": " ** Предисловие ** \n\nИтак для того чтобы нам начать писать код нужно установть сам Python, а так же редактор для него ", - "1": " ** Установка в Windows ** \n\nПосетите страницу http://www.python.org/download/ и загрузите последнюю версию. Установка производится так же, как и для любых других программ для Windows.", - "2": " ** Выбор редактора ** \n\nПоскольку мы не можем набирать программу в командной т.к, нам понадобится сохранять программы в файлах. \n\nИтак нам нужен редактор для работы с файлами программ. Выбор редактора крайне важен. Хороший редактор поможет вам легко писать программы на Python, делая ваше путешествие более комфортным, а также позволяя быстрее и безопаснее достичь вашей цели. \n\nОдно из самых основных требований – это __подсветка синтаксиса__, когда разные элементы программы на Python раскрашены так, чтобы вы могли легко видеть вашу программу и ход её выполнения. \n\nЕсли вы не знаете, с чего начать, мы бы порекомендовали вам пользоваться программой PyCharm", - "3": " ** Создание проекта ** \n\nЗапустите выбранный вами редактор, введите следующую программу и сохраните её под именем helloworld.py . \n\nЕсли вы пользуетесь PyCharm, нажмите «New Project» → «выберете путь где будут хранится ваши программы» → «создавайте проект!»" + "Урок 2: Установка Python": { + "Предисловие": "Итак для того чтобы нам начать писать код нужно установть сам Python, а так же редактор для него ", + "Установка в Windows": "Посетите страницу http://www.python.org/download/ и загрузите последнюю версию. Установка производится так же, как и для любых других программ для Windows.", + "Выбор редактора": "Поскольку мы не можем набирать программу в командной т.к, нам понадобится сохранять программы в файлах. \n\nИтак нам нужен редактор для работы с файлами программ. Выбор редактора крайне важен. Хороший редактор поможет вам легко писать программы на Python, делая ваше путешествие более комфортным, а также позволяя быстрее и безопаснее достичь вашей цели. \n\nОдно из самых основных требований – это __подсветка синтаксиса__, когда разные элементы программы на Python раскрашены так, чтобы вы могли легко видеть вашу программу и ход её выполнения. \n\nЕсли вы не знаете, с чего начать, мы бы порекомендовали вам пользоваться программой PyCharm", + "Создание проекта": "Запустите выбранный вами редактор, введите следующую программу и сохраните её под именем helloworld.py . \n\nЕсли вы пользуетесь PyCharm, нажмите «New Project» → «выберете путь где будут хранится ваши программы» → «создавайте проект!»" }, - "Урок 2: Основы": { - "0": " ** Предисловие ** \n\nPython – это, один из немногих языков программирования, простых в освоении и одновременно мощных. \n\nЭто очень важно и для начинающих, и для специалистов, но что ещё важнее – на нём приятно программировать.", - "1": " ** Комментарии ** \n\nКомментарии – это то, что пишется после символа #, и представляет интерес лишь как заметка для читающего программу. \n\nНапример: \nprint(Привет, Мир!) # print -- это функция", - "2": " ** Строка ** \n\nСтрока – это последовательность символов. Чаще всего строки – это просто некоторые наборы слов. \n\nСлова могут быть как на английском языке, так и на любом другом, поддерживаемом стандартом Unicode, что означает почти на любом языке мира.", - "3": " ** Одинарные кавычки ** \n\nСтроку можно указать, используя одинарные кавычки, как например, 'Фраза в кавычках'. Все пробелы и знаки табуляции сохранятся, как есть.", - "4": " ** Двойные кавычки ** \n\nСтроки в двойных кавычках работают точно так же, как и в одинарных. Например,\"Как тебя зовут?\".", - "5": " ** Типы данных ** \n\nПеременные могут хранить значения разных типов, называемых типами данных. Основными типами являются числа и строки, о которых мы уже говорили. В дальнейших главах мы увидим, как создавать свои собственные типы при помощи классов.", - "6": " ** Переменные ** \n\nИспользование одних лишь литеральных констант может скоро наскучить – нам ведь нужен способ хранения любой информации и манипулирования ею. Вот здесь на сцену выходят переменные. Слово «переменные» говорит само за себя – их значение может меняться, а значит, вы можете хранить в переменной всё, что угодно. \n\nПеременные – это просто области памяти компьютера, в которых вы храните некоторую информацию. В отличие от констант, к такой информации нужно каким-то образом получать доступ, поэтому переменным даются имена." + "Урок 3: Основы": { + "Предисловие": "Python – это, один из немногих языков программирования, простых в освоении и одновременно мощных. \n\nЭто очень важно и для начинающих, и для специалистов, но что ещё важнее – на нём приятно программировать.", + "Комментарии": "Комментарии – это то, что пишется после символа #, и представляет интерес лишь как заметка для читающего программу. \n\nНапример: \nprint(Привет, Мир!) # print -- это функция", + "Строка": "Строка – это последовательность символов. Чаще всего строки – это просто некоторые наборы слов. \n\nСлова могут быть как на английском языке, так и на любом другом, поддерживаемом стандартом Unicode, что означает почти на любом языке мира.", + "Одинарные кавычки": "Строку можно указать, используя одинарные кавычки, как например, 'Фраза в кавычках'. Все пробелы и знаки табуляции сохранятся, как есть.", + "Двойные кавычки": "Строки в двойных кавычках работают точно так же, как и в одинарных. Например,\"Как тебя зовут?\".", + "Типы данных": "Переменные могут хранить значения разных типов, называемых типами данных. Основными типами являются числа и строки, о которых мы уже говорили. В дальнейших главах мы увидим, как создавать свои собственные типы при помощи классов.", + "Переменные": "Использование одних лишь литеральных констант может скоро наскучить – нам ведь нужен способ хранения любой информации и манипулирования ею. Вот здесь на сцену выходят переменные. Слово «переменные» говорит само за себя – их значение может меняться, а значит, вы можете хранить в переменной всё, что угодно. \n\nПеременные – это просто области памяти компьютера, в которых вы храните некоторую информацию. В отличие от констант, к такой информации нужно каким-то образом получать доступ, поэтому переменным даются имена." }, - "Урок 3:Операторы и выражения": { - "0": " ** Предисловие ** \n\nБольшинство предложений (логических строк) в программах содержат выражения. Простой пример выражения: 2 + 3. Выражение можно разделить на операторы и операнды. Операторы – это некий функционал, производящий какие-либо действия, который может быть представлен в виде символов, как например +, или специальных зарезервированных слов. Операторы могут производить некоторые действия над данными, и эти данные называются операндами. В нашем случае 2 и 3 – это операнды.", - "1": " ** Оператор сложение ** \"+\" \n\nОбъяснение: суммирует два объекта. \n\nПример: 3 + 5 даст 8; 'a' + 'b' даст 'ab'", - "2": " ** Оператор вычитание ** \"-\" \n\nОбъяснение: Даёт разность двух чисел; если первый операнд отсутствует, он считается равным нулю. \n\nПример: -5.2 даст отрицательное число, а 50 - 24 даст 26.", - "3": " ** Оператор умножение ** \"*\" \n\nОбъяснение: Даёт произведение двух чисел или возвращает строку, повторённую заданное число раз. \n\nПример: 2 * 3 даст 6. 'la' * 3 даст 'lalala'", - "4": " ** Оператор деление ** \"/\" \n\nОбъяснение: Возвращает частное от деления x на y. \n\nПример: 4 / 2 даст 2", - "5": " ** Оператор меньше ** \"<\" \n\nОбъяснение: Определяет, верно ли, что x меньше y. Все операторы сравнения возвращают True или False. Обратите внимание на заглавные буквы в этих словах. \n\nПример: 5 < 3 даст False", - "6": " ** Оператор больше ** \">\" \n\nОбъяснение: Определяет, верно ли, что x больше y. \n\nПример: 5 > 3 даст True", - "7": " ** Оператор равно ** \"==\" \n\nОбъяснение: Проверяет,одинаковы ли объекты. \n\nПример: x = 2; y = 2; x == y даёт True", - "8": " ** Оператор не равно ** \"!=\" \n\nОбъяснение: Проверяет, верно ли, что объекты не равны. \n\nПример: x = 2; y = 3; x != y даёт True", - "9": " ** Оператор логическое НЕ ** \"not\" \n\nОбъяснение: Если x равно True, оператор вернёт False. Если же x равно False, получим True. \n\nПример: x = True; not x даёт False", - "10": " ** Оператор логическое И ** \"and\" \n\nОбъяснение: x and y даёт False, если x равно False , в противном случае возвращает значение y. \n\nПример: x = False; y = True; x and y возвращает False, поскольку x равно False", - "11": " ** Оператор логическое ИЛИ ** \"or\" \n\nОбъяснение: Если x равно True, в результате получим True, в противном случае получим значение y. \n\nПример: x = True; y = False; x or y даёт True" - }, - "Урок 4: Поток команд": { - "0": " ** Предисловие ** \n\nВ программах, которые мы до сих пор рассматривали, последовательность команд всегда выполнялась Python по порядку строго сверху вниз. А что, если нам необходимо изменить поток выполняющихся команд? Например, если требуется, чтобы программа принимала некоторое решение и выполняла различные действия в зависимости от ситуации; скажем, печатала «Доброе утро» или «Добрый вечер» в зависимости от времени суток. \n\nКак вы уже, наверное, догадались, этого можно достичь при помощи операторов управления потоком. В Python есть три оператора управления потоком: if, for и while.", - "1": " ** Оператор if ** \n\nОператор if используется для проверки условий: если условие верно, выполняется блок выражений (называемый «if-блок»), иначе выполняется другой блок выражений (называемый «else-блок»). Блок «else» является необязательным.", - "2": " ** Пример: ** \n\n`number = 23`\n`guess = int(input('Введите целое число : '))`\n\n`if guess == number:`\n `print('Поздравляю, вы угадали,') # Начало нового блока`\n `print('(хотя и не выиграли никакого приза!)')`\n`elif guess < number:`\n `print('Нет, загаданное число немного больше этого.') # Ещё один блок`\n`else:`\n `print('Нет, загаданное число немного меньше этого.')`", - "3": " ** Оператор while ** \n\nОператор while позволяет многократно выполнять блок команд до тех пор, пока выполняется некоторое условие. Это один из так называемых операторов цикла. Он также может иметь необязательный пункт else.", - "4": " ** Пример: ** \n\n`number = 23`\n`running = True`\n\n`while running:`\n `guess = int(input('Введите целое число : '))`\n\n `if guess == number:`\n `print('Поздравляю, вы угадали.')`\n `running = False`\n `elif guess < number:`\n `print('Нет, загаданное число немного больше этого.')`\n `else:`\n `print('Нет, загаданное число немного меньше этого.')`\n`else:`\n `print('Цикл while закончен.')`", - "5": " ** Цикл for ** \n\nОператор for..in также является оператором цикла, который осуществляет итерацию по последовательности объектов, т.е. проходит через каждый элемент в последовательности. __Мы узнаем больше о последовательностях в дальнейших главах, а пока просто запомните, что последовательность – это упорядоченный набор элементов.__", - "6": " ** Пример: ** \n\n`for i in range(1, 5):`\n `print(i)\nelse:`\n `print('Цикл for закончен')`", - "7": " ** Оператор break ** \n\nОператор break служит для прерывания цикла, т.е. остановки выполнения команд даже если условие выполнения цикла ещё не приняло значения False или последовательность элементов не закончилась.\n\n__Важно отметить, что если циклы for или while прервать оператором break, соответствующие им блоки else выполняться не будут.__", - "8": " ** Пример: ** \n\n`while True:`\n `s = input('Введите что-нибудь : ')`\n `if s == 'выход'`:\n `break`\n `print('Длина строки:', len(s))`", - "9": " ** Оператор continue ** \n\nОператор continue используется для указания Python, что необходимо пропустить все оставшиеся команды в текущем блоке цикла и продолжить со следующей итерации цикла", - "10": " ** Пример: ** \n\n`while True:`\n `s = input('Введите что-нибудь : ')`\n `if s == 'выход':`\n `break`\n `if len(s) < 3:`\n `print('Слишком мало')`\n `continue`\n `print('Введённая строка достаточной длины')`" + "Урок 4: Операторы и выражения": { + "Предисловие": "Большинство предложений (логических строк) в программах содержат выражения. Простой пример выражения: 2 + 3. Выражение можно разделить на операторы и операнды. Операторы – это некий функционал, производящий какие-либо действия, который может быть представлен в виде символов, как например +, или специальных зарезервированных слов. Операторы могут производить некоторые действия над данными, и эти данные называются операндами. В нашем случае 2 и 3 – это операнды.", + "Оператор сложение": "Объяснение: суммирует два объекта. \n\nПример: 3 + 5 даст 8; 'a' + 'b' даст 'ab'", + "Оператор вычитание": "Объяснение: Даёт разность двух чисел; если первый операнд отсутствует, он считается равным нулю. \n\nПример: -5.2 даст отрицательное число, а 50 - 24 даст 26.", + "Оператор умножение": "Объяснение: Даёт произведение двух чисел или возвращает строку, повторённую заданное число раз. \n\nПример: 2 * 3 даст 6. 'la' * 3 даст 'lalala'", + "Оператор деление": "Объяснение: Возвращает частное от деления x на y. \n\nПример: 4 / 2 даст 2", + "Оператор меньше": "Объяснение: Определяет, верно ли, что x меньше y. Все операторы сравнения возвращают True или False. Обратите внимание на заглавные буквы в этих словах. \n\nПример: 5 < 3 даст False", + "Оператор больше": "Объяснение: Определяет, верно ли, что x больше y. \n\nПример: 5 > 3 даст True", + "Оператор равно": "Объяснение: Проверяет,одинаковы ли объекты. \n\nПример: x = 2; y = 2; x == y даёт True", + "Оператор не равно": "Объяснение: Проверяет, верно ли, что объекты не равны. \n\nПример: x = 2; y = 3; x != y даёт True", + "Оператор логическое НЕ": "Объяснение: Если x равно True, оператор вернёт False. Если же x равно False, получим True. \n\nПример: x = True; not x даёт False", + "Оператор логическое И": "Объяснение: x and y даёт False, если x равно False , в противном случае возвращает значение y. \n\nПример: x = False; y = True; x and y возвращает False, поскольку x равно False", + "Оператор логическое ИЛИ": "Объяснение: Если x равно True, в результате получим True, в противном случае получим значение y. \n\nПример: x = True; y = False; x or y даёт True" }, - "Урок 5: Функции": { - "0": " ** Предисловие ** \n\nФункции – это многократно используемые фрагменты программы. Они позволяют дать имя определённому блоку команд с тем, чтобы впоследствии запускать этот блок по указанному имени в любом месте программы и сколь угодно много раз. Это называется вызовом функции. Мы уже использовали много встроенных функций, как то len и range.\n\nФункции определяются при помощи зарезервированного слова def. После этого слова указывается имя функции, за которым следует пара скобок, в которых можно указать имена некоторых переменных, и заключительное двоеточие в конце строки. Далее следует блок команд, составляющих функцию.", - "1": " ** Пример: ** \n\n`def sayHello():`\n `print('Привет, Мир!')`\n`sayHello() # вызов функции`", - "2": " ** Как это работает: ** \n\nМы определили функцию с именем sayHello, используя описанный выше синтаксис. Эта функция не принимает параметров, поэтому в скобках не объявлены какие-либо переменные. Параметры функции – это некие входные данные, которые мы можем передать функции, чтобы получить соответствующий им результат.", - "3": " ** Параметры функций ** \n\nФункции могут принимать параметры, т.е. некоторые значения, передаваемые функции для того, чтобы она что-либо сделала с ними. Эти параметры похожи на переменные, за исключением того, что значение этих переменных указывается при вызове функции, и во время работы функции им уже присвоены их значения.\n\nПараметры указываются в скобках при объявлении функции и разделяются запятыми. Аналогично мы передаём значения, когда вызываем функцию. __Обратите внимание на терминологию: имена, указанные в объявлении функции, называются параметрами, тогда как значения, которые вы передаёте в функцию при её вызове, – аргументами.__", - "4": " ** Пример: ** \n\n`def printMax(a, b):`\n `if a > b:`\n `print(a, 'максимально')`\n `elif a == b:`\n `print(a, 'равно', b)`\n `else:`\n `print(b, 'максимально')`\n\n`printMax(3, 4) # прямая передача значений`\n\n`x = 5`\n`y = 7`\n\n`printMax(x, y) # передача переменных в качестве аргументов`", - "5": " ** Как это работает: ** \n\nЗдесь мы определили функцию с именем printMax, которая использует два параметра с именами a и b. Мы находим наибольшее число с применением простого оператора if..else и выводим это число.\n\nПри первом вызове функции printMax мы напрямую передаём числа в качестве аргументов. Во втором случае мы вызываем функцию с переменными в качестве аргументов. printMax(x, y) назначает значение аргумента x параметру a, а значение аргумента y – параметру b. В обоих случаях функция printMax работает одинаково.", - "6": " ** Локальные переменные ** \n\nПри объявлении переменных внутри определения функции, они никоим образом не связаны с другими переменными с таким же именем за пределами функции – т.е. имена переменных являются локальными в функции. Это называется областью видимости переменной. Область видимости всех переменных ограничена блоком, в котором они объявлены, начиная с точки объявления имени.", - "7": " ** Пример: ** \n\n`x = 50`\n\n`def func(x):`\n `print('x равен', x`\n `x = 2`\n `print('Замена локального x на', x)`\n\n`func(x)`\n`print('x по-прежнему', x)`", - "8": " ** Как это работает: ** \n\nПри первом выводе значения, присвоенного имени x, в первой строке функции Python sиспользует значение параметра, объявленного в основном блоке, выше определения функции.\n\nДалее мы назначаем x значение 2. Имя x локально для нашей функции. Поэтому когда мы заменяем значение x в функции, x, объявленный в основном блоке, остаётся незатронутым.\n\nПоследним вызовом функции print мы выводим значение x, указанное в основном блоке, подтверждая таким образом, что оно не изменилось при локальном присваивании значения в ранее вызванной функции.", - "9": " ** Зарезервированное слово global ** \n\nЧтобы присвоить некоторое значение переменной, определённой на высшем уровне программы необходимо указать глобально. Сделаем это при помощи зарезервированного слова global. Без применения global невозможно присвоить значение переменной, определённой за пределами функции.\n\nИспользование зарезервированного слова global достаточно ясно показывает, что переменная объявлена в самом внешнем блоке.", - "10": " ** Пример: ** \n\n`x = 50`\n\n`def func():`\n `global x`\n\n `print('x равно', x)`\n `x = 2`\n `print('Заменяем глобальное значение x на', x)`\n\n`func()`\n`print('Значение x составляет', x)`", - "11": " ** Как это работает: ** \n\nЗарезервированное слово global используется для того, чтобы объявить, что x – это глобальная переменная, а значит, когда мы присваиваем значение имени x внутри функции, это изменение отразится на значении переменной x в основном блоке программы.\n\n__Используя одно зарезервированное слово global, можно объявить сразу несколько переменных: global x, y, z.__", - "12": " ** Зарезервированное слово nonlocal ** \n\nМы увидели, как получать доступ к переменным в локальной и глобальной области видимости. Есть ещё один тип области видимости, называемый «нелокальной» (nonlocal) областью видимости, который представляет собой нечто среднее между первыми двумя. Нелокальные области видимости встречаются, когда вы определяете функции внутри функций.", - "13": " ** Пример: ** \n\n`def func_outer():`\n `x = 2`\n `print('x равно', x)`\n\n `def func_inner():`\n `nonlocal x`\n `x = 5`\n\n `func_inner()`\n `print('Локальное x сменилось на', x)`\n\n`func_outer()`", - "14": " ** Как это работает: ** \n\nКогда мы находимся внутри func_inner, переменная x, определённая в первой строке func_outer находится ни в локальной области видимости (определение переменной не входит в блок func_inner), ни в глобальной области видимости (она также и не в основном блоке программы). Мы объявляем, что хотим использовать именно эту переменную x, следующим образом: nonlocal x.", - "15": " ** Значения аргументов по умолчанию ** \n\nЗачастую часть параметров функций могут быть необязательными, и для них будут использоваться некоторые заданные значения по умолчанию, если пользователь не укажет собственных. Этого можно достичь с помощью значений аргументов по умолчанию. Их можно указать, добавив к имени параметра в определении функции оператор присваивания (=) с последующим значением.", - "16": " ** Пример: ** \n\n`def say(message, times = 1):`\n `print(message * times)`\n\n`say('Привет')`\n`say('Мир', 5)`", - "17": " ** Как это работает: ** \n\nФункция под именем say используется для вывода на экран строки указанное число раз. Если мы не указываем значения, по умолчанию строка выводится\nодин раз. Мы достигаем этого указанием значения аргумента по умолчанию, равного 1 для параметра times.\n\nПри первом вызове say мы указываем только строку, и функция выводит её один раз. При втором вызове say мы указываем также и аргумент 5, обозначая таким образом, что мы хотим сказать фразу 5 раз.", - "18": " ** Ключевые аргументы ** \n\nЕсли имеется некоторая функция с большим числом параметров, и при её вызове требуется указать только некоторые из них, значения этих параметров могут задаваться по их имени – это называется ключевые параметры. В этом случае для передачи аргументов функции используется имя (ключ) вместо позиции (как было до сих пор).\n\nЕсть два преимущества такого подхода: во-первых, использование функции становится легче, поскольку нет необходимости отслеживать порядок аргументов; во-вторых, можно задавать значения только некоторым избранным аргументам, при условии, что остальные параметры имеют значения аргумента по умолчанию.", - "19": " ** Пример: ** \n\n`def func(a, b=5, c=10):`\n `print('a равно', a, ', b равно', b, ', а c равно', c)`\n\n`func(3, 7)`\n`func(25, c=24)`\n`func(c=50, a=100)`", - "20": " ** Как это работает: ** \n\nФункция с именем func имеет один параметр без значения по умолчанию, за которым следуют два параметра со значениями по умолчанию.\n\nПри первом вызове, func(3, 7), параметр a получает значение 3, параметр b получает значение 7, а c получает своё значение по умолчанию, равное 10.\n\nПри втором вызове func(25, c=24) переменная a получает значение 25 в силу позиции аргумента. После этого параметр c получает значение 24 по имени, т.е. как ключевой параметр. Переменная b получает значение по умолчанию, равное 5.\n\nПри третьем обращении func(c=50, a=100) мы используем ключевые аргументы для всех указанных значений. Обратите внимание на то, что мы указываем значение для параметра c перед значением для a, даже несмотря на то, что в определении функции параметр a указан раньше c.", - "21": " ** Переменное число параметров ** \n\nИногда бывает нужно определить функцию, способную принимать любое число параметров. Этого можно достичь при помощи звёздочек", - "22": " ** Пример: ** \n\n`def total(a=5, *numbers,**phonebook):`\n `print('a', a)`\n\n `#проход по всем элементам кортежа`\n `for single_item in numbers:`\n `print('single_item', single_item)`\n\n `#проход по всем элементам словаря`\n `for first_part, second_part in phonebook.items():`\n `print(first_part,second_part)`\n\n`print(total(10,1,2,3,Jack=1123,John=2231,Inge=1560))`", - "23": " ** Как это работает: ** \n\nКогда мы объявляем параметр со звёздочкой (например, *param), все позиционные аргументы начиная с этой позиции и до конца будут собраны в кортеж под именем param.\n\nАналогично, когда мы объявляем параметры с двумя звёздочками (**param), все ключевые аргументы начиная с этой позиции и до конца будут собраны в словарь под именем param.", - "24": " ** Оператор return ** \n\nОператор return используется для возврата5 из функции, т.е. для прекращения её работы и выхода из неё. При этом можно также вернуть некоторое значение из функции.", - "25": " ** Пример: ** \n\n`def maximum(x, y):`\n `if x > y:`\n `return x`\n `elif x == y:`\n `return 'Числа равны.'`\n `else:`\n `return y`\n\n`print(maximum(2, 3))`", - "26": " ** Как это работает: ** \n\nФункция maximum возвращает максимальный из двух параметров, которые в\nданном случае передаются ей при вызове. Она использует обычный условный оператор if..else для определения наибольшего числа, а затем возвращает это число." + "Урок 5: Поток команд": { + "Предисловие": "В программах, которые мы до сих пор рассматривали, последовательность команд всегда выполнялась Python по порядку строго сверху вниз. А что, если нам необходимо изменить поток выполняющихся команд? Например, если требуется, чтобы программа принимала некоторое решение и выполняла различные действия в зависимости от ситуации; скажем, печатала «Доброе утро» или «Добрый вечер» в зависимости от времени суток. \n\nКак вы уже, наверное, догадались, этого можно достичь при помощи операторов управления потоком. В Python есть три оператора управления потоком: if, for и while.", + "Оператор if": "Оператор if используется для проверки условий: если условие верно, выполняется блок выражений (называемый «if-блок»), иначе выполняется другой блок выражений (называемый «else-блок»). Блок «else» является необязательным.", + "Пример оператора if": "`number = 23`\n`guess = int(input('Введите целое число : '))`\n\n`if guess == number:`\n `print('Поздравляю, вы угадали,') # Начало нового блока`\n `print('(хотя и не выиграли никакого приза!)')`\n`elif guess < number:`\n `print('Нет, загаданное число немного больше этого.') # Ещё один блок`\n`else:`\n `print('Нет, загаданное число немного меньше этого.')`", + "Оператор while": "Оператор while позволяет многократно выполнять блок команд до тех пор, пока выполняется некоторое условие. Это один из так называемых операторов цикла. Он также может иметь необязательный пункт else.", + "Пример оператора while": "`number = 23`\n`running = True`\n\n`while running:`\n `guess = int(input('Введите целое число : '))`\n\n `if guess == number:`\n `print('Поздравляю, вы угадали.')`\n `running = False`\n `elif guess < number:`\n `print('Нет, загаданное число немного больше этого.')`\n `else:`\n `print('Нет, загаданное число немного меньше этого.')`\n`else:`\n `print('Цикл while закончен.')`", + "Цикл for": "Оператор for..in также является оператором цикла, который осуществляет итерацию по последовательности объектов, т.е. проходит через каждый элемент в последовательности. __Мы узнаем больше о последовательностях в дальнейших главах, а пока просто запомните, что последовательность – это упорядоченный набор элементов.__", + "Пример цикла for": "`for i in range(1, 5):`\n `print(i)\nelse:`\n `print('Цикл for закончен')`", + "Оператор break": "Оператор break служит для прерывания цикла, т.е. остановки выполнения команд даже если условие выполнения цикла ещё не приняло значения False или последовательность элементов не закончилась.\n\n__Важно отметить, что если циклы for или while прервать оператором break, соответствующие им блоки else выполняться не будут.__", + "Пример оператора break": "`while True:`\n `s = input('Введите что-нибудь : ')`\n `if s == 'выход'`:\n `break`\n `print('Длина строки:', len(s))`", + "Оператор continue": "Оператор continue используется для указания Python, что необходимо пропустить все оставшиеся команды в текущем блоке цикла и продолжить со следующей итерации цикла", + "Пример оператора continue": "`while True:`\n `s = input('Введите что-нибудь : ')`\n `if s == 'выход':`\n `break`\n `if len(s) < 3:`\n `print('Слишком мало')`\n `continue`\n `print('Введённая строка достаточной длины')`" }, - "Урок 6: Модули": { - "0": " ** Предисловие ** \n\nКак можно использовать код повторно, помещая его в функции, мы уже видели. А что, если нам понадобится повторно использовать различные функции в других наших программах? Как вы уже, наверное, догадались, ответ – модули.\n\nСуществуют разные способы составления модулей, но самый простой – это создать файл с расширением .py, содержащий функции и переменные.\n\nДругой способ – написать модуль на том языке программирования, на котором написан сам интерпретатор Python. Например, можно писать модули на языке программирования C, которые после компиляции могут использоваться стандартным интерпретатором Python\n\nСперва посмотрим, как использовать модули стандартной библиотеки.", - "1": " ** Пример: ** \n\n`import sys`\n\n`print('Аргументы командной строки:')`\n`for i in sys.argv:`\n `print(i)`\n\n`print('\\n\\nПеременная PYTHONPATH содержит', sys.path, '\\n')`", - "2": " ** Как это работает: ** \n\nМы импортируем модуль sys.\n\nКогда выполняется команда import sys, идёт поиск модуля sys.\n\nДоступ к переменной argv в модуле sys предоставляется при помощи точки, т.е. sys.argv. Это явно показывает, что это имя является частью модуля sys.\n\nКогда мы запускаем «python using_sys.py we are arguments», мы запускаем модуль using_sys.py командой python, а всё, что следует далее – аргументы, передаваемые программе. Python сохраняет аргументы командной строки в переменной sys.argv для дальнейшего использования.", - "3": " ** Файлы байткода .pyc ** \n\nИмпорт модуля – относительно дорогостоящее мероприятие, поэтому Python предпринимает некоторые трюки для ускорения этого процесса. Один из способов – создать байткомпилированные файлы (или байткод) с расширением .pyc, которые являются некой промежуточной формой, в которую Python переводит программу (помните раздел «Введение» о том, как работает Python?). Такой файл .pyc полезен при импорте модуля в следующий раз в другую программу – это произойдёт намного быстрее, поскольку значительная часть обработки, требуемой при импорте модуля, будет уже проделана. Этот байткод также является платформо-независимым.", - "4": " ** Оператор from... import... ** \n\nЧтобы импортировать переменную argv прямо в программу и не писать всякий раз sys. При обращении к ней, можно воспользоваться выражением «from sys import argv».\n\nДля импорта всех имён, использующихся в модуле sys, можно выполнить команду «from sys import *». Это работает для любых модулей.\n\nВ общем случае вам следует избегать использования этого оператора и использовать вместо этого оператор import, чтобы предотвратить конфликты имён и не затруднять чтение программы.", - "5": " ** Создание собственных модулей ** \n\nСоздать собственный модуль очень легко. Да вы всё время делали это! Ведь каждая программа на Python также является и модулем. Необходимо лишь убедиться, что у неё установлено расширение .py.", - "6": " ** Пример: ** \n\n`def sayhi():`\n `print('Привет! Это говорит мой модуль.')`\n\n`__version__ = '0.1'`\n\n`# Конец модуля mymodule.py`", - "7": " ** Функция dir ** \n\nВстроенная функция dir() возвращает список имён, определяемых объектом. Например, для модуля в этот список входят функции, классы и переменные, определённые в этом модуле.\n\nЭта функция может принимать аргументы. Если в качестве аргумента указано имя модуля, она возвращает список имён, определённых в этом модуле. Если никакого аргумента не передавать, она вернёт список имён, определённых в текущем модуле.", - "8": " ** Пример: ** \n\n`$ python3`\n\n`>>> import sys # получим список атрибутов модуля 'sys'`\n\n`>>> dir(sys)`\n`['getfilesystemencoding', 'getprofile', 'getrecursionlimit', 'getrefcount', 'getsizeof', 'gettrace', porter_cache', 'platform', 'prefix', 'ps1', 'ps2', 'setcheckinterval', 'setprofile', 'setrecursionlimit', 'settrace', 'stderr', 'stdin', 'stdout', 'subversion', 'version', 'version_info', 'warnoptions', 'winver']`\n\n`>>> dir() # получим список атрибутов текущего модуля`\n`['__builtins__', '__doc__', '__name__', '__package__', 'sys']`\n\n`>>> a = 5 # создадим новую переменную 'a'`\n\n`>>> dir()`\n`['__builtins__', '__doc__', '__name__', '__package__', 'a', 'sys']`\n\n`>>> del a # удалим имя 'a'`\n\n`>>> dir()`\n`['__builtins__', '__doc__', '__name__', '__package__', 'sys']`\n\n`>>>`", - "9": " ** Как это работает: ** \n\nМы вызываем функцию dir, не передавая ей параметров. По умолчанию, она возвращает список атрибутов текущего модуля. __Обратите внимание, что список импортированных модулей также входит туда.__\n\nЧтобы пронаблюдать за действием dir, мы определяем новую переменную a и присваиваем ей значение, а затем снова вызываем dir. Видим, что в полученном списке появилось дополнительное значение. Удалим переменную/атрибут из текущего модуля при помощи оператора del, и изменения вновь отобразятся на выводе функции dir.\n\nЗамечание по поводу del: этот оператор используется для удаления переменной/имени, и после его выполнения, в данном случае – del a, к переменной a больше невозможно обратиться – её как будто никогда и не было.", - "10": " ** Пакеты ** \n\nК настоящему времени вы, вероятно, начали наблюдать некоторую иерархию в организации ваших программ. Переменные обычно находятся в функциях. Функции и глобальные переменные обычно находятся в модулях. А что, если возникнет необходимость как-то организовать модули? Вот здесь-то и выходят на сцену пакеты.\n\nПакеты – это просто каталоги с модулями и специальным файлом __init__.py, который показывает Python, что этот каталог особый, так как содержит модули Python.\n\nПредставим, что мы хотим создать пакет под названием «world» с субпакетами «asia», «africa» и т.д., которые, в свою очередь, будут содержать модули «india», «madagascar» и т.д.", - "11": " ** Пример: ** \n\nПредставим, что мы хотим создать пакет под названием «world» с субпакетами «asia», «africa» и т.д., которые, в свою очередь, будут содержать модули «india», «madagascar» и т.д.\n\nДля этого следовало бы создать следующую структуру каталогов:\n\n`| - <некоторый каталог из sys.path>/`\n`| |---- world/`\n`| |---- __init__.py`\n`| |---- asia/`\n`| | |---- __init__.py`\n`| | |---- india/`\n`| | |---- __init__.py`\n`| | |---- foo.py`\n`| |---- africa/`\n`| |---- __init__.py`\n`| |---- madagascar/`\n`| |---- __init__.py`\n`| |---- bar.py`" + "Урок 6: Функции": { + "Предисловие": "Функции – это многократно используемые фрагменты программы. Они позволяют дать имя определённому блоку команд с тем, чтобы впоследствии запускать этот блок по указанному имени в любом месте программы и сколь угодно много раз. Это называется вызовом функции. Мы уже использовали много встроенных функций, как то len и range.\n\nФункции определяются при помощи зарезервированного слова def. После этого слова указывается имя функции, за которым следует пара скобок, в которых можно указать имена некоторых переменных, и заключительное двоеточие в конце строки. Далее следует блок команд, составляющих функцию.", + "Пример применения функций": "`def sayHello():`\n `print('Привет, Мир!')`\n`sayHello() # вызов функции`", + "Как это работают функции": "Мы определили функцию с именем sayHello, используя описанный выше синтаксис. Эта функция не принимает параметров, поэтому в скобках не объявлены какие-либо переменные. Параметры функции – это некие входные данные, которые мы можем передать функции, чтобы получить соответствующий им результат.", + "Параметры функций": "Функции могут принимать параметры, т.е. некоторые значения, передаваемые функции для того, чтобы она что-либо сделала с ними. Эти параметры похожи на переменные, за исключением того, что значение этих переменных указывается при вызове функции, и во время работы функции им уже присвоены их значения.\n\nПараметры указываются в скобках при объявлении функции и разделяются запятыми. Аналогично мы передаём значения, когда вызываем функцию. __Обратите внимание на терминологию: имена, указанные в объявлении функции, называются параметрами, тогда как значения, которые вы передаёте в функцию при её вызове, – аргументами.__", + "Пример": "`def printMax(a, b):`\n `if a > b:`\n `print(a, 'максимально')`\n `elif a == b:`\n `print(a, 'равно', b)`\n `else:`\n `print(b, 'максимально')`\n\n`printMax(3, 4) # прямая передача значений`\n\n`x = 5`\n`y = 7`\n\n`printMax(x, y) # передача переменных в качестве аргументов`", + "Как это работает": "Здесь мы определили функцию с именем printMax, которая использует два параметра с именами a и b. Мы находим наибольшее число с применением простого оператора if..else и выводим это число.\n\nПри первом вызове функции printMax мы напрямую передаём числа в качестве аргументов. Во втором случае мы вызываем функцию с переменными в качестве аргументов. printMax(x, y) назначает значение аргумента x параметру a, а значение аргумента y – параметру b. В обоих случаях функция printMax работает одинаково.", + "Локальные переменные": "При объявлении переменных внутри определения функции, они никоим образом не связаны с другими переменными с таким же именем за пределами функции – т.е. имена переменных являются локальными в функции. Это называется областью видимости переменной. Область видимости всех переменных ограничена блоком, в котором они объявлены, начиная с точки объявления имени.", + "Пример": "`x = 50`\n\n`def func(x):`\n `print('x равен', x`\n `x = 2`\n `print('Замена локального x на', x)`\n\n`func(x)`\n`print('x по-прежнему', x)`", + "Как это работает": "При первом выводе значения, присвоенного имени x, в первой строке функции Python sиспользует значение параметра, объявленного в основном блоке, выше определения функции.\n\nДалее мы назначаем x значение 2. Имя x локально для нашей функции. Поэтому когда мы заменяем значение x в функции, x, объявленный в основном блоке, остаётся незатронутым.\n\nПоследним вызовом функции print мы выводим значение x, указанное в основном блоке, подтверждая таким образом, что оно не изменилось при локальном присваивании значения в ранее вызванной функции.", + "Зарезервированное слово global": "Чтобы присвоить некоторое значение переменной, определённой на высшем уровне программы необходимо указать глобально. Сделаем это при помощи зарезервированного слова global. Без применения global невозможно присвоить значение переменной, определённой за пределами функции.\n\nИспользование зарезервированного слова global достаточно ясно показывает, что переменная объявлена в самом внешнем блоке.", + "Пример": "`x = 50`\n\n`def func():`\n `global x`\n\n `print('x равно', x)`\n `x = 2`\n `print('Заменяем глобальное значение x на', x)`\n\n`func()`\n`print('Значение x составляет', x)`", + "Как это работает": "Зарезервированное слово global используется для того, чтобы объявить, что x – это глобальная переменная, а значит, когда мы присваиваем значение имени x внутри функции, это изменение отразится на значении переменной x в основном блоке программы.\n\n__Используя одно зарезервированное слово global, можно объявить сразу несколько переменных: global x, y, z.__", + "Зарезервированное слово nonlocal": "****\n\nМы увидели, как получать доступ к переменным в локальной и глобальной области видимости. Есть ещё один тип области видимости, называемый «нелокальной» (nonlocal) областью видимости, который представляет собой нечто среднее между первыми двумя. Нелокальные области видимости встречаются, когда вы определяете функции внутри функций.", + "Пример": "`def func_outer():`\n `x = 2`\n `print('x равно', x)`\n\n `def func_inner():`\n `nonlocal x`\n `x = 5`\n\n `func_inner()`\n `print('Локальное x сменилось на', x)`\n\n`func_outer()`", + "Как это работает": "Когда мы находимся внутри func_inner, переменная x, определённая в первой строке func_outer находится ни в локальной области видимости (определение переменной не входит в блок func_inner), ни в глобальной области видимости (она также и не в основном блоке программы). Мы объявляем, что хотим использовать именно эту переменную x, следующим образом: nonlocal x.", + "Значения аргументов по умолчанию": "Зачастую часть параметров функций могут быть необязательными, и для них будут использоваться некоторые заданные значения по умолчанию, если пользователь не укажет собственных. Этого можно достичь с помощью значений аргументов по умолчанию. Их можно указать, добавив к имени параметра в определении функции оператор присваивания (=) с последующим значением.", + "Пример": "`def say(message, times = 1):`\n `print(message * times)`\n\n`say('Привет')`\n`say('Мир', 5)`", + "Как это работает": "Функция под именем say используется для вывода на экран строки указанное число раз. Если мы не указываем значения, по умолчанию строка выводится\nодин раз. Мы достигаем этого указанием значения аргумента по умолчанию, равного 1 для параметра times.\n\nПри первом вызове say мы указываем только строку, и функция выводит её один раз. При втором вызове say мы указываем также и аргумент 5, обозначая таким образом, что мы хотим сказать фразу 5 раз.", + "Ключевые аргументы": "Если имеется некоторая функция с большим числом параметров, и при её вызове требуется указать только некоторые из них, значения этих параметров могут задаваться по их имени – это называется ключевые параметры. В этом случае для передачи аргументов функции используется имя (ключ) вместо позиции (как было до сих пор).\n\nЕсть два преимущества такого подхода: во-первых, использование функции становится легче, поскольку нет необходимости отслеживать порядок аргументов; во-вторых, можно задавать значения только некоторым избранным аргументам, при условии, что остальные параметры имеют значения аргумента по умолчанию.", + "Пример": "`def func(a, b=5, c=10):`\n `print('a равно', a, ', b равно', b, ', а c равно', c)`\n\n`func(3, 7)`\n`func(25, c=24)`\n`func(c=50, a=100)`", + "Как это работает": "Функция с именем func имеет один параметр без значения по умолчанию, за которым следуют два параметра со значениями по умолчанию.\n\nПри первом вызове, func(3, 7), параметр a получает значение 3, параметр b получает значение 7, а c получает своё значение по умолчанию, равное 10.\n\nПри втором вызове func(25, c=24) переменная a получает значение 25 в силу позиции аргумента. После этого параметр c получает значение 24 по имени, т.е. как ключевой параметр. Переменная b получает значение по умолчанию, равное 5.\n\nПри третьем обращении func(c=50, a=100) мы используем ключевые аргументы для всех указанных значений. Обратите внимание на то, что мы указываем значение для параметра c перед значением для a, даже несмотря на то, что в определении функции параметр a указан раньше c.", + "Переменное число параметров": "Иногда бывает нужно определить функцию, способную принимать любое число параметров. Этого можно достичь при помощи звёздочек", + "Пример": "`def total(a=5, *numbers, **phonebook):`\n `print('a', a)`\n\n `#проход по всем элементам кортежа`\n `for single_item in numbers:`\n `print('single_item', single_item)`\n\n `#проход по всем элементам словаря`\n `for first_part, second_part in phonebook.items():`\n `print(first_part,second_part)`\n\n`print(total(10,1,2,3,Jack=1123,John=2231,Inge=1560))`", + "Как это работает": "Когда мы объявляем параметр со звёздочкой (например, *param), все позиционные аргументы начиная с этой позиции и до конца будут собраны в кортеж под именем param.\n\nАналогично, когда мы объявляем параметры с двумя звёздочками (**param), все ключевые аргументы начиная с этой позиции и до конца будут собраны в словарь под именем param.", + "Оператор return": "Оператор return используется для возврата5 из функции, т.е. для прекращения её работы и выхода из неё. При этом можно также вернуть некоторое значение из функции.", + "Пример": "`def maximum(x, y):`\n `if x > y:`\n `return x`\n `elif x == y:`\n `return 'Числа равны.'`\n `else:`\n `return y`\n\n`print(maximum(2, 3))`", + "Как это работает": "Функция maximum возвращает максимальный из двух параметров, которые в\nданном случае передаются ей при вызове. Она использует обычный условный оператор if..else для определения наибольшего числа, а затем возвращает это число." }, - "Урок 7: Структуры данных": { - "0": " ** Предисловие ** \n\nСтруктуры данных – это, по сути, и есть структуры, которые могут хранить некоторые данные вместе. Другими словами, они используются для хранения связанных данных.\n\nВ Python существуют четыре встроенных структуры данных: список, кортеж, словарь и множество. Посмотрим, как ими пользоваться, и как они могут облегчить нам жизнь.", - "1": " ** Список ** \n\nСписок – это структура данных, которая содержит упорядоченный набор элементов, т.е. хранит последовательность элементов. Это легко представить, если вспомнить список покупок, в котором перечисляется, что нужно купить, с тем лишь исключением, что в списке покупок каждый элемент обычно размещается на отдельной строке, тогда как в Python они разделяются запятыми.\n\nСписок элементов должен быть заключён в квадратные скобки, чтобы Python понял, что это список. Как только список создан, можно добавлять, удалять или искать элементы в нём. Поскольку элементы можно добавлять и удалять, мы говорим, что список – это изменяемый тип данных, т.е. его можно модифицировать.", - "2": " ** Краткое введение в объекты и классы ** \n\nСписок – это один из примеров использования объектов и классов. Когда мы назначаем некоторой переменной i значение, скажем, целое число 5, это можно представить себе как создание объекта (т.е. экземпляра) i класса (т.е. типа) int. Чтобы лучше понять это, прочитайте help(int).\n\nКласс может также иметь методы, т.е. функции, определённые для использования только применительно к данному классу. Этот функционал будет доступен только когда имеется объект данного класса. Например, Python предоставляет метод append для класса list, который позволяет добавлять элемент к концу списка. Так mylist.append('and item') добавит эту строку к списку mylist. Обратите внимание на обозначение точкой для доступа к методам объектов.", - "3": " ** Пример: ** \n\n`shoplist = ['яблоки', 'манго', 'морковь', 'бананы']`\n\n`print('Я должен сделать', len(shoplist), 'покупки.')`\n\n`print('Покупки:', end=' ')`\n`for item in shoplist:`\n `print(item, end=' ')`\n\n`print('\\nТакже нужно купить риса.')`\n`shoplist.append('рис')`\n`print('Теперь мой список покупок таков:', shoplist)`\n\n`print('Отсортирую-ка я свой список')`\n`shoplist.sort()`\n`print('Отсортированный список покупок выглядит так:', shoplist)`\n\n`print('Первое, что мне нужно купить, это', shoplist[0])`\n`olditem = shoplist[0]`\n`del shoplist[0]`\n`print('Я купил', olditem)`\n`print('Теперь мой список покупок:', shoplist)`", - "4": " ** Как это работает: ** \n\nВ shoplist мы храним только строки с названиями того, что нужно купить.\n\nДалее мы добавляем элемент к списку при помощи append – метода объекта списка. Затем мы проверяем, действительно ли элемент был добавлен к списку, выводя содержимое списка на экран.\n\nЗатем мы сортируем список, используя метод sort объекта списка.\n\nДалее после совершения покупки мы хотим удалить её из списка. Это достигается применением оператора del.", - "5": " ** Кортеж ** \n\nКортежи служат для хранения нескольких объектов вместе. Их можно рассматривать как аналог списков, но без такой обширной функциональности, которую предоставляет класс списка. Одна из важнейших особенностей кортежей заключается в том, что они неизменяемы, так же, как и строки. Т.е. модифицировать кортежи невозможно.\n\nКортежи обозначаются указанием элементов, разделённых запятыми; по желанию их можно ещё заключить в круглые скобки.\n\nКортежи обычно используются в тех случаях, когда оператор или пользовательская функция должны наверняка знать, что набор значений, т.е. кортеж значений, не изменится.", - "6": " ** Пример: ** \n\n`zoo = ('питон', 'слон', 'пингвин') # помните, что скобки не обязательны`\n`print('Количество животных в зоопарке -', len(zoo))`\n\n`new_zoo = 'обезьяна', 'верблюд', zoo`\n`print('Количество клеток в зоопарке -', len(new_zoo))`\n`print('Все животные в новом зоопарке:', new_zoo)`\n`print('Животные, привезённые из старого зоопарка:', new_zoo[2])`\n`print('Последнее животное, привезённое из старого зоопарка -', new_zoo[2][2])`\n`print('Количество животных в новом зоопарке -', len(new_zoo)-1 + \\`\n `len(new_zoo[2])`", - "7": " ** Как это работает: ** \n\nПеременная zoo обозначает кортеж элементов. Функция len позволяет получить длину кортежа.\n\nТеперь мы перемещаем этих животных в новый зоопарк. Поэтому кортеж new_zoo содержит тех животных, которые уже там, наряду с привезёнными из старого зоопарка.\n\nДоступ к элементам кортежа осуществляется указанием позиции элемента, заключённой в квадратные скобки. Это называется оператором индексирования. Доступ к третьему элементу в new_zoo мы получаем, указывая new_zoo[2], а доступ к третьему элементу внутри третьего элемента в кортеже new_zoo – указывая new_zoo[2][2].", - "8": " ** Словарь ** \n\nСловарь – это некий аналог адресной книги, в которой можно найти адрес или контактную информацию о человеке, зная лишь его имя; т.е. некоторые ключи связаны со значениями.\n\nПары ключ-значение указываются в словаре следующим образом: «d = {key1 : value1, key2 : value2 }». Обратите внимание, что ключ и значение разделяются двоеточием, а пары друг от друга отделяются запятыми, а затем всё это заключается в фигурные скобки.", - "9": " ** Пример: ** \n\n`ab = { 'Swaroop' : 'swaroop@swaroopch.com',`\n `'Larry' : 'larry@wall.org',`\n `'Matsumoto' : 'matz@ruby-lang.org',`\n `'Spammer' : 'spammer@hotmail.com'`\n `}`\n\n`print(\"Адрес Swaroop'а:\", ab['Swaroop'])`\n\n`# Удаление пары ключ-значение`\n`del ab['Spammer']`\n\n`print('\\nВ адресной книге {0} контакта\\n'.format(len(ab)))`\n `print('Контакт {0} с адресом {1}'.format(name, address))`\n\n`# Добавление пары ключ-значение`\n`ab['Guido'] = 'guido@python.org'`\n\n`if 'Guido' in ab:`\n `print(\"\\nАдрес Guido:\", ab['Guido'])`", - "10": " ** Как это работает: ** \n\nМы создаём словарь ab. Затем мы обращаемся к парам ключ-значение. Как видите, синтаксис прост.\n\nУдалять пары ключ-значение можно при помощи оператора del. Мы указываем имя словаря и оператор индексирования для удаляемого ключа, после чего передаём это оператору del.\n\nДалее мы обращаемся ко всем парам ключ-значение нашего словаря, используя метод items, который возвращает список кортежей, каждый из которых содержит пару элементов: ключ и значение. Мы получаем эту пару и присваиваем её значение переменным name и address соответственно в цикле for..in, а затем выводим эти значения на экран в блоке for.", - "11": " ** Последовательности ** \n\nСписки, кортежи и строки являются примерами последовательностей. Но что такое последовательности и что в них такого особенного?\n\nОсновные возможности – это проверка принадлежности (т.е. выражения «in» и «not in») и оператор индексирования, позволяющий получить напрямую некоторый элемент последовательности.\n\nВсе три типа последовательностей, упоминавшиеся выше (списки, кортежи и строки), также предоставляют операцию получения вырезки, которая позволяет получить вырезку последовательности, т.е. её фрагмент.", - "12": " ** Пример: ** \n\n`shoplist = ['яблоки', 'манго', 'морковь', 'бананы']`\n`name = 'swaroop'`\n\n`# Операция индексирования`\n`print('Элемент 0 -', shoplist[0])`\n`print('Элемент 1 -', shoplist[1])`\n`print('Элемент 2 -', shoplist[2])`\n`print('Элемент 3 -', shoplist[3])`\n`print('Элемент -1 -', shoplist[-1])`\n`print('Элемент -2 -', shoplist[-2])`\n`print('Символ 0 -', name[0])`\n\n`# Вырезка из списка`\n`print('Элементы с 1 по 3:', shoplist[1:3])`\n`print('Элементы с 2 до конца:', shoplist[2:])`\n`print('Элементы с 1 по -1:', shoplist[1:-1])`\n`print('Элементы от начала до конца:', shoplist[:])`\n\n`# Вырезка из строки`\n`print('Символы с 1 по 3:', name[1:3])`\n`print('Символы с 2 до конца:', name[2:])`\n`print('Символы с 1 до -1:', name[1:-1])`\n`print('Символы от начала до конца:', name[:])`" + "Урок 7: Модули": { + "Предисловие": "Как можно использовать код повторно, помещая его в функции, мы уже видели. А что, если нам понадобится повторно использовать различные функции в других наших программах? Как вы уже, наверное, догадались, ответ – модули.\n\nСуществуют разные способы составления модулей, но самый простой – это создать файл с расширением .py, содержащий функции и переменные.\n\nДругой способ – написать модуль на том языке программирования, на котором написан сам интерпретатор Python. Например, можно писать модули на языке программирования C, которые после компиляции могут использоваться стандартным интерпретатором Python\n\nСперва посмотрим, как использовать модули стандартной библиотеки.", + "Пример": "`import sys`\n\n`print('Аргументы командной строки:')`\n`for i in sys.argv:`\n `print(i)`\n\n`print('\\n\\nПеременная PYTHONPATH содержит', sys.path, '\\n')`", + "Как это работает": "Мы импортируем модуль sys.\n\nКогда выполняется команда import sys, идёт поиск модуля sys.\n\nДоступ к переменной argv в модуле sys предоставляется при помощи точки, т.е. sys.argv. Это явно показывает, что это имя является частью модуля sys.\n\nКогда мы запускаем «python using_sys.py we are arguments», мы запускаем модуль using_sys.py командой python, а всё, что следует далее – аргументы, передаваемые программе. Python сохраняет аргументы командной строки в переменной sys.argv для дальнейшего использования.", + "Файлы байткода .pyc": "Импорт модуля – относительно дорогостоящее мероприятие, поэтому Python предпринимает некоторые трюки для ускорения этого процесса. Один из способов – создать байткомпилированные файлы (или байткод) с расширением .pyc, которые являются некой промежуточной формой, в которую Python переводит программу (помните раздел «Введение» о том, как работает Python?). Такой файл .pyc полезен при импорте модуля в следующий раз в другую программу – это произойдёт намного быстрее, поскольку значительная часть обработки, требуемой при импорте модуля, будет уже проделана. Этот байткод также является платформо-независимым.", + "Оператор from... import...": "Чтобы импортировать переменную argv прямо в программу и не писать всякий раз sys. При обращении к ней, можно воспользоваться выражением «from sys import argv».\n\nДля импорта всех имён, использующихся в модуле sys, можно выполнить команду «from sys import *». Это работает для любых модулей.\n\nВ общем случае вам следует избегать использования этого оператора и использовать вместо этого оператор import, чтобы предотвратить конфликты имён и не затруднять чтение программы.", + "Создание собственных модулей": "Создать собственный модуль очень легко. Да вы всё время делали это! Ведь каждая программа на Python также является и модулем. Необходимо лишь убедиться, что у неё установлено расширение .py.", + "Пример": "`def sayhi():`\n `print('Привет! Это говорит мой модуль.')`\n\n`__version__ = '0.1'`\n\n`# Конец модуля mymodule.py`", + "Функция dir": "Встроенная функция dir() возвращает список имён, определяемых объектом. Например, для модуля в этот список входят функции, классы и переменные, определённые в этом модуле.\n\nЭта функция может принимать аргументы. Если в качестве аргумента указано имя модуля, она возвращает список имён, определённых в этом модуле. Если никакого аргумента не передавать, она вернёт список имён, определённых в текущем модуле.", + "Пример": "`$ python3`\n\n`>>> import sys # получим список атрибутов модуля 'sys'`\n\n`>>> dir(sys)`\n`['getfilesystemencoding', 'getprofile', 'getrecursionlimit', 'getrefcount', 'getsizeof', 'gettrace', porter_cache', 'platform', 'prefix', 'ps1', 'ps2', 'setcheckinterval', 'setprofile', 'setrecursionlimit', 'settrace', 'stderr', 'stdin', 'stdout', 'subversion', 'version', 'version_info', 'warnoptions', 'winver']`\n\n`>>> dir() # получим список атрибутов текущего модуля`\n`['__builtins__', '__doc__', '__name__', '__package__', 'sys']`\n\n`>>> a = 5 # создадим новую переменную 'a'`\n\n`>>> dir()`\n`['__builtins__', '__doc__', '__name__', '__package__', 'a', 'sys']`\n\n`>>> del a # удалим имя 'a'`\n\n`>>> dir()`\n`['__builtins__', '__doc__', '__name__', '__package__', 'sys']`\n\n`>>>`", + "Как это работает": "Мы вызываем функцию dir, не передавая ей параметров. По умолчанию, она возвращает список атрибутов текущего модуля. __Обратите внимание, что список импортированных модулей также входит туда.__\n\nЧтобы пронаблюдать за действием dir, мы определяем новую переменную a и присваиваем ей значение, а затем снова вызываем dir. Видим, что в полученном списке появилось дополнительное значение. Удалим переменную/атрибут из текущего модуля при помощи оператора del, и изменения вновь отобразятся на выводе функции dir.\n\nЗамечание по поводу del: этот оператор используется для удаления переменной/имени, и после его выполнения, в данном случае – del a, к переменной a больше невозможно обратиться – её как будто никогда и не было.", + "Пакеты": "К настоящему времени вы, вероятно, начали наблюдать некоторую иерархию в организации ваших программ. Переменные обычно находятся в функциях. Функции и глобальные переменные обычно находятся в модулях. А что, если возникнет необходимость как-то организовать модули? Вот здесь-то и выходят на сцену пакеты.\n\nПакеты – это просто каталоги с модулями и специальным файлом __init__.py, который показывает Python, что этот каталог особый, так как содержит модули Python.\n\nПредставим, что мы хотим создать пакет под названием «world» с субпакетами «asia», «africa» и т.д., которые, в свою очередь, будут содержать модули «india», «madagascar» и т.д.", + "Пример": "Представим, что мы хотим создать пакет под названием «world» с субпакетами «asia», «africa» и т.д., которые, в свою очередь, будут содержать модули «india», «madagascar» и т.д.\n\nДля этого следовало бы создать следующую структуру каталогов:\n\n`| - <некоторый каталог из sys.path>/`\n`| |---- world/`\n`| |---- __init__.py`\n`| |---- asia/`\n`| | |---- __init__.py`\n`| | |---- india/`\n`| | |---- __init__.py`\n`| | |---- foo.py`\n`| |---- africa/`\n`| |---- __init__.py`\n`| |---- madagascar/`\n`| |---- __init__.py`\n`| |---- bar.py`" }, - "Урок 8: Исключения": { - "0": "Предисловие \n\nИсключения возникают тогда, когда в программе возникает некоторая исключительная ситуация. Например, к чему приведёт попытка чтения несуществующего файла? Или если файл был случайно удалён, пока программа работала? Такие ситуации обрабатываются при помощи исключений.\n\nЭто касается и программ, содержащих недействительные команды. В этом случае Python поднимает руки и сообщает, что обнаружил ошибку.", - "1": " ** Ошибки ** \n\nРассмотрим простой вызов функции print. Что, если мы ошибочно напишем print как Print? Обратите внимание на заглавную букву. В этом случае Python поднимает синтаксическую ошибку.", - "2": " ** Пример: ** \n\n`>>> Print('Привет, Мир!')`\n`Traceback (most recent call last):`\n `File \"\", line 1, in `\n `Print('Привет, Мир!')`\n`NameError: name 'Print' is not defined`\n\nОбратите внимание, что была поднята ошибка NameError, а также указано место, где была обнаружена ошибка. Так в данном случае действует обработчик ошибок.", - "3": " ** Исключения ** \n\nПопытаемся считать что-либо от пользователя. Нажмите Сtrl-D (или Ctrl+Z в Windows) и посмотрите, что произойдёт.", - "4": " ** Пример: ** \n\n`>>> s = input('Введите что-нибудь --> ')`\n\n`Введите что-нибудь -->`\n`Traceback (most recent call last):`\n `File \"\", line 1, in `\n `s = input('Введите что-нибудь --> ') `\n`EOFError: EOF when reading a line`\n\nPython поднимает ошибку с именем EOFError, что означает, что он обнаружил символ конца файла (который вводится при помощи Ctrl-D) там, где не ожидал.", - "5": " ** Обработка исключений ** \n\nОбрабатывать исключения можно при помощи оператора try..except. При этом все обычные команды помещаются внутрь try-блока, а все обработчики исключений – в except-блок.", - "6": " ** Пример: ** \n\n`try:`\n `text = input('Введите что-нибудь --> ')`\n`except EOFError:`\n `print('Ну зачем вы сделали мне EOF?')`\n`except KeyboardInterrupt:`\n `print('Вы отменили операцию.')`\n`else:`\n `print('Вы ввели {0}'.format(text))`", - "7": " ** Как это работает: ** \n\nЗдесь мы поместили все команды, которые могут вызвать исключения/ошибки, внутрь блока try, а затем поместили обработчики соответствующих ошибок/исключений в блок except. Выражение except может обрабатывать как одиночную ошибку или исключение, так и список ошибок/исключений в скобках. Если не указано имя ошибки или исключения, обрабатываться будут все ошибки и исключения.", - "8": " ** Вызов исключения ** \n\nИсключение можно поднять при помощи оператора raise, передав ему имя ошибки/исключения, а также объект исключения, который нужно выбросить.\n\nВызываемая ошибка или исключение должна быть классом, который прямо или непрямо является производным от класса Exception.", - "9": " ** Пример: ** \n\n`class ShortInputException(Exception):`\n `'''Пользовательский класс исключения.'''`\n `def __init__(self, length, atleast):`\n `Exception.__init__(self)`\n `self.length = length`\n `self.atleast = atleast`\n\n`try:`\n `text = input('Введите что-нибудь --> ')`\n `if len(text) < 3:`\n `raise ShortInputException(len(text), 3)`\n `# Здесь может происходить обычная работа`\n`except EOFError:`\n `print('Ну зачем вы сделали мне EOF?')`\n`except ShortInputException as ex:`\n `print('ShortInputException: Длина введённой строки -- {0}; \\`\n `ожидалось, как минимум, {1}'.format(ex.length, ex.atleast))`\n`else:`\n `print('Не было исключений.')`", - "10": " ** Как это работает: ** \n\nЗдесь мы создаём наш собственный тип исключения. Этот новый тип исключения называется ShortInputException. Он содержит два поля: length, хранящее длину введённого текста, и atleast, указывающее, какую минимальную длину текста ожидала программа.\n\nВ пункте except мы указываем класс ошибки ShortInputException, который будет сохранён как переменная ex, содержащая соответствующий объект ошибки/исключения. Это аналогично параметрам и аргументам при вызове функции. Внутри этого пункта except мы используем поля length и atleast объекта исключения для вывода необходимых сообщений пользователю.", - "11": " ** Try .. Finally ** \n\nПредставим, что в программе происходит чтение файла и необходимо убедиться, что объект файла был корректно закрыт и что не возникло никакого исключения. Этого можно достичь с применением блока finally.", - "12": " ** Пример: ** \n\n`import time`\n\n`try:`\n `f = open('poem.txt')`\n `while True: # наш обычный способ читать файлы`\n `line = f.readline()`\n `if len(line) == 0:`\n `break`\n `print(line, end='')`\n `time.sleep(2) # Пусть подождёт некоторое время`\n`except KeyboardInterrupt:`\n `print('!! Вы отменили чтение файла.')`\n`finally:`\n `f.close()`\n `print('(Очистка: Закрытие файла)')`", - "13": " ** Как это работает: ** \n\nЗдесь мы производим обычные операции чтения из файла, но в данном случае добавляем двухсекундный сон после вывода каждой строки при помощи функции time.sleep, чтобы программа выполнялась медленно (ведь Python очень быстр от природы). Во время выполнения программы нажмите ctrl-c, чтобы прервать/отменить выполнение программы.\n\nПронаблюдайте, как при этом выдаётся исключение KeyboardInterrupt, и программа выходит. Однако, прежде чем программа выйдет, выполняется пункт finally, и файловый объект будет всегда закрыт.", - "14": " ** Оператор with ** \n\nТипичной схемой является запрос некоторого ресурса в блоке try с последующим освобождением этого ресурса в блоке finally. Для того, чтобы сделать это более «чисто»,существует оператор with:", - "15": " ** Пример: ** \n\n`with open(\"poem.txt\") as f:`\n `for line in f:`\n `print(line, end='')`", - "16": " ** Как это работает: ** \n\nСуществует некий протокол, используемый оператором with. Он считывает объект, возвращаемый операторомopen.Назовём его в данном случае «thefile».\n\nПеред запуском блока кода, содержащегося в нём, оператор with всегда вызывает функцию thefile.__enter__, а также всегда вызывает thefile.__exit__ после завершения выполнения этого блока кода.\n\nТак что код, который мы бы написали в блоке finally, будет автоматически обработан методом __exit__. Это избавляет нас от необходимости повторно в явном виде указывать операторы try..finally." + "Урок 8: Структуры данных": { + "Предисловие": "Структуры данных – это, по сути, и есть структуры, которые могут хранить некоторые данные вместе. Другими словами, они используются для хранения связанных данных.\n\nВ Python существуют четыре встроенных структуры данных: список, кортеж, словарь и множество. Посмотрим, как ими пользоваться, и как они могут облегчить нам жизнь.", + "Список": "Список – это структура данных, которая содержит упорядоченный набор элементов, т.е. хранит последовательность элементов. Это легко представить, если вспомнить список покупок, в котором перечисляется, что нужно купить, с тем лишь исключением, что в списке покупок каждый элемент обычно размещается на отдельной строке, тогда как в Python они разделяются запятыми.\n\nСписок элементов должен быть заключён в квадратные скобки, чтобы Python понял, что это список. Как только список создан, можно добавлять, удалять или искать элементы в нём. Поскольку элементы можно добавлять и удалять, мы говорим, что список – это изменяемый тип данных, т.е. его можно модифицировать.", + "Краткое введение в объекты и классы": "Список – это один из примеров использования объектов и классов. Когда мы назначаем некоторой переменной i значение, скажем, целое число 5, это можно представить себе как создание объекта (т.е. экземпляра) i класса (т.е. типа) int. Чтобы лучше понять это, прочитайте help(int).\n\nКласс может также иметь методы, т.е. функции, определённые для использования только применительно к данному классу. Этот функционал будет доступен только когда имеется объект данного класса. Например, Python предоставляет метод append для класса list, который позволяет добавлять элемент к концу списка. Так mylist.append('and item') добавит эту строку к списку mylist. Обратите внимание на обозначение точкой для доступа к методам объектов.", + "Пример": "`shoplist = ['яблоки', 'манго', 'морковь', 'бананы']`\n\n`print('Я должен сделать', len(shoplist), 'покупки.')`\n\n`print('Покупки:', end=' ')`\n`for item in shoplist:`\n `print(item, end=' ')`\n\n`print('\\nТакже нужно купить риса.')`\n`shoplist.append('рис')`\n`print('Теперь мой список покупок таков:', shoplist)`\n\n`print('Отсортирую-ка я свой список')`\n`shoplist.sort()`\n`print('Отсортированный список покупок выглядит так:', shoplist)`\n\n`print('Первое, что мне нужно купить, это', shoplist[0])`\n`olditem = shoplist[0]`\n`del shoplist[0]`\n`print('Я купил', olditem)`\n`print('Теперь мой список покупок:', shoplist)`", + "Как это работает": "В shoplist мы храним только строки с названиями того, что нужно купить.\n\nДалее мы добавляем элемент к списку при помощи append – метода объекта списка. Затем мы проверяем, действительно ли элемент был добавлен к списку, выводя содержимое списка на экран.\n\nЗатем мы сортируем список, используя метод sort объекта списка.\n\nДалее после совершения покупки мы хотим удалить её из списка. Это достигается применением оператора del.", + "Кортеж": "Кортежи служат для хранения нескольких объектов вместе. Их можно рассматривать как аналог списков, но без такой обширной функциональности, которую предоставляет класс списка. Одна из важнейших особенностей кортежей заключается в том, что они неизменяемы, так же, как и строки. Т.е. модифицировать кортежи невозможно.\n\nКортежи обозначаются указанием элементов, разделённых запятыми; по желанию их можно ещё заключить в круглые скобки.\n\nКортежи обычно используются в тех случаях, когда оператор или пользовательская функция должны наверняка знать, что набор значений, т.е. кортеж значений, не изменится.", + "Пример": "`zoo = ('питон', 'слон', 'пингвин') # помните, что скобки не обязательны`\n`print('Количество животных в зоопарке -', len(zoo))`\n\n`new_zoo = 'обезьяна', 'верблюд', zoo`\n`print('Количество клеток в зоопарке -', len(new_zoo))`\n`print('Все животные в новом зоопарке:', new_zoo)`\n`print('Животные, привезённые из старого зоопарка:', new_zoo[2])`\n`print('Последнее животное, привезённое из старого зоопарка -', new_zoo[2][2])`\n`print('Количество животных в новом зоопарке -', len(new_zoo)-1 + \\`\n `len(new_zoo[2])`", + "Как это работает": "Переменная zoo обозначает кортеж элементов. Функция len позволяет получить длину кортежа.\n\nТеперь мы перемещаем этих животных в новый зоопарк. Поэтому кортеж new_zoo содержит тех животных, которые уже там, наряду с привезёнными из старого зоопарка.\n\nДоступ к элементам кортежа осуществляется указанием позиции элемента, заключённой в квадратные скобки. Это называется оператором индексирования. Доступ к третьему элементу в new_zoo мы получаем, указывая new_zoo[2], а доступ к третьему элементу внутри третьего элемента в кортеже new_zoo – указывая new_zoo[2][2].", + "Словарь": "Словарь – это некий аналог адресной книги, в которой можно найти адрес или контактную информацию о человеке, зная лишь его имя; т.е. некоторые ключи связаны со значениями.\n\nПары ключ-значение указываются в словаре следующим образом: «d = {key1 : value1, key2 : value2 }». Обратите внимание, что ключ и значение разделяются двоеточием, а пары друг от друга отделяются запятыми, а затем всё это заключается в фигурные скобки.", + "Пример": "`ab = { 'Swaroop' : 'swaroop@swaroopch.com',`\n `'Larry' : 'larry@wall.org',`\n `'Matsumoto' : 'matz@ruby-lang.org',`\n `'Spammer' : 'spammer@hotmail.com'`\n `}`\n\n`print(\"Адрес Swaroop'а:\", ab['Swaroop'])`\n\n`# Удаление пары ключ-значение`\n`del ab['Spammer']`\n\n`print('\\nВ адресной книге {0} контакта\\n'.format(len(ab)))`\n `print('Контакт {0} с адресом {1}'.format(name, address))`\n\n`# Добавление пары ключ-значение`\n`ab['Guido'] = 'guido@python.org'`\n\n`if 'Guido' in ab:`\n `print(\"\\nАдрес Guido:\", ab['Guido'])`", + "Как это работает": "Мы создаём словарь ab. Затем мы обращаемся к парам ключ-значение. Как видите, синтаксис прост.\n\nУдалять пары ключ-значение можно при помощи оператора del. Мы указываем имя словаря и оператор индексирования для удаляемого ключа, после чего передаём это оператору del.\n\nДалее мы обращаемся ко всем парам ключ-значение нашего словаря, используя метод items, который возвращает список кортежей, каждый из которых содержит пару элементов: ключ и значение. Мы получаем эту пару и присваиваем её значение переменным name и address соответственно в цикле for..in, а затем выводим эти значения на экран в блоке for.", + "Последовательности": "Списки, кортежи и строки являются примерами последовательностей. Но что такое последовательности и что в них такого особенного?\n\nОсновные возможности – это проверка принадлежности (т.е. выражения «in» и «not in») и оператор индексирования, позволяющий получить напрямую некоторый элемент последовательности.\n\nВсе три типа последовательностей, упоминавшиеся выше (списки, кортежи и строки), также предоставляют операцию получения вырезки, которая позволяет получить вырезку последовательности, т.е. её фрагмент.", + "Пример": "`shoplist = ['яблоки', 'манго', 'морковь', 'бананы']`\n`name = 'swaroop'`\n\n`# Операция индексирования`\n`print('Элемент 0 -', shoplist[0])`\n`print('Элемент 1 -', shoplist[1])`\n`print('Элемент 2 -', shoplist[2])`\n`print('Элемент 3 -', shoplist[3])`\n`print('Элемент -1 -', shoplist[-1])`\n`print('Элемент -2 -', shoplist[-2])`\n`print('Символ 0 -', name[0])`\n\n`# Вырезка из списка`\n`print('Элементы с 1 по 3:', shoplist[1:3])`\n`print('Элементы с 2 до конца:', shoplist[2:])`\n`print('Элементы с 1 по -1:', shoplist[1:-1])`\n`print('Элементы от начала до конца:', shoplist[:])`\n\n`# Вырезка из строки`\n`print('Символы с 1 по 3:', name[1:3])`\n`print('Символы с 2 до конца:', name[2:])`\n`print('Символы с 1 до -1:', name[1:-1])`\n`print('Символы от начала до конца:', name[:])`" }, - "Урок 9: Дополнительно": { - "0": " ** Предисловие ** \n\nК настоящему моменту мы уже рассмотрели большую часть того, что вам придётся использовать при работе с Python. В этой главе мы охватим некоторые дополнительные аспекты, которые помогут отшлифовать ваши знания.", - "1": " ** Self ** \n\nМетоды класса имеют одно отличие от обычных функций: они должны иметь дополнительно имя, добавляемое к началу списка параметров. Однако, при вызове метода никакого значения этому параметру присваивать не нужно – его укажет Python. Эта переменная указывает на сам объект экземпляра класса, и по традиции она называется self.\n\nХотя этому параметру можно дать любое имя, настоятельно рекомендуется использовать только имя self; использование любого другого имени не приветствуется. Есть много достоинств использования стандартного имени: во-первых, любой человек, просматривающий вашу программу, легко узнает его; во-вторых, некоторые специализированные Интегрированные среды разработки (IDE) изначально рассчитаны на использование self.", - "2": " ** Классы ** \n\nКлассы предоставляют средства объединения данных и функциональности вместе. Создание нового класса создает объект нового типа, позволяя создавать новые экземпляры этого типа. К каждому экземпляру класса могут быть прикреплены атрибуты для поддержания его состояния. Экземпляры класса также могут иметь методы (определенные его классом) для изменения его состояния.", - "3": " ** Пример: ** \n\n`class Person:`\n `pass # Пустой блок`\n\n`p = Person()`\n`print(p)`", - "4": " ** Как это работает: ** \n\nМы создаём новый класс при помощи оператора class и имени класса. За этим следует блок выражений, формирующих тело класса. В данном случае блок у нас пуст, на что указывает оператор pass.\n\nДалее мы создаём объект-экземпляр класса, записывая имя класса со скобками. (Мы узнаем больше о реализации в следующем разделе). Для проверки мы выясняем тип переменной, просто выводя её на экран. Так мы видим, что у нас есть экземпляр класса Person в модуле __main__.\n\nОбратите внимание, что выводится также и адрес в памяти компьютера, где хранится ваш объект. На вашем компьютере адрес будет другим, так как Python хранит объекты там, где имеется свободное место.", - "5": " ** Методы объектов ** \n\nИтак, мы выяснили что классы/объекты могут иметь методы, представляющие собой функции, за исключением дополнительной переменной self. А теперь давайте рассмотрим пример", - "6": " ** Пример: ** \n\n`class Person:`\n `def sayHi(self):`\n `print('Привет! Как дела?')`\n\n`p = Person()`\n`p.sayHi()`", - "7": " ** Как это работает: ** \n\nЗдесь мы видим self в действии. __Обратите внимание, что метод sayHi не принимает параметров, но тем не менее, имеет self в определении функции.__", - "8": " ** Блоки в одно выражение ** \n\nМы неоднократно говорили, что каждый блок команд отделяется от других своим собственным уровнем отступа. Однако, существует и исключение. Если блок команд содержит только одно выражение, его можно указывать в одной строке с условным оператором или, скажем, оператором цикла. Рассмотрим это на примере:", - "9": " ** Пример: ** \n\n`>>> flag = True`\n`>>> if flag: print('Да')`\n`Да`\n\nОбратите внимание, что единственный оператор расположен в той же строке, а не отдельным блоком. Этот способ может подкупить тем, что якобы «сокращает» программу, но мы настоятельно рекомендуем избегать его во всех случаях, кроме проверки ошибок. Прежде всего, потому что гораздо легче добавлять команды, когда уже есть необходимый уровень отступа.", - "10": " ** Lambda-формы ** \n\nКлючевое слово lambda используется для создания функций и возврата их значения во время выполнения программы. lambda принимает параметр, за которым следует одно выражение, которое становится телом функции, а значение этого выражения возвращается новой функцией.", - "11": " ** Пример: ** \n\n`points = [ { 'x' : 2, 'y' : 3 }, { 'x' : 4, 'y' : 1 } ]`\n`points.sort(key=lambda i : i['y'])`\n`print(points)`", - "12": " ** Как это работает: ** \n\nОбратите внимание на то, что метод sort класса list может принимать параметр key, определяющий способ сортировки списка (обычно мы думаем только о сортировке по возрастанию или по убыванию). В данном случае мы хотим провести сортировку по собственному принципу, для чего нам необходимо написать соответствующую функцию. Но вместо того, чтобы создавать отдельный блок def для описания функции, которая будет использоваться только в этом месте, мы применяем лямбда-выражение.", - "13": " ** Генераторы списков ** \n\nГенераторы списков служат для создания новых списков на основе существующих. Представьте, что имеется список чисел, на основе которого требуется получить новый список, состоящий из всех чисел, умноженных на 2, но только при условии, что само число больше 2. Генераторы списков подходят для таких задач как нельзя лучше.", - "14": " ** Пример: ** \n\n`listone = [2, 3, 4]`\n`listtwo = [2*i for i in listone if i > 2]`\n`print(listtwo)`", - "15": " ** Как это работает: ** \n\nВ этом примере мы создаём новый список, указав операцию, которую необходимо произвести (2 * i), когда выполняется некоторое условие (if i > 2).Обратите внимание, что исходный список при этом не изменяется.", - "16": " ** Передача кортежей и словарей в функции ** \n\nДля получения параметров, переданных функции, в виде кортежа или словаря, существуют специальные приставки «*» или «**» соответственно. Это особенно полезно в случаях, когда функция может принимать переменное число параметров.", - "17": " ** Пример: ** \n\n`>>> def powersum(power, *args):`\n`... '''Возвращает сумму аргументов, возведённых в указанную степень.'''`\n`... total = 0`\n`... for i in args:`\n`... total += pow(i, power)`\n`... return total`\n`...`\n`>>> powersum(2, 3, 4)`\n`25`\n`>>> powersum(2, 10)`\n`100`\n\nПоскольку перед переменной args указана приставка «*», все дополнительные аргументы, переданные функции, сохранятся в args в виде кортежа. В случае использования приставки « ** » все дополнительные параметры будут рассматриваться как пары ключ/значение в словаре.", - "18": " ** exec и eval ** \n\nФункция exec служит для выполнения команд Python, содержащихся в строке или файле, в отличие от самого текста программы. Например, во время выполнения программы можно сформировать строку, содержащую текст программы на Python, и запустить его при помощи exec:", - "19": " ** Пример: ** \n\n`>>> exec('print(\"Здравствуй, Мир!\")')`\n`Здравствуй, Мир!`", - "20": " ** Оператор assert ** \n\nОператор assert существует для того, чтобы указать, что нечто является истиной. Например, если требуется гарантировать, что в списке будет хотя бы один элемент, и вызвать ошибку, если это не так, то оператор assert идеально подойдёт для такой задачи. Когда заявленное выражение ложно, вызывается ошибка AssertionError. Метод pop() возвращает последний элемент списка, одновременно удаляя его оттуда.", - "21": " ** Пример: ** \n\n`>>> mylist = ['item']`\n`>>> assert len(mylist) >= 1`\n`>>> mylist.pop()`\n`'item'`\n`>>> mylist`\n`[]`\n`>>> assert len(mylist) >= 1`\n`Traceback (most recent call last):`\n `File \"\", line 1, in `\n`AssertionError`", - "22": " ** Функция repr ** \n\nФункция repr используется для получения канонического строкового представления объекта. Любопытно, что в большинстве случаев eval(repr(object)) == object.", - "23": " ** Пример: ** \n\n`>>> i = []`\n`>>> i.append('item')`\n`>>> repr(i)`\n`\"['item']\"`\n`>>> eval(repr(i))`\n`['item']`\n`>>> eval(repr(i)) == i`\n`True`\n\nПо большому счёту, функция repr служит для получения печатаемого представления объекта. Определив метод __repr__ в собственном классе, можно указать, что он будет возвращать по вызову функции repr.", - "24": " ** Асинхронность ** \n\nАсинхронность в Python позволяет выполнять операции в неблокирующем режиме, тем самым, не тратя время на ожидание окончания операции. Для реализации асинхронности в Python используются:\n\n1. Ключевое слово async для создания асинхронной функции.\n\n2. Ключевое слово await для ожидания выполнения асинхронной операции.\n\n3. Библиотека asyncio для управления работой асинхронных функций." - }, - "Урок 10: Библиотеки":{ - "0": " ** Предисловие. Установка библиотек ** \n\nВ Каталоге пакетов Python существует колоссальное количество открытых библиотек, которые вы можете использовать в своих программах. Для их установки можно воспользоваться pip.", - "1": " ** Графические программы ** \n\nДля создания собственной графической программы на Python понадобится какая-нибудь библиотека ГИП (графического интерфейса пользователя) со своими привязками к Python. Привязки позволяют писать программу на Python, используя библиотеки, которые сами по себе написаны на C, C++ или других языках.", - "2": " ** Kivy \n\nhttps://kivy.org", - "3": "PyGTK ** \n\nЭто привязки Python к инструментарию GTK+, на основе которого построен GNOME. У GTK+ есть много своих особенностей, но как только вы освоитесь, вы сможете создавать ГИП очень быстро. Что касается дизайнера графического интерфейса Glade, то он просто незаменим. Документация же всё ещё требует некоторых улучшений. GTK+ хорошо работает в GNU/Linux, но его порт на Windows пока не закончен. При помощи GTK+ можно создавать как свободные, так и проприетарные программы. Для начала прочитайте Учебник по PyGTK.", - "4": "PyQt ** \n\nЭто привязки Python к инструментарию Qt, на основе которого построена KDE. Qt чрезвычайно прост в использовании, особенно благодаря Qt Designer и изумительной документации Qt. PyQt бесплатно, если используется для создания свободных программ (с лицензией GPL). Для создания закрытых проприетарных программ вам придётся его купить. Начиная с Qt 4.5, разрешается создавать при помощи него не только GPL’ные программы.", - "5": " ** wxPython ** \n\nЭто привязки Python к инструментарию wxWidgets. wxPython не так прост в освоении, но зато он переносим и работает на GNU/Linux, Windows, Mac и даже на встраиваемых платформах. Многие среды разработки для wxPython, такие как SPE (Stani’s Python Editor) и wxGlade включают дизайнеры графического интерфейса. При помощи wxPython можно создавать как свободные, так и проприетарные программы.", - "6": " ** NumPy ** \n\nNumPy - библиотека , которая предоставляет набор функциональных возможностей для работы с многомерными массивами, выполнения математических операций с ними и широким спектром других математических функций. Если вы работаете с большими объемами данных и выполняете численные расчеты, NumPy предоставляет мощный инструментарий для управления данными и обработки их в Python. ", - "7": " ** Создание массива ** \n\nNumPy позволяет просто создавать одномерные, двумерные и многомерные массивы, используя функции array()", - "8": " ** Индексация и срезы ** \n\nNumPy позволяет получать доступ к элементам массива и создавать срезы массива, как и в простом списке Python", - "9": " ** Математические операции ** \n\nС помощью NumPy легко выполнять математические операции с массивами, такие как сложение, вычитание, умножение и деление", - "10": " ** Статистические функции ** \n\nNumPy также предоставляет полезные статистические функции для работы с массивами, такие как среднее значение, медиана, минимальное и максимальное значения", - "11": " ** Matplotlib ** \n\nMatplotlib - библиотека, которая позволяет создавать графики и диаграммы из данных с помощью различных типов диаграмм и методов настройки.", - "12": " ** Создание графика ** \n\nMatplotlib предоставляет объективно много возможностей для создания графиков, включая гистограммы, диаграммы рассеивания и линейные графики.", - "13": " ** Настройка графика ** \n\nMatplotlib предоставляет множество методов для редактирования элементов графика - цвета, шрифтов, маркеров, заголовков и множество других функций.", - "14": " ** Создание нескольких графиков ** \n\nMatplotlib также предоставляет способ создания нескольких графиков в одной рабочей области. Это полезно, когда необходимо сравнить или отобразить несколько наборов данных на одном графике", - "15": " ** Создание гистограммы ** \n\nЕсли вы работаете с данными, гистограммы в Matplotlib могут помочь лучше понимать распределение данных." + "Урок 9: Исключения": { + "Предисловие": "Исключения возникают тогда, когда в программе возникает некоторая исключительная ситуация. Например, к чему приведёт попытка чтения несуществующего файла? Или если файл был случайно удалён, пока программа работала? Такие ситуации обрабатываются при помощи исключений.\n\nЭто касается и программ, содержащих недействительные команды. В этом случае Python поднимает руки и сообщает, что обнаружил ошибку.", + "Ошибки": "Рассмотрим простой вызов функции print. Что, если мы ошибочно напишем print как Print? Обратите внимание на заглавную букву. В этом случае Python поднимает синтаксическую ошибку.", + "Пример": "`>>> Print('Привет, Мир!')`\n`Traceback (most recent call last):`\n `File \"\", line 1, in `\n `Print('Привет, Мир!')`\n`NameError: name 'Print' is not defined`\n\nОбратите внимание, что была поднята ошибка NameError, а также указано место, где была обнаружена ошибка. Так в данном случае действует обработчик ошибок.", + "Исключения": "Попытаемся считать что-либо от пользователя. Нажмите Сtrl-D (или Ctrl+Z в Windows) и посмотрите, что произойдёт.", + "Пример": "`>>> s = input('Введите что-нибудь --> ')`\n\n`Введите что-нибудь -->`\n`Traceback (most recent call last):`\n `File \"\", line 1, in `\n `s = input('Введите что-нибудь --> ') `\n`EOFError: EOF when reading a line`\n\nPython поднимает ошибку с именем EOFError, что означает, что он обнаружил символ конца файла (который вводится при помощи Ctrl-D) там, где не ожидал.", + "Обработка исключений": "Обрабатывать исключения можно при помощи оператора try..except. При этом все обычные команды помещаются внутрь try-блока, а все обработчики исключений – в except-блок.", + "Пример": "`try:`\n `text = input('Введите что-нибудь --> ')`\n`except EOFError:`\n `print('Ну зачем вы сделали мне EOF?')`\n`except KeyboardInterrupt:`\n `print('Вы отменили операцию.')`\n`else:`\n `print('Вы ввели {0}'.format(text))`", + "Как это работает": "Здесь мы поместили все команды, которые могут вызвать исключения/ошибки, внутрь блока try, а затем поместили обработчики соответствующих ошибок/исключений в блок except. Выражение except может обрабатывать как одиночную ошибку или исключение, так и список ошибок/исключений в скобках. Если не указано имя ошибки или исключения, обрабатываться будут все ошибки и исключения.", + "Вызов исключения": "Исключение можно поднять при помощи оператора raise, передав ему имя ошибки/исключения, а также объект исключения, который нужно выбросить.\n\nВызываемая ошибка или исключение должна быть классом, который прямо или непрямо является производным от класса Exception.", + "Пример": "`class ShortInputException(Exception):`\n `'''Пользовательский класс исключения.'''`\n `def __init__(self, length, atleast):`\n `Exception.__init__(self)`\n `self.length = length`\n `self.atleast = atleast`\n\n`try:`\n `text = input('Введите что-нибудь --> ')`\n `if len(text) < 3:`\n `raise ShortInputException(len(text), 3)`\n `# Здесь может происходить обычная работа`\n`except EOFError:`\n `print('Ну зачем вы сделали мне EOF?')`\n`except ShortInputException as ex:`\n `print('ShortInputException: Длина введённой строки -- {0}; \\`\n `ожидалось, как минимум, {1}'.format(ex.length, ex.atleast))`\n`else:`\n `print('Не было исключений.')`", + "Как это работает": "Здесь мы создаём наш собственный тип исключения. Этот новый тип исключения называется ShortInputException. Он содержит два поля: length, хранящее длину введённого текста, и atleast, указывающее, какую минимальную длину текста ожидала программа.\n\nВ пункте except мы указываем класс ошибки ShortInputException, который будет сохранён как переменная ex, содержащая соответствующий объект ошибки/исключения. Это аналогично параметрам и аргументам при вызове функции. Внутри этого пункта except мы используем поля length и atleast объекта исключения для вывода необходимых сообщений пользователю.", + "Try .. Finally": "Представим, что в программе происходит чтение файла и необходимо убедиться, что объект файла был корректно закрыт и что не возникло никакого исключения. Этого можно достичь с применением блока finally.", + "Пример": "`import time`\n\n`try:`\n `f = open('poem.txt')`\n `while True: # наш обычный способ читать файлы`\n `line = f.readline()`\n `if len(line) == 0:`\n `break`\n `print(line, end='')`\n `time.sleep(2) # Пусть подождёт некоторое время`\n`except KeyboardInterrupt:`\n `print('!! Вы отменили чтение файла.')`\n`finally:`\n `f.close()`\n `print('(Очистка: Закрытие файла)')`", + "Как это работает": "Здесь мы производим обычные операции чтения из файла, но в данном случае добавляем двухсекундный сон после вывода каждой строки при помощи функции time.sleep, чтобы программа выполнялась медленно (ведь Python очень быстр от природы). Во время выполнения программы нажмите ctrl-c, чтобы прервать/отменить выполнение программы.\n\nПронаблюдайте, как при этом выдаётся исключение KeyboardInterrupt, и программа выходит. Однако, прежде чем программа выйдет, выполняется пункт finally, и файловый объект будет всегда закрыт.", + "Оператор with": "Типичной схемой является запрос некоторого ресурса в блоке try с последующим освобождением этого ресурса в блоке finally. Для того, чтобы сделать это более «чисто»,существует оператор with:", + "Пример": "`with open(\"poem.txt\") as f:`\n `for line in f:`\n `print(line, end='')`", + "Как это работает": "Существует некий протокол, используемый оператором with. Он считывает объект, возвращаемый операторомopen.Назовём его в данном случае «thefile».\n\nПеред запуском блока кода, содержащегося в нём, оператор with всегда вызывает функцию thefile.__enter__, а также всегда вызывает thefile.__exit__ после завершения выполнения этого блока кода.\n\nТак что код, который мы бы написали в блоке finally, будет автоматически обработан методом __exit__. Это избавляет нас от необходимости повторно в явном виде указывать операторы try..finally." }, - "Послесловие":{ - "0": " ** В каких сферах используется Python ** \n\nPython широко используется в различных сферах. Некоторые из основных областей применения Python:\n\n1. Data Science: Python использовуется для анализа данных, машинного обучения, интеллектуального анализа данных, обработки изображений и звука.\n\n2. Web-разработка: Python используется для разработки веб-сайтов, создания веб-приложений, обработки запросов и проектирования RESTful API.\n\n3. Научное моделирование: Python используется для разработки математических моделей, численных вычислений, решения уравнений и моделирования физических процессов.\n\n4. Разработка игр: Python используется для создания игр и игровых движков.\n\n5. Кибербезопасность: Python используется для разработки криптографического программного обеспечения, инструментов для тестирования на проникновение, систем обнаружения вторжений и анализа логов." + "Урок 10: Дополнительно": { + "Предисловие": "К настоящему моменту мы уже рассмотрели большую часть того, что вам придётся использовать при работе с Python. В этой главе мы охватим некоторые дополнительные аспекты, которые помогут отшлифовать ваши знания.", + "Self": "Методы класса имеют одно отличие от обычных функций: они должны иметь дополнительно имя, добавляемое к началу списка параметров. Однако, при вызове метода никакого значения этому параметру присваивать не нужно – его укажет Python. Эта переменная указывает на сам объект экземпляра класса, и по традиции она называется self.\n\nХотя этому параметру можно дать любое имя, настоятельно рекомендуется использовать только имя self; использование любого другого имени не приветствуется. Есть много достоинств использования стандартного имени: во-первых, любой человек, просматривающий вашу программу, легко узнает его; во-вторых, некоторые специализированные Интегрированные среды разработки (IDE) изначально рассчитаны на использование self.", + "Классы": "Классы предоставляют средства объединения данных и функциональности вместе. Создание нового класса создает объект нового типа, позволяя создавать новые экземпляры этого типа. К каждому экземпляру класса могут быть прикреплены атрибуты для поддержания его состояния. Экземпляры класса также могут иметь методы (определенные его классом) для изменения его состояния.", + "Пример": "`class Person:`\n `pass # Пустой блок`\n\n`p = Person()`\n`print(p)`", + "Как это работает": "Мы создаём новый класс при помощи оператора class и имени класса. За этим следует блок выражений, формирующих тело класса. В данном случае блок у нас пуст, на что указывает оператор pass.\n\nДалее мы создаём объект-экземпляр класса, записывая имя класса со скобками. (Мы узнаем больше о реализации в следующем разделе). Для проверки мы выясняем тип переменной, просто выводя её на экран. Так мы видим, что у нас есть экземпляр класса Person в модуле __main__.\n\nОбратите внимание, что выводится также и адрес в памяти компьютера, где хранится ваш объект. На вашем компьютере адрес будет другим, так как Python хранит объекты там, где имеется свободное место.", + "Методы объектов": "Итак, мы выяснили что классы/объекты могут иметь методы, представляющие собой функции, за исключением дополнительной переменной self. А теперь давайте рассмотрим пример", + "Пример": "`class Person:`\n `def sayHi(self):`\n `print('Привет! Как дела?')`\n\n`p = Person()`\n`p.sayHi()`", + "Как это работает": "Здесь мы видим self в действии. __Обратите внимание, что метод sayHi не принимает параметров, но тем не менее, имеет self в определении функции.__", + "Блоки в одно выражение": "Мы неоднократно говорили, что каждый блок команд отделяется от других своим собственным уровнем отступа. Однако, существует и исключение. Если блок команд содержит только одно выражение, его можно указывать в одной строке с условным оператором или, скажем, оператором цикла. Рассмотрим это на примере:", + "Пример": "`>>> flag = True`\n`>>> if flag: print('Да')`\n`Да`\n\nОбратите внимание, что единственный оператор расположен в той же строке, а не отдельным блоком. Этот способ может подкупить тем, что якобы «сокращает» программу, но мы настоятельно рекомендуем избегать его во всех случаях, кроме проверки ошибок. Прежде всего, потому что гораздо легче добавлять команды, когда уже есть необходимый уровень отступа.", + "Lambda-функции": "Ключевое слово lambda используется для создания функций и возврата их значения во время выполнения программы. lambda принимает параметр, за которым следует одно выражение, которое становится телом функции, а значение этого выражения возвращается новой функцией.", + "Пример": "`points = [ { 'x' : 2, 'y' : 3 }, { 'x' : 4, 'y' : 1 } ]`\n`points.sort(key=lambda i : i['y'])`\n`print(points)`", + "Как это работает": "Обратите внимание на то, что метод sort класса list может принимать параметр key, определяющий способ сортировки списка (обычно мы думаем только о сортировке по возрастанию или по убыванию). В данном случае мы хотим провести сортировку по собственному принципу, для чего нам необходимо написать соответствующую функцию. Но вместо того, чтобы создавать отдельный блок def для описания функции, которая будет использоваться только в этом месте, мы применяем лямбда-выражение.", + "Генераторы списков": "Генераторы списков служат для создания новых списков на основе существующих. Представьте, что имеется список чисел, на основе которого требуется получить новый список, состоящий из всех чисел, умноженных на 2, но только при условии, что само число больше 2. Генераторы списков подходят для таких задач как нельзя лучше.", + "Пример": "`listone = [2, 3, 4]`\n`listtwo = [2*i for i in listone if i > 2]`\n`print(listtwo)`", + "Как это работает": "В этом примере мы создаём новый список, указав операцию, которую необходимо произвести (2 * i), когда выполняется некоторое условие (if i > 2).Обратите внимание, что исходный список при этом не изменяется.", + "Передача кортежей и словарей в функции": "Для получения параметров, переданных функции, в виде кортежа или словаря, существуют специальные приставки «*» или «**» соответственно. Это особенно полезно в случаях, когда функция может принимать переменное число параметров.", + "Пример": "`>>> def powersum(power, *args):`\n`... '''Возвращает сумму аргументов, возведённых в указанную степень.'''`\n`... total = 0`\n`... for i in args:`\n`... total += pow(i, power)`\n`... return total`\n`...`\n`>>> powersum(2, 3, 4)`\n`25`\n`>>> powersum(2, 10)`\n`100`\n\nПоскольку перед переменной args указана приставка «*», все дополнительные аргументы, переданные функции, сохранятся в args в виде кортежа. В случае использования приставки «**» все дополнительные параметры будут рассматриваться как пары ключ/значение в словаре.", + "exec и eval": "Функция exec служит для выполнения команд Python, содержащихся в строке или файле, в отличие от самого текста программы. Например, во время выполнения программы можно сформировать строку, содержащую текст программы на Python, и запустить его при помощи exec:", + "Пример": "`>>> exec('print(\"Здравствуй, Мир!\")')`\n`Здравствуй, Мир!`", + "Оператор assert": "Оператор assert существует для того, чтобы указать, что нечто является истиной. Например, если требуется гарантировать, что в списке будет хотя бы один элемент, и вызвать ошибку, если это не так, то оператор assert идеально подойдёт для такой задачи. Когда заявленное выражение ложно, вызывается ошибка AssertionError. Метод pop() возвращает последний элемент списка, одновременно удаляя его оттуда.", + "Пример": "`>>> mylist = ['item']`\n`>>> assert len(mylist) >= 1`\n`>>> mylist.pop()`\n`'item'`\n`>>> mylist`\n`[]`\n`>>> assert len(mylist) >= 1`\n`Traceback (most recent call last):`\n `File \"\", line 1, in `\n`AssertionError`", + "Функция repr": "Функция repr используется для получения канонического строкового представления объекта. Любопытно, что в большинстве случаев eval(repr(object)) == object.", + "Пример": "`>>> i = []`\n`>>> i.append('item')`\n`>>> repr(i)`\n`\"['item']\"`\n`>>> eval(repr(i))`\n`['item']`\n`>>> eval(repr(i)) == i`\n`True`\n\nПо большому счёту, функция repr служит для получения печатаемого представления объекта. Определив метод __repr__ в собственном классе, можно указать, что он будет возвращать по вызову функции repr.", + "Установка библиотек": "В Каталоге пакетов Python существует колоссальное количество открытых библиотек, которые вы можете использовать в своих программах. Для их установки можно воспользоваться pip.", + "Графические программы": "Для создания собственной графической программы на Python понадобится какая-нибудь библиотека ГИП (графического интерфейса пользователя) со своими привязками к Python. Привязки позволяют писать программу на Python, используя библиотеки, которые сами по себе написаны на C, C++ или других языках.", + "Kivy": "https://kivy.org", + "PyGTK": "Это привязки Python к инструментарию GTK+, на основе которого построен GNOME. У GTK+ есть много своих особенностей, но как только вы освоитесь, вы сможете создавать ГИП очень быстро. Что касается дизайнера графического интерфейса Glade, то он просто незаменим. Документация же всё ещё требует некоторых улучшений. GTK+ хорошо работает в GNU/Linux, но его порт на Windows пока не закончен. При помощи GTK+ можно создавать как свободные, так и проприетарные программы. Для начала прочитайте Учебник по PyGTK.", + "PyQt": "Это привязки Python к инструментарию Qt, на основе которого построена KDE. Qt чрезвычайно прост в использовании, особенно благодаря Qt Designer и изумительной документации Qt. PyQt бесплатно, если используется для создания свободных программ (с лицензией GPL). Для создания закрытых проприетарных программ вам придётся его купить. Начиная с Qt 4.5, разрешается создавать при помощи него не только GPL’ные программы.", + "wxPython": "Это привязки Python к инструментарию wxWidgets. wxPython не так прост в освоении, но зато он переносим и работает на GNU/Linux, Windows, Mac и даже на встраиваемых платформах. Многие среды разработки для wxPython, такие как SPE (Stani’s Python Editor) и wxGlade включают дизайнеры графического интерфейса. При помощи wxPython можно создавать как свободные, так и проприетарные программы." } } \ No newline at end of file diff --git a/main3.py b/main3.py index 7461194..f99139b 100644 --- a/main3.py +++ b/main3.py @@ -179,6 +179,7 @@ def _say_last_phrase (self) -> None: self._OUTPUT_TEXT = self._SESSIONAL_DATA["last_output_text"] self._TEXT_TO_SPEECH = self._SESSIONAL_DATA["last_text_to_speech"] self._BUTTONS.BUTTONS = self._SESSIONAL_DATA["last_buttons"] + self._CARD = self._SESSIONAL_DATA["last_card"] @save_last_phrase @@ -715,6 +716,7 @@ def _consulting (self) -> None: elif self._user_wants_to_hear_last_phrase: self._say_last_phrase ( ) + elif self._user_wants_to_end_session: self._end_the_session ( ) else: diff --git a/main4.py b/main4.py index b5d15ed..f43c98b 100644 --- a/main4.py +++ b/main4.py @@ -10,41 +10,6 @@ from typing import Literal -def code_to_speech(code: str) -> str: - REPLACEMENTS = { - ")": " скобка закрывается ", - "(": " скобка открывается ", - "*": " звёздочка ", - "'": " кавычки ", - '"': " кавычки ", - "{": " фигурная скобка открывается ", - "}": " фигурная скобка закрывается ", - ":": " двоеточие ", - "!": " восклицательный знак ", - ".": " точка ", - ",": " запятая ", - "[": " квадратная скобка открывается ", - "]": " квадратная скобка закрывается ", - "||": " две вертикальные линии (операция или) ", - ">": " больше ", - "<": " меньше ", - "/": " разделить ", - "-": " минус ", - "+": " плюс ", - "%": " процент ", - "@": " собачка ", - "&": " амперсанд " - } - - PAUSE = "sil <[250]>" - lines = code.split("\n") - formatted_lines = [] - for i, line in enumerate(lines, start=1): - formatted_line = line - for k in REPLACEMENTS.keys(): - formatted_line = formatted_line.replace(k, REPLACEMENTS[k]) - formatted_lines.append(f"{PAUSE} строка {i} {PAUSE} {formatted_line}") - return "\n".join(formatted_lines) + PAUSE class HandlerOfAlisa: def __init__ (self, request: dict): @@ -67,11 +32,10 @@ def __init__ (self, request: dict): def save_last_phrase (function: callable) -> callable: def _wrapper (self, *args, **kwargs): function (self, *args, **kwargs) - if self._TEXT_TO_SPEECH: - self._SESSIONAL_DATA["last_phrase"] = self._TEXT_TO_SPEECH - else: - self._SESSIONAL_DATA["last_phrase"] = self._OUTPUT_TEXT + self._SESSIONAL_DATA["last_output_text"] = self._OUTPUT_TEXT + self._SESSIONAL_DATA["last_text_to_speech"] = self._TEXT_TO_SPEECH self._SESSIONAL_DATA["last_buttons"] = self._BUTTONS.BUTTONS + self._SESSIONAL_DATA["last_card"] = self._CARD return _wrapper @@ -99,24 +63,14 @@ def _working_with_user (self) -> None: # Пользователь просто в главном меню elif self._user_is_in_main_menu: - text_that_says_user_is_just_in_main_menu = get_text_that_says_user_is_just_in_main_menu ( ) - self._OUTPUT_TEXT = text_that_says_user_is_just_in_main_menu - self._TEXT_TO_SPEECH = text_that_says_user_is_just_in_main_menu - self._TEXT_TO_SPEECH += get_main_commands_of_skill ( ) + self._OUTPUT_TEXT = get_text_that_says_user_is_just_in_main_menu ( ) self._BUTTONS.add_buttons_of_main_menu_in_text ( ) self._working_with_user_in_main_menu ( ) # Пользователь не в главном меню else: self._working_with_user_outside_main_menu ( ) - if self._has_all_words_in_text_in_lower("помощь", "помоги", "помочь", "помощи", "помощью", "помог"): - self._OUTPUT_TEXT = '''Всегда к вашим услугам! Послушайте мои функции:\n1: Если вы хотите продолжить изучение курса с последней темы, просто скажите: "курс".\n2: Если вы хотите проверить свои знания, просто скажите: "квест".\n3: Если вы хотите проверить свои знания и заняться практикой, скажите: "задачки."\n4: Если вы достаточно смелый, я могу оценить ваши знания, просто скажите: "оцени мои знания."\n5: Если у вас возникла ошибка в коде, скажите: "пофикси ошибку"\n6: Если вам нужна консультация, скажите: "консультация"\n7: Если вы хотите написать жалобу или предложение насчет нашего навыка, скажите: "отчет"\n8: Для того чтобы покинуть навык скажите: "выйти из навыка."\nТак чем я могу вам помочь?''' - self._BUTTONS.add_buttons_of_main_menu_in_text ( ) - self._working_with_user_in_main_menu ( ) - elif self._has_all_words_in_text_in_lower("умеешь", "уметь", "умеете"): - self._OUTPUT_TEXT = '''Давайте расскажу, Я - ваш личный эксперт в области Python. Хотите отдохнуть и послушать курс? или потренироваться на практике в задачах и квесте? А может получить оценку своих знаний теории? Я всегда готова вам помочь! Может вы хотите получить консультацию от моего гениального интеллекта либо узнать как пофиксить ошибку? Тут я тоже могу подсказать. Так чем бы вы хотели заняться?''' - self._BUTTONS.add_buttons_of_main_menu_in_text ( ) - self._working_with_user_in_main_menu ( ) + @property def _user_is_in_main_menu (self) -> bool: if self._SESSIONAL_DATA["state"] == "in_main_menu": @@ -125,7 +79,6 @@ def _user_is_in_main_menu (self) -> bool: return False - @save_last_phrase def _working_with_user_in_main_menu (self) -> None: self._BUTTONS.remove_all_buttons ( ) self._TEXT_TO_SPEECH = "" @@ -145,6 +98,7 @@ def _working_with_user_in_main_menu (self) -> None: self._OUTPUT_TEXT += "Здесь вы можете посмотреть список тем и выбрать любую,\n" self._OUTPUT_TEXT += "можете продолжить последнюю или переслушать текущую." self._BUTTONS.add_buttons (*self._commands_of_course, hide_all = False) + self._BUTTONS.add_buttons ("Повтори", hide_all = True) elif self._has_one_word_in_text_in_lower ( "задачка", "задачки", "задачку", "задачке", "задачкой", @@ -154,9 +108,9 @@ def _working_with_user_in_main_menu (self) -> None: self._SESSIONAL_DATA["state"] = "working_with_tasks" self._OUTPUT_TEXT = "Какой уровень сложности вы хотите выбрать?\n" self._TEXT_TO_SPEECH = self._OUTPUT_TEXT - self._TEXT_TO_SPEECH += ", ".join (self._difficulty_levels_of_course) - self._BUTTONS.add_buttons (*self._difficulty_levels_of_course, hide_all = False) - self._BUTTONS.add_buttons ("На главное меню", "Пока", hide_all = True) + self._TEXT_TO_SPEECH += ", ".join (self._difficulty_levels) + self._BUTTONS.add_buttons (*self._difficulty_levels, hide_all = False) + self._BUTTONS.add_buttons ("На главное меню", "Повтори", "Пока", hide_all = True) elif self._has_one_word_in_text_in_lower ( "квест", "квеста", "квесту", "квестом", "квесте", @@ -164,16 +118,16 @@ def _working_with_user_in_main_menu (self) -> None: self._SESSIONAL_DATA["state"] = "working_with_quest" self._OUTPUT_TEXT = "Какой уровень сложности вы хотите выбрать?\n" self._TEXT_TO_SPEECH = self._OUTPUT_TEXT - self._TEXT_TO_SPEECH += ", ".join (self._difficulty_levels_of_quest) - self._BUTTONS.add_buttons (*self._difficulty_levels_of_quest, hide_all = False) - self._BUTTONS.add_buttons ("Узнать мои результаты", "На главное меню", "Пока", hide_all = True) + self._TEXT_TO_SPEECH += ", ".join (self._difficulty_levels) + self._BUTTONS.add_buttons (*self._difficulty_levels, hide_all = False) + self._BUTTONS.add_buttons ("Узнать мои результаты", "Повтори", "На главное меню", "Пока", hide_all = True) elif self._has_one_word_in_text_in_lower ( "пожаловаться", "жалоба", "жалобу", "отчёт", "отчет"): self._SESSIONAL_DATA["state"] = "sending_report" self._OUTPUT_TEXT = "Я не знаю, на какую почту отправлять жалобу...\n" self._OUTPUT_TEXT += "Может, на главное меню?" - self._BUTTONS.add_buttons ("На главное меню", "Пока!", hide_all = True) + self._BUTTONS.add_buttons ("На главное меню", "Повтори", "Пока!", hide_all = True) elif self._has_one_word_in_text_in_lower ( "консультант", "консультанта", "консультанту", "консультантом", "консультанте" @@ -181,11 +135,11 @@ def _working_with_user_in_main_menu (self) -> None: self._SESSIONAL_DATA["state"] = "consulting" self._OUTPUT_TEXT = "Пока я не могу вас проконсультировать, извините...\n" self._OUTPUT_TEXT += "Может, на главное меню?" - self._BUTTONS.add_buttons ("На главное меню", "Пока!", hide_all = True) + self._BUTTONS.add_buttons ("На главное меню", "Повтори", "Пока!", hide_all = True) - elif self._has_all_words_in_text_in_lower ("оцени", "знания"): - self._OUTPUT_TEXT = "Зачем \"Оцени мои знания\", когда есть \"Квест\"?\n" - self._OUTPUT_TEXT += "Скажи \"Квест\", чтобы его попробовать." + elif self._user_needs_help: + self._OUTPUT_TEXT = "Сейчас я вам помогу. В главном меню есть следующие команды: " + self._TEXT_TO_SPEECH = self._OUTPUT_TEXT + get_main_commands_of_skill ( ) self._BUTTONS.add_buttons_of_main_menu_in_text ( ) elif self._user_wants_to_go_to_main_menu: @@ -202,16 +156,12 @@ def _working_with_user_in_main_menu (self) -> None: @property def _commands_of_course (self) -> tuple[str]: - return "Посмотреть список тем", "Текущая тема", "Продолжить последнюю", "Переслушать текущую", "На главное меню", "Пока!" + return "Посмотреть список тем", "Текущая тема", "Продолжить последнюю", "Переслушать текущую", "Помощь", "На главное меню", "Пока!" @property - def _difficulty_levels_of_quest (self) -> tuple[str, str, str, str]: + def _difficulty_levels (self) -> tuple[str, str, str, str]: return "Лёгкий", "Средний", "Высокий", "Случайный" - @property - def _difficulty_levels_of_course (self) -> tuple[str, str, str, str, str]: - return "Лёгкий", "Средний", "Высокий", "Очень высокий", "Случайный" - @property def _user_wants_to_hear_last_phrase (self) -> bool: if self._has_one_word_in_text_in_lower ("повтори", "повторить", "что", "чего"): @@ -219,9 +169,18 @@ def _user_wants_to_hear_last_phrase (self) -> bool: else: return False + @property + def _user_needs_help (self) -> bool: + if self._has_one_word_in_text_in_lower ("помощь", "помоги", "забыл", "забыла", "команды"): + return True + else: + return False + def _say_last_phrase (self) -> None: - self._OUTPUT_TEXT = self._SESSIONAL_DATA["last_phrase"] + self._OUTPUT_TEXT = self._SESSIONAL_DATA["last_output_text"] + self._TEXT_TO_SPEECH = self._SESSIONAL_DATA["last_text_to_speech"] self._BUTTONS.BUTTONS = self._SESSIONAL_DATA["last_buttons"] + self._CARD = self._SESSIONAL_DATA["last_card"] @save_last_phrase @@ -245,10 +204,10 @@ def _working_with_user_outside_main_menu (self) -> None: self._sending_report ( ) case "choosing_between_solve_and_code": self._choosing_between_solve_and_code() - case "wish_to_see_solve": - self.wish_to_see_solve() - case "wish_to_see_code": - self.wish_to_see_code() + case "_wish_to_see_solve": + self._wish_to_see_solve() + case "_wish_to_see_solve": + self._wish_to_see_solve() case "consulting": self._consulting ( ) @@ -266,7 +225,7 @@ def _working_with_course (self) -> None: for lesson_theme in lesson_getter.themes: self._BUTTONS.add_buttons (lesson_theme, hide_all = False) self._TEXT_TO_SPEECH += lesson_theme + "\n" - self._BUTTONS.add_buttons ("Назад", "На главное меню", "Выход", hide_all = True) + self._BUTTONS.add_buttons ("Назад", "Повтори", "На главное меню", "Выход", hide_all = True) elif self._has_one_word_in_text_in_lower ("продолжить", "дальше", "далее"): if current_lesson_theme: @@ -283,7 +242,7 @@ def _working_with_course (self) -> None: "На главное меню", "Пока", hide_all = True) elif not next_subtheme and current_lesson_subtheme: self._TEXT_TO_SPEECH = get_random_sound_of_looking_results ( ) - self._CARD = self._make_big_bonus_picture (title = "Поздравляю! Вы прошли целый урок.", description = "Поздравляю! Вы прошли целый урок.\n" + "Следующий - это " + lesson_getter.get_name_of_next_theme (current_lesson_theme) + "\n" + "Хотите продолжить?") + self._CARD = make_big_level_up_picture (title = "Поздравляю! Вы прошли целый урок.", description = "Следующий - это " + lesson_getter.get_name_of_next_theme (current_lesson_theme) + ".\n" + "Хотите продолжить?") self._TEXT_TO_SPEECH += "Поздравляю! Вы прошли целый урок.\n" self._TEXT_TO_SPEECH += "Следующий - это " + lesson_getter.get_name_of_next_theme (current_lesson_theme) + "\n" self._TEXT_TO_SPEECH += "Хотите продолжить?" @@ -307,13 +266,18 @@ def _working_with_course (self) -> None: elif self._has_one_word_in_text_in_lower ("текущая", "текущую"): if current_lesson_theme: - self._OUTPUT_TEXT = "Текущая тема урока: " + current_lesson_theme + "\n" - self._OUTPUT_TEXT += "Подтема: " + current_lesson_subtheme + "\n" + self._OUTPUT_TEXT = "Текущая тема урока: " + current_lesson_theme + ".\n" + self._OUTPUT_TEXT += "Подтема: " + current_lesson_subtheme + ".\n" self._OUTPUT_TEXT += "Скажите, если хотите переслушать или продолжить." self._BUTTONS.add_buttons ("Продолжить", "Переслушать", "На главное меню", "Пока", hide_all = True) else: self._user_has_not_listened_to_any_lesson ( ) + elif self._user_needs_help: + self._OUTPUT_TEXT = "Не волнуйтесь! В меню курса есть команды: " + self._TEXT_TO_SPEECH = self._OUTPUT_TEXT + ", ".join (self._commands_of_course) + "." + self._BUTTONS.add_buttons (*self._commands_of_course, hide_all = False) + elif self._user_wants_to_go_to_main_menu: self._go_to_main_menu ( ) @@ -347,13 +311,13 @@ def _choosing_between_solve_and_code(self) -> None: a = random.choice(entering) if self._has_one_word_in_text_in_lower ("решение", "решению", "реши", "решил", "ответ", "решай", "отвечай", "решении", "ответе"): self._OUTPUT_TEXT = a + "\nИтак, решение: " + self._SESSIONAL_DATA["solve_of_task"] + "\nХотите услышать код решения на Python?" - self._SESSIONAL_DATA["state"] = "wish_to_see_code" + self._SESSIONAL_DATA["state"] = "_wish_to_see_solve" self._BUTTONS.add_buttons ("Да", "На главное меню", "Пока", hide_all = True) elif self._has_one_word_in_text_in_lower ("код", "коды", "кода", "скрипт", "скрипты", "скрипта", "скрипте", "коде"): self._OUTPUT_TEXT = a + "\nИтак, код: " + self._SESSIONAL_DATA["code_of_task"] + "\nХотите услышать объяснение?" self._TEXT_TO_SPEECH = a + "Итак код. " + code_to_speech(self._SESSIONAL_DATA["code_of_task"]) + ".Хотите услышать объяснение?" - self._SESSIONAL_DATA["state"] = "wish_to_see_solve" + self._SESSIONAL_DATA["state"] = "_wish_to_see_solve" self._BUTTONS.add_buttons ("Да", "На главное меню", "Пока", hide_all = True) elif self._user_wants_to_go_to_main_menu: @@ -369,7 +333,7 @@ def _choosing_between_solve_and_code(self) -> None: self._OUTPUT_TEXT = get_apology_text ( ) - def wish_to_see_code(self): + def _wish_to_see_solve(self): if self._has_one_word_in_text_in_lower ("да", "ага", "давай", "поехали", "ес", "погнали", "говори", "гони"): self._OUTPUT_TEXT = "Итак, код: " + self._SESSIONAL_DATA["code_of_task"] + "\nХотите ещё задачу? Тогда просто назовите желаемую сложность." self._TEXT_TO_SPEECH = "итак код. " + code_to_speech(self._SESSIONAL_DATA["code_of_task"]) + ".хотите ещё задачу? Тогда просто назовите желаемую сложность." @@ -390,7 +354,7 @@ def wish_to_see_code(self): self._OUTPUT_TEXT = get_apology_text ( ) - def wish_to_see_solve(self): + def _wish_to_see_solve(self): if self._has_one_word_in_text_in_lower ("да", "ага", "давай", "поехали", "ес", "погнали", "говори", "гони"): self._OUTPUT_TEXT = "Итак, решение: " + self._SESSIONAL_DATA["solve_of_task"] + "\nХотите ещё задачу? Тогда просто назовите желаемую сложность." self._SESSIONAL_DATA["state"] = "working_with_tasks" @@ -413,10 +377,9 @@ def wish_to_see_solve(self): def _user_has_not_listened_to_any_lesson (self) -> None: self._OUTPUT_TEXT = "Вы ещё не прошли ни одного урока.\n" self._OUTPUT_TEXT += "Скажите: \"Покажи список тем\", чтобы начать изучать курс." - self._BUTTONS.add_buttons ("Покажи список тем", "На главное меню", "Выход", hide_all = True) + self._BUTTONS.add_buttons ("Покажи список тем", "Повтори", "На главное меню", "Выход", hide_all = True) - @save_last_phrase def _choosing_course_theme (self) -> None: if self._has_one_word_in_text_in_lower ("1", "введение"): self._start_next_lesson_and_sublesson (1) @@ -454,7 +417,7 @@ def _choosing_course_theme (self) -> None: self._OUTPUT_TEXT += "Здесь вы можете посмотреть список тем и выбрать любую,\n" self._OUTPUT_TEXT += "можете продолжить последнюю или переслушать текущую." self._BUTTONS.add_buttons (*self._commands_of_course, hide_all = False) - self._BUTTONS.add_buttons ("Покажи список тем", "На главное меню", "Выход", hide_all = True) + self._BUTTONS.add_buttons ("Покажи список тем", "Повтори", "На главное меню", "Выход", hide_all = True) elif self._user_wants_to_go_to_main_menu: self._go_to_main_menu ( ) @@ -482,7 +445,6 @@ def _start_next_lesson_and_sublesson (self, theme_number: Literal[1, 2, 3, 4, 5] self._BUTTONS.add_buttons ("Далее", "Переслушать", "На главное меню", "Пока", hide_all = True) - @save_last_phrase def _start_next_lesson_or_not (self) -> None: old_lesson_theme = self._INTERSESSIONAL_DATA["current_lesson"] lesson_getter = LessonGetter ( ) @@ -499,7 +461,7 @@ def _start_next_lesson_or_not (self) -> None: elif self._has_one_word_in_text_in_lower ("не", "нет", "позже", "потом"): self._SESSIONAL_DATA["state"] = "working_with_course" - self._OUTPUT_TEXT = "Как хотите. В любой момент скажите просто скажите: \"Продолжить\"." + self._OUTPUT_TEXT = "Как хотите. В любой момент просто скажите: \"Продолжить последний урок\"." self._BUTTONS.add_buttons (*self._commands_of_course, hide_all = False) elif self._user_wants_to_go_to_main_menu: @@ -525,7 +487,7 @@ def _working_with_tasks (self) -> None: self._save_text_and_solve_of_easy_task_in_session_data() a = ['Хорошо', 'Итак', "Отлично", "Так-с", "Ага", "Замечательно", "Супер"] self._OUTPUT_TEXT = random.choice(a)+", давайте приступим. Задача называется \""+self._SESSIONAL_DATA["title_of_task"]+"\".\nЧитаю условие: \""+self._SESSIONAL_DATA["text_of_task"]+"\"\nПопробуйте решить сами.\nЕсли захотите услышать решение или код, просто скажите мне \"Решение\" или \"Код\"." - self._BUTTONS.add_buttons ("Устное решение", "Код", "Повторить", "На главное меню", "Пока", hide_all = True) + self._BUTTONS.add_buttons ("Устное решение", "Код", "Повтори", "На главное меню", "Пока", hide_all = True) elif self._has_one_word_in_text_in_lower ( @@ -536,7 +498,7 @@ def _working_with_tasks (self) -> None: self._save_text_and_solve_of_medium_task_in_session_data() a = ['Хорошо', 'Итак', "Отлично", "Так-с", "Ага", "Замечательно", "Супер"] self._OUTPUT_TEXT = random.choice(a)+", давайте приступим. Задача называется \""+self._SESSIONAL_DATA["title_of_task"]+"\".\nЧитаю условие: \""+self._SESSIONAL_DATA["text_of_task"]+"\"\nПопробуйте решить сами.\nЕсли захотите услышать решение или код, просто скажите мне \"Решение\" или \"Код\"." - self._BUTTONS.add_buttons ("Устное решение", "Код", "Повторить", "На главное меню", "Пока", hide_all = True) + self._BUTTONS.add_buttons ("Устное решение", "Код", "Повтори", "На главное меню", "Пока", hide_all = True) elif self._has_one_word_in_text_in_lower ( @@ -547,7 +509,7 @@ def _working_with_tasks (self) -> None: self._save_text_and_solve_of_hard_task_in_session_data() a = ['Хорошо', 'Итак', "Отлично", "Так-с", "Ага", "Замечательно", "Супер"] self._OUTPUT_TEXT = random.choice(a)+", давайте приступим. Задача называется \""+self._SESSIONAL_DATA["title_of_task"]+"\".\nЧитаю условие: \""+self._SESSIONAL_DATA["text_of_task"]+"\"\nПопробуйте решить сами.\nЕсли захотите услышать решение или код, просто скажите мне \"Решение\" или \"Код\"." - self._BUTTONS.add_buttons ("Устное решение", "Код", "Повторить", "На главное меню", "Пока", hide_all = True) + self._BUTTONS.add_buttons ("Устное решение", "Код", "Повтори", "На главное меню", "Пока", hide_all = True) elif self._has_one_word_in_text_in_lower ( @@ -561,11 +523,16 @@ def _working_with_tasks (self) -> None: self._save_text_and_solve_of_random_task_in_session_data() a = ['Хорошо', 'Итак', "Отлично", "Так-с", "Ага", "Замечательно", "Супер"] self._OUTPUT_TEXT = random.choice(a)+", давайте приступим. Задача называется \""+self._SESSIONAL_DATA["title_of_task"]+"\".\nЧитаю условие: \""+self._SESSIONAL_DATA["text_of_task"]+"\"\nПопробуйте решить сами.\nЕсли захотите услышать решение или код, просто скажите мне \"Решение\" или \"Код\"." - self._BUTTONS.add_buttons ("Устное решение", "Код", "Повторить", "На главное меню", "Пока", hide_all = True) + self._BUTTONS.add_buttons ("Устное решение", "Код", "Повтори", "На главное меню", "Пока", hide_all = True) elif self._user_wants_to_go_to_main_menu: self._go_to_main_menu ( ) + elif self._user_needs_help: + self._OUTPUT_TEXT = "Всё будет хорошо! Здесь вам нужно всего лишь выбрать уровень сложности: лёгкий, средний или высокий.\n" + self._OUTPUT_TEXT += "Также вы можете в любой момент переслушать задачу или выйти на главное меню." + self._BUTTONS.add_buttons (*self._difficulty_levels, "На главное меню", hide_all = False) + elif self._user_wants_to_hear_last_phrase: self._say_last_phrase ( ) @@ -584,7 +551,6 @@ def _save_text_and_solve_of_random_task_in_session_data(self): self._SESSIONAL_DATA["solve_of_task"] = task["solve"] self._SESSIONAL_DATA["code_of_task"] = task["code"] - @save_last_phrase def _choosing_right_answer_for_task (self) -> None: # FIXME if self._user_wants_to_go_to_main_menu: @@ -601,7 +567,6 @@ def _choosing_right_answer_for_task (self) -> None: self._BUTTONS.add_buttons ("На главное меню", "Пока!", hide_all = True) - @save_last_phrase def _working_with_quest (self) -> None: if self._has_one_word_in_text_in_lower ( "лёгкий", "лёгкого", "лёгкому", "лёгким", "лёгком", @@ -638,6 +603,12 @@ def _working_with_quest (self) -> None: elif self._has_one_word_in_text_in_lower ("результат", "результаты"): self._show_results_of_quest_and_next_quest ( ) + elif self._user_needs_help: + self._OUTPUT_TEXT = "Не волнуйтесь! Здесь вы должны всего лишь выбрать уровень сложности: лёгкий, средний, высокий.\n" + self._OUTPUT_TEXT += "Также вы можете узнать свои результаты, сказав: \"Покажи результаты\", или " + self._OUTPUT_TEXT += "перейти на главное меню, сказав: \"На главное меню\"." + self._BUTTONS.add_buttons (*self._difficulty_levels, "Покажи результаты", "На главное меню", hide_all = False) + elif self._user_wants_to_go_to_main_menu: self._go_to_main_menu ( ) @@ -719,16 +690,6 @@ def _save_text_and_correct_answer_of_quest_in_session_data (self, difficulty_lev case _: raise ValueError ("Указан неправильный уровень сложности!") - def _say_that_user_can_change_their_difficulty_level_of_quest_if_it_is_not_said_yet (self) -> None: - if not self._SESSIONAL_DATA["was_said_that_user_can_change_difficulty_level_in_quest"]: - text = [ - "В любой момент вы можете сменить уровень сложности, сказав: \"Хочу сменить сложность\";\n", - "или выйти на главное меню, сказав: \"На главное меню\".\n", - "Так же вы можете узнать количество правильно отвеченных вопросов, сказав: \"Покажи результаты\".\n", - "Вот квест.\n\n" - ] - self._OUTPUT_TEXT += "".join (text) - self._SESSIONAL_DATA["was_said_that_user_can_change_difficulty_level_in_quest"] = True def _get_text_of_current_quest (self) -> str: return self._SESSIONAL_DATA["text_of_quest"] @@ -744,8 +705,18 @@ def _show_quest (self) -> None: self._OUTPUT_TEXT += self._get_text_of_current_quest ( ) self._BUTTONS.add_buttons (*self._buttons_for_choosing_correct_answer, hide_all = True) + def _say_that_user_can_change_their_difficulty_level_of_quest_if_it_is_not_said_yet (self) -> None: + if not self._SESSIONAL_DATA["was_said_that_user_can_change_difficulty_level_in_quest"]: + text = [ + "Вы можете узнать количество правильно отвеченных вопросов, сказав: \"Покажи результаты\".\n", + "Также вы можете сменить уровень сложности, сказав: \"Хочу сменить сложность\";\n", + "или выйти на главное меню, сказав: \"На главное меню\".\n", + "Вот квест.\n\n" + ] + self._OUTPUT_TEXT += "".join (text) + self._SESSIONAL_DATA["was_said_that_user_can_change_difficulty_level_in_quest"] = True + - @save_last_phrase def _choosing_right_answer_for_quest (self) -> None: if self._has_one_word_in_text_in_lower ("1", "один", "первый", "первое"): if self._SESSIONAL_DATA["correct_answer_of_quest"] == 1: @@ -770,7 +741,7 @@ def _choosing_right_answer_for_quest (self) -> None: self._SESSIONAL_DATA["state"] = "working_with_quest" self._OUTPUT_TEXT = random.choice (("Хорошо.", "Отлично.")) + "\n" self._OUTPUT_TEXT += "Теперь просто скажите нужный уровень сложности." - self._BUTTONS.add_buttons (*self._buttons_for_choosing_difficutly_level, hide_all = True) + self._BUTTONS.add_buttons (*self._buttons_for_choosing_difficutly_level, hide_all = False) elif self._has_one_word_in_text_in_lower ("результат", "результаты"): self._show_results_of_quest_and_next_quest ( ) @@ -794,8 +765,10 @@ def _correct_answer_of_quest_is_selected (self) -> None: self._TEXT_TO_SPEECH = get_random_win_sound ( ) + text_that_says_answer_is_correct current_difficulty_level = self._SESSIONAL_DATA["difficulty_level_of_quest"] self._save_text_and_correct_answer_of_quest_in_session_data (current_difficulty_level) - self._OUTPUT_TEXT += self._get_text_of_current_quest ( ) - self._TEXT_TO_SPEECH += self._get_text_of_current_quest ( ) + text_of_current_quest = self._get_text_of_current_quest ( ) + self._OUTPUT_TEXT += text_of_current_quest + self._TEXT_TO_SPEECH += text_of_current_quest + self._CARD = make_big_win_picture (text_that_says_answer_is_correct, text_of_current_quest) self._SESSIONAL_DATA["number_of_correct_quest_answers"] += 1 self._BUTTONS.add_buttons (*self._buttons_for_choosing_correct_answer, hide_all = True) @@ -821,10 +794,10 @@ def _show_results_of_quest_and_next_quest (self) -> None: self._BUTTONS.add_buttons ("Продолжить квест", "На главное меню", "Пока", hide_all = True) else: - self._OUTPUT_TEXT = "Пока вы не ответили ни на один квест." - self._make_all_sessional_data_false ( ) - self._BUTTONS.add_buttons_of_main_menu_in_text ( ) + self._OUTPUT_TEXT = "Пока вы не ответили ни на один квест.\nСкажите уровень сложности (лёгкий, средний, высокий или случайный), чтобы проверить ваши знания." + self._BUTTONS.add_buttons (*self._difficulty_levels, hide_all = False) + self._CARD = make_big_looking_results_picture ("Результаты", self._OUTPUT_TEXT) self._TEXT_TO_SPEECH = get_random_sound_of_looking_results ( ) + self._OUTPUT_TEXT @@ -835,7 +808,6 @@ def _wrong_answer_of_quest_is_selected (self) -> None: self._BUTTONS.add_buttons (*self._buttons_for_choosing_correct_answer, hide_all = True) - @save_last_phrase def _viewing_quest_results (self) -> None: if self._has_one_word_in_text_in_lower ("продолжить"): self._SESSIONAL_DATA["state"] = "choosing_right_answer_for_quest" @@ -858,7 +830,6 @@ def _viewing_quest_results (self) -> None: self._BUTTONS.add_buttons ("Продолжить квест", "На главное меню", "Пока", hide_all = True) - @save_last_phrase def _sending_report (self) -> None: # Доработать # FIXME self._BUTTONS.add_buttons ("На главное меню", "Пока!", hide_all = True) @@ -872,7 +843,6 @@ def _sending_report (self) -> None: self._OUTPUT_TEXT = get_apology_text ( ) - @save_last_phrase def _consulting (self) -> None: # Доработать # FIXME self._BUTTONS.add_buttons ("На главное меню", "Пока!", hide_all = True) @@ -911,19 +881,13 @@ def _go_to_main_menu (self) -> None: def _end_the_session (self) -> None: - self._OUTPUT_TEXT = get_farewell_text ( ) + farewell_text = get_farewell_text ( ) + self._CARD = make_big_farewell_picture (farewell_text) + self._OUTPUT_TEXT = farewell_text # Без этого выдаёт ошибку, что self._OUTPUT_TEXT нет + self._TEXT_TO_SPEECH = farewell_text self._IS_END_SESSION = True - def _make_big_bonus_picture (self, title: str, description: str) -> dict: - return { - "type": "BigImage", - "image_id": get_random_bonus_picture ( ), - "title": title, - "description": description - } - - def get_response (self) -> dict: if self._CARD: return { diff --git a/task_getter.py b/task_getter.py index 4812d37..0892e5c 100644 --- a/task_getter.py +++ b/task_getter.py @@ -22,7 +22,6 @@ def _create_groups (self) -> None: self.easy_tasks = [ ] self.medium_tasks = [ ] self.hard_tasks = [ ] - self.very_hard_tasks = [ ] def _group_tasks (self) -> None: for task_number in self.all_tasks.keys(): @@ -34,8 +33,6 @@ def _group_tasks (self) -> None: self.medium_tasks.append (task) case DifficultyLevels.HARD.value: self.hard_tasks.append (task) - case DifficultyLevels.VERY_HARD.value: - self.very_hard_tasks.append (task) case _: raise ValueError (f"Неправильно задана сложность квеста №{task_number}!") @@ -49,5 +46,10 @@ def get_random_medium_task (self) -> dict[str, str]: def get_random_hard_task (self) -> dict[str, str]: return random.choice (self.hard_tasks) - def get_random_very_hard_task (self) -> dict[str, str]: - return random.choice (self.very_hard_tasks) \ No newline at end of file + def get_random_task (self) -> dict[str, str]: + func_calls = [ + self.get_random_easy_task, + self.get_random_medium_task, + self.get_random_hard_task + ] + return random.choice (func_calls)( ) \ No newline at end of file diff --git a/texts_for_users.json b/texts_for_users.json index 3ee0a26..89f2020 100644 --- a/texts_for_users.json +++ b/texts_for_users.json @@ -25,9 +25,9 @@ "Курс", "Задачка", "Квест", - "Оцени мои знания", "Консультант по Python", - "Отправить отчёт" + "Отправить отчёт", + "Помощь" ], "you_stopped_at_lesson": [ "Что ж, вы остановились на уроке №", @@ -120,17 +120,34 @@ "sound_of_looking_results": [ "" ], - "big_win_pictures": [ - "965417/7161a486d1e7e0670ec5", - "213044/db4371540b8acfcb6317", - "937455/60c021bd3b03311e07c3", - "213044/eb8fd3fd258b4d6f44aa", - "213044/33d58e43a4a48fe10a7d" - ], - "bonus_pictures": [ - "997614/a46a6eeb5da6e2fc4082", - "997614/e29905186dfd5971e3d3", - "213044/e4dde40f438b8fded539", - "1540737/2fef8f86192b49200d8b" + "win_pictures": [ + "1540737/634a305ed56f6f7ede01", + "213044/9c1470ed03227033b661", + "937455/004bdc782fbcccd77531", + "1521359/1683ddf9049cd203906f", + "937455/ab221dde314bcd195fbc" + ], + "looking_results_pictures": [ + "1540737/a6bf94f7ebc94229d96b", + "1652229/ff10d6281e46e9b5becf", + "965417/b11257b12517bf440d31", + "997614/e720f4e3e6e5bf590e3a" + ], + "level_up_pictures": [ + "213044/0bfd3d679fbd6602077b", + "997614/a0f708b6be670871c16e", + "1030494/16ddb523730ae56eec5c", + "1540737/d54af27b7569052bd88d" + ], + "farewell_pictures": [ + "937455/56a988584d91787345e6", + "1030494/6f0db7964ca9d22546dc", + "937455/b0ced309358328e459cb", + "213044/ca81b57f73a34a12758d", + "1533899/2e9809613f8f8dc0266c", + "937455/a820c0631dfc61cc0a06", + "213044/c1a8157f80e4c57d38b4", + "1540737/1f1d45c8e2769da37f08", + "1652229/9c3d0955a53dd162354a" ] } \ No newline at end of file diff --git a/useful_functions.py b/useful_functions.py index 4aa60c6..4e8c21f 100644 --- a/useful_functions.py +++ b/useful_functions.py @@ -8,6 +8,7 @@ def create_sessional_data (sessional_data: dict) -> dict: "last_output_text": "", "last_text_to_speech": "", "last_buttons": [ ], + "last_card": { }, "text_of_quest": "", "correct_answer_of_quest": 0, "difficulty_level_of_quest": 0, @@ -47,7 +48,7 @@ def get_user_greeting ( ) -> str: def get_text_that_says_user_is_just_in_main_menu ( ) -> str: - return "Вы на главном меню!\nМои основные команды:" + return "Вы на главном меню!" def create_buttons (*button_texts: str) -> list[dict]: @@ -77,4 +78,79 @@ def calculate_python_knowledge (number_of_correct_answers: int, else: python_knowledge = number_of_correct_answers / (number_of_correct_answers + number_of_wrong_answers) * 100 - return round (python_knowledge, 1) \ No newline at end of file + return round (python_knowledge, 1) + + +def code_to_speech(code: str) -> str: + """Переводит код в слова и выводит готовый текст в пронумерованном столбце.""" + REPLACEMENTS: dict = _get_replacements ( ) + + PAUSE = "sil <[250]>" + lines = code.split("\n") + formatted_lines = [ ] + for i, line in enumerate(lines, start=1): + formatted_line = line + for key in REPLACEMENTS.keys(): + formatted_line = formatted_line.replace(key, REPLACEMENTS[key]) + formatted_lines.append(f"{PAUSE} строка {i} {PAUSE} {formatted_line}") + return "\n".join(formatted_lines) + PAUSE + +def _get_replacements ( ) -> dict: + """Возвращает словарь с заменами символов на слова.""" + return { + ")": " скобка закрывается ", + "(": " скобка открывается ", + "*": " звёздочка ", + "'": " кавычки ", + '"': " кавычки ", + "{": " фигурная скобка открывается ", + "}": " фигурная скобка закрывается ", + ":": " двоеточие ", + "!": " восклицательный знак ", + ".": " точка ", + ",": " запятая ", + "[": " квадратная скобка открывается ", + "]": " квадратная скобка закрывается ", + "||": " две вертикальные линии (операция или) ", + ">": " больше ", + "<": " меньше ", + "/": " разделить ", + "-": " минус ", + "+": " плюс ", + "%": " процент ", + "@": " собачка ", + "&": " амперсанд " + } + + +def make_big_win_picture (title: str, description: str = "") -> dict: + return { + "type": "BigImage", + "image_id": get_random_win_picture ( ), + "title": title, + "description": description + } + +def make_big_level_up_picture (title: str, description: str = "") -> dict: + return { + "type": "BigImage", + "image_id": get_random_level_up_picture ( ), + "title": title, + "description": description + } + +def make_big_looking_results_picture (title: str, description: str = "") -> dict: + return { + "type": "BigImage", + "image_id": get_random_looking_results_pictures ( ), + "title": title, + "description": description + } + +def make_big_farewell_picture (title: str, description: str = "") -> dict: + return { + "type": "BigImage", + "image_id": get_random_farewell_picture ( ), + "title": title, + "description": description + } \ No newline at end of file From 4c5188e97a245a76faf13f1ed93b614826562925 Mon Sep 17 00:00:00 2001 From: TchTech <67865526+TchTech@users.noreply.github.com> Date: Mon, 27 Mar 2023 15:47:06 +0300 Subject: [PATCH 23/31] Update main4.py --- main4.py | 30 ++++++++++-------------------- 1 file changed, 10 insertions(+), 20 deletions(-) diff --git a/main4.py b/main4.py index f43c98b..d46aa72 100644 --- a/main4.py +++ b/main4.py @@ -7,7 +7,7 @@ from task_getter import TaskGetter from buttons import Buttons from enums import * - +from consultant import ArtificialIntelligence from typing import Literal @@ -99,7 +99,11 @@ def _working_with_user_in_main_menu (self) -> None: self._OUTPUT_TEXT += "можете продолжить последнюю или переслушать текущую." self._BUTTONS.add_buttons (*self._commands_of_course, hide_all = False) self._BUTTONS.add_buttons ("Повтори", hide_all = True) - + elif self._has_one_word_in_text_in_lower( + "консультант", "консультанту", "консультанта", "консультанты", "консультанте", "консультация", "консультацию", "консультации", "консультацией", "консультантом" + ): + self._SESSIONAL_DATA["state"] = "consulting" + self._OUTPUT_TEXT = "Я готова подобрать вам справку по теме вашей проблемы. С чем вам помочь?\n" elif self._has_one_word_in_text_in_lower ( "задачка", "задачки", "задачку", "задачке", "задачкой", "задача", "задачи", "задачу", "задаче", "задачей", @@ -129,14 +133,6 @@ def _working_with_user_in_main_menu (self) -> None: self._OUTPUT_TEXT += "Может, на главное меню?" self._BUTTONS.add_buttons ("На главное меню", "Повтори", "Пока!", hide_all = True) - elif self._has_one_word_in_text_in_lower ( - "консультант", "консультанта", "консультанту", "консультантом", "консультанте" - "консультация", "консультации", "консультацию", "консультацией", "проконсультируй"): - self._SESSIONAL_DATA["state"] = "consulting" - self._OUTPUT_TEXT = "Пока я не могу вас проконсультировать, извините...\n" - self._OUTPUT_TEXT += "Может, на главное меню?" - self._BUTTONS.add_buttons ("На главное меню", "Повтори", "Пока!", hide_all = True) - elif self._user_needs_help: self._OUTPUT_TEXT = "Сейчас я вам помогу. В главном меню есть следующие команды: " self._TEXT_TO_SPEECH = self._OUTPUT_TEXT + get_main_commands_of_skill ( ) @@ -844,17 +840,11 @@ def _sending_report (self) -> None: def _consulting (self) -> None: - # Доработать # FIXME + ai = ArtificialIntelligence("lessons.json") self._BUTTONS.add_buttons ("На главное меню", "Пока!", hide_all = True) - if self._user_wants_to_go_to_main_menu: - self._go_to_main_menu ( ) - - elif self._user_wants_to_hear_last_phrase: - self._say_last_phrase ( ) - elif self._user_wants_to_end_session: - self._end_the_session ( ) - else: - self._OUTPUT_TEXT = get_apology_text ( ) + a = ["Хм...", "Ага...", "Итак,", "Хорошо,", "Смотрите,"] + self._OUTPUT_TEXT = random.choice(a)+" я нашла что-то, что может вам помочь, послушайте: " + ai.get_similarity(" ".join(self._WORDS_OF_TEXT_IN_LOWER) + "\nКуда теперь?") + self._SESSIONAL_DATA['state'] = "in_main_menu" def _has_all_words_in_text_in_lower (self, *words) -> bool: From e9a32ad2774594ef7ab62ec7d1a9d0a4503d7320 Mon Sep 17 00:00:00 2001 From: Alexonys1 <107358560+Alexonys1@users.noreply.github.com> Date: Tue, 28 Mar 2023 18:48:49 +0300 Subject: [PATCH 24/31] =?UTF-8?q?=D0=9E=D0=B1=D0=BD=D0=BE=D0=B2=D0=B8?= =?UTF-8?q?=D0=BB=20=D0=BD=D0=B0=D0=B2=D1=8B=D0=BA.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Добавлена "Помощь" и "Что ты умеешь". --- json_manager.py | 3 ++ lessons.json | 32 +++++++++--------- main4.py | 77 +++++++++++++++++++++++++++++++++++++------- quests.json | 4 +-- texts_for_users.json | 40 +++++++++++++++-------- useful_functions.py | 3 ++ 6 files changed, 117 insertions(+), 42 deletions(-) diff --git a/json_manager.py b/json_manager.py index 7469fa1..3deda60 100644 --- a/json_manager.py +++ b/json_manager.py @@ -92,6 +92,9 @@ def get_random_sound_of_looking_results ( ) -> str: def get_introduction_sound ( ) -> str: return "" +def get_random_farewell_sound ( ) -> str: + return random.choice (texts_for_users["farewell_sounds"]) + def get_random_win_picture ( ) -> str: return random.choice (texts_for_users["win_pictures"]) diff --git a/lessons.json b/lessons.json index 81019d7..509de87 100644 --- a/lessons.json +++ b/lessons.json @@ -2,13 +2,13 @@ "Урок 1: Введение в Python": { "Предисловие": "Python – простой и минималистичный язык. Чтение хорошей программы на Python очень напоминает чтение английского текста, хотя и достаточно строгого! Такая псевдо-кодовая природа Python является одной из его самых сильных сторон. Она позволяет вам сосредоточиться на решении задачи, а не на самом языке.", "Python - Язык высокого уровня": "При написании программы на Python вам никогда не придётся отвлекаться на такие низкоуровневые детали, как управление памятью, используемой вашей программой, и т.п.", - "Python - Язык объектно-ориентированный": "Python поддерживает как процедурно-ориентированное, так и объектноориентированное программирование. В процедурно-ориентированных языках программы строятся на основе процедур или функций, которые представляют собой просто-напросто многократно используемые фрагменты программы. В объектно-ориентированных языках программирования программы строятся на основе объектов, объединяющих в себе данные и функционал. \n\n__Python предоставляет простые, но мощные средства для ООП, особенно в сравнении с такими большими языками программирования, как C++ или Java.__" , + "Python - Язык объектно-ориентированный": "Python поддерживает как процедурно-ориентированное, так и объектноориентированное программирование. В процедурно-ориентированных языках программы строятся на основе процедур или функций, которые представляют собой просто-напросто многократно используемые фрагменты программы. В объектно-ориентированных языках программирования программы строятся на основе объектов, объединяющих в себе данные и функционал. \n\nPython предоставляет простые, но мощные средства для ООП, особенно в сравнении с такими большими языками программирования, как C++ или Java." , "Python - Язык встраиваемый": "В Python можно встраивать в программы на C/C++, чтобы предоставлять возможности написания сценариев их пользователям." }, "Урок 2: Установка Python": { "Предисловие": "Итак для того чтобы нам начать писать код нужно установть сам Python, а так же редактор для него ", "Установка в Windows": "Посетите страницу http://www.python.org/download/ и загрузите последнюю версию. Установка производится так же, как и для любых других программ для Windows.", - "Выбор редактора": "Поскольку мы не можем набирать программу в командной т.к, нам понадобится сохранять программы в файлах. \n\nИтак нам нужен редактор для работы с файлами программ. Выбор редактора крайне важен. Хороший редактор поможет вам легко писать программы на Python, делая ваше путешествие более комфортным, а также позволяя быстрее и безопаснее достичь вашей цели. \n\nОдно из самых основных требований – это __подсветка синтаксиса__, когда разные элементы программы на Python раскрашены так, чтобы вы могли легко видеть вашу программу и ход её выполнения. \n\nЕсли вы не знаете, с чего начать, мы бы порекомендовали вам пользоваться программой PyCharm", + "Выбор редактора": "Поскольку мы не можем набирать программу в командной т.к, нам понадобится сохранять программы в файлах. \n\nИтак нам нужен редактор для работы с файлами программ. Выбор редактора крайне важен. Хороший редактор поможет вам легко писать программы на Python, делая ваше путешествие более комфортным, а также позволяя быстрее и безопаснее достичь вашей цели. \n\nОдно из самых основных требований – это подсветка синтаксиса, когда разные элементы программы на Python раскрашены так, чтобы вы могли легко видеть вашу программу и ход её выполнения. \n\nЕсли вы не знаете, с чего начать, мы бы порекомендовали вам пользоваться программой PyCharm", "Создание проекта": "Запустите выбранный вами редактор, введите следующую программу и сохраните её под именем helloworld.py . \n\nЕсли вы пользуетесь PyCharm, нажмите «New Project» → «выберете путь где будут хранится ваши программы» → «создавайте проект!»" }, "Урок 3: Основы": { @@ -41,9 +41,9 @@ "Пример оператора if": "`number = 23`\n`guess = int(input('Введите целое число : '))`\n\n`if guess == number:`\n `print('Поздравляю, вы угадали,') # Начало нового блока`\n `print('(хотя и не выиграли никакого приза!)')`\n`elif guess < number:`\n `print('Нет, загаданное число немного больше этого.') # Ещё один блок`\n`else:`\n `print('Нет, загаданное число немного меньше этого.')`", "Оператор while": "Оператор while позволяет многократно выполнять блок команд до тех пор, пока выполняется некоторое условие. Это один из так называемых операторов цикла. Он также может иметь необязательный пункт else.", "Пример оператора while": "`number = 23`\n`running = True`\n\n`while running:`\n `guess = int(input('Введите целое число : '))`\n\n `if guess == number:`\n `print('Поздравляю, вы угадали.')`\n `running = False`\n `elif guess < number:`\n `print('Нет, загаданное число немного больше этого.')`\n `else:`\n `print('Нет, загаданное число немного меньше этого.')`\n`else:`\n `print('Цикл while закончен.')`", - "Цикл for": "Оператор for..in также является оператором цикла, который осуществляет итерацию по последовательности объектов, т.е. проходит через каждый элемент в последовательности. __Мы узнаем больше о последовательностях в дальнейших главах, а пока просто запомните, что последовательность – это упорядоченный набор элементов.__", + "Цикл for": "Оператор for..in также является оператором цикла, который осуществляет итерацию по последовательности объектов, т.е. проходит через каждый элемент в последовательности. Мы узнаем больше о последовательностях в дальнейших главах, а пока просто запомните, что последовательность – это упорядоченный набор элементов.", "Пример цикла for": "`for i in range(1, 5):`\n `print(i)\nelse:`\n `print('Цикл for закончен')`", - "Оператор break": "Оператор break служит для прерывания цикла, т.е. остановки выполнения команд даже если условие выполнения цикла ещё не приняло значения False или последовательность элементов не закончилась.\n\n__Важно отметить, что если циклы for или while прервать оператором break, соответствующие им блоки else выполняться не будут.__", + "Оператор break": "Оператор break служит для прерывания цикла, т.е. остановки выполнения команд даже если условие выполнения цикла ещё не приняло значения False или последовательность элементов не закончилась.\n\nВажно отметить, что если циклы for или while прервать оператором break, соответствующие им блоки else выполняться не будут.", "Пример оператора break": "`while True:`\n `s = input('Введите что-нибудь : ')`\n `if s == 'выход'`:\n `break`\n `print('Длина строки:', len(s))`", "Оператор continue": "Оператор continue используется для указания Python, что необходимо пропустить все оставшиеся команды в текущем блоке цикла и продолжить со следующей итерации цикла", "Пример оператора continue": "`while True:`\n `s = input('Введите что-нибудь : ')`\n `if s == 'выход':`\n `break`\n `if len(s) < 3:`\n `print('Слишком мало')`\n `continue`\n `print('Введённая строка достаточной длины')`" @@ -52,7 +52,7 @@ "Предисловие": "Функции – это многократно используемые фрагменты программы. Они позволяют дать имя определённому блоку команд с тем, чтобы впоследствии запускать этот блок по указанному имени в любом месте программы и сколь угодно много раз. Это называется вызовом функции. Мы уже использовали много встроенных функций, как то len и range.\n\nФункции определяются при помощи зарезервированного слова def. После этого слова указывается имя функции, за которым следует пара скобок, в которых можно указать имена некоторых переменных, и заключительное двоеточие в конце строки. Далее следует блок команд, составляющих функцию.", "Пример применения функций": "`def sayHello():`\n `print('Привет, Мир!')`\n`sayHello() # вызов функции`", "Как это работают функции": "Мы определили функцию с именем sayHello, используя описанный выше синтаксис. Эта функция не принимает параметров, поэтому в скобках не объявлены какие-либо переменные. Параметры функции – это некие входные данные, которые мы можем передать функции, чтобы получить соответствующий им результат.", - "Параметры функций": "Функции могут принимать параметры, т.е. некоторые значения, передаваемые функции для того, чтобы она что-либо сделала с ними. Эти параметры похожи на переменные, за исключением того, что значение этих переменных указывается при вызове функции, и во время работы функции им уже присвоены их значения.\n\nПараметры указываются в скобках при объявлении функции и разделяются запятыми. Аналогично мы передаём значения, когда вызываем функцию. __Обратите внимание на терминологию: имена, указанные в объявлении функции, называются параметрами, тогда как значения, которые вы передаёте в функцию при её вызове, – аргументами.__", + "Параметры функций": "Функции могут принимать параметры, т.е. некоторые значения, передаваемые функции для того, чтобы она что-либо сделала с ними. Эти параметры похожи на переменные, за исключением того, что значение этих переменных указывается при вызове функции, и во время работы функции им уже присвоены их значения.\n\nПараметры указываются в скобках при объявлении функции и разделяются запятыми. Аналогично мы передаём значения, когда вызываем функцию. Обратите внимание на терминологию: имена, указанные в объявлении функции, называются параметрами, тогда как значения, которые вы передаёте в функцию при её вызове, – аргументами.", "Пример": "`def printMax(a, b):`\n `if a > b:`\n `print(a, 'максимально')`\n `elif a == b:`\n `print(a, 'равно', b)`\n `else:`\n `print(b, 'максимально')`\n\n`printMax(3, 4) # прямая передача значений`\n\n`x = 5`\n`y = 7`\n\n`printMax(x, y) # передача переменных в качестве аргументов`", "Как это работает": "Здесь мы определили функцию с именем printMax, которая использует два параметра с именами a и b. Мы находим наибольшее число с применением простого оператора if..else и выводим это число.\n\nПри первом вызове функции printMax мы напрямую передаём числа в качестве аргументов. Во втором случае мы вызываем функцию с переменными в качестве аргументов. printMax(x, y) назначает значение аргумента x параметру a, а значение аргумента y – параметру b. В обоих случаях функция printMax работает одинаково.", "Локальные переменные": "При объявлении переменных внутри определения функции, они никоим образом не связаны с другими переменными с таким же именем за пределами функции – т.е. имена переменных являются локальными в функции. Это называется областью видимости переменной. Область видимости всех переменных ограничена блоком, в котором они объявлены, начиная с точки объявления имени.", @@ -60,7 +60,7 @@ "Как это работает": "При первом выводе значения, присвоенного имени x, в первой строке функции Python sиспользует значение параметра, объявленного в основном блоке, выше определения функции.\n\nДалее мы назначаем x значение 2. Имя x локально для нашей функции. Поэтому когда мы заменяем значение x в функции, x, объявленный в основном блоке, остаётся незатронутым.\n\nПоследним вызовом функции print мы выводим значение x, указанное в основном блоке, подтверждая таким образом, что оно не изменилось при локальном присваивании значения в ранее вызванной функции.", "Зарезервированное слово global": "Чтобы присвоить некоторое значение переменной, определённой на высшем уровне программы необходимо указать глобально. Сделаем это при помощи зарезервированного слова global. Без применения global невозможно присвоить значение переменной, определённой за пределами функции.\n\nИспользование зарезервированного слова global достаточно ясно показывает, что переменная объявлена в самом внешнем блоке.", "Пример": "`x = 50`\n\n`def func():`\n `global x`\n\n `print('x равно', x)`\n `x = 2`\n `print('Заменяем глобальное значение x на', x)`\n\n`func()`\n`print('Значение x составляет', x)`", - "Как это работает": "Зарезервированное слово global используется для того, чтобы объявить, что x – это глобальная переменная, а значит, когда мы присваиваем значение имени x внутри функции, это изменение отразится на значении переменной x в основном блоке программы.\n\n__Используя одно зарезервированное слово global, можно объявить сразу несколько переменных: global x, y, z.__", + "Как это работает": "Зарезервированное слово global используется для того, чтобы объявить, что x – это глобальная переменная, а значит, когда мы присваиваем значение имени x внутри функции, это изменение отразится на значении переменной x в основном блоке программы.\n\nИспользуя одно зарезервированное слово global, можно объявить сразу несколько переменных: global x, y, z.", "Зарезервированное слово nonlocal": "****\n\nМы увидели, как получать доступ к переменным в локальной и глобальной области видимости. Есть ещё один тип области видимости, называемый «нелокальной» (nonlocal) областью видимости, который представляет собой нечто среднее между первыми двумя. Нелокальные области видимости встречаются, когда вы определяете функции внутри функций.", "Пример": "`def func_outer():`\n `x = 2`\n `print('x равно', x)`\n\n `def func_inner():`\n `nonlocal x`\n `x = 5`\n\n `func_inner()`\n `print('Локальное x сменилось на', x)`\n\n`func_outer()`", "Как это работает": "Когда мы находимся внутри func_inner, переменная x, определённая в первой строке func_outer находится ни в локальной области видимости (определение переменной не входит в блок func_inner), ни в глобальной области видимости (она также и не в основном блоке программы). Мы объявляем, что хотим использовать именно эту переменную x, следующим образом: nonlocal x.", @@ -84,12 +84,12 @@ "Файлы байткода .pyc": "Импорт модуля – относительно дорогостоящее мероприятие, поэтому Python предпринимает некоторые трюки для ускорения этого процесса. Один из способов – создать байткомпилированные файлы (или байткод) с расширением .pyc, которые являются некой промежуточной формой, в которую Python переводит программу (помните раздел «Введение» о том, как работает Python?). Такой файл .pyc полезен при импорте модуля в следующий раз в другую программу – это произойдёт намного быстрее, поскольку значительная часть обработки, требуемой при импорте модуля, будет уже проделана. Этот байткод также является платформо-независимым.", "Оператор from... import...": "Чтобы импортировать переменную argv прямо в программу и не писать всякий раз sys. При обращении к ней, можно воспользоваться выражением «from sys import argv».\n\nДля импорта всех имён, использующихся в модуле sys, можно выполнить команду «from sys import *». Это работает для любых модулей.\n\nВ общем случае вам следует избегать использования этого оператора и использовать вместо этого оператор import, чтобы предотвратить конфликты имён и не затруднять чтение программы.", "Создание собственных модулей": "Создать собственный модуль очень легко. Да вы всё время делали это! Ведь каждая программа на Python также является и модулем. Необходимо лишь убедиться, что у неё установлено расширение .py.", - "Пример": "`def sayhi():`\n `print('Привет! Это говорит мой модуль.')`\n\n`__version__ = '0.1'`\n\n`# Конец модуля mymodule.py`", + "Пример": "`def sayhi():`\n `print('Привет! Это говорит мой модуль.')`\n\n`version = '0.1'`\n\n`# Конец модуля mymodule.py`", "Функция dir": "Встроенная функция dir() возвращает список имён, определяемых объектом. Например, для модуля в этот список входят функции, классы и переменные, определённые в этом модуле.\n\nЭта функция может принимать аргументы. Если в качестве аргумента указано имя модуля, она возвращает список имён, определённых в этом модуле. Если никакого аргумента не передавать, она вернёт список имён, определённых в текущем модуле.", - "Пример": "`$ python3`\n\n`>>> import sys # получим список атрибутов модуля 'sys'`\n\n`>>> dir(sys)`\n`['getfilesystemencoding', 'getprofile', 'getrecursionlimit', 'getrefcount', 'getsizeof', 'gettrace', porter_cache', 'platform', 'prefix', 'ps1', 'ps2', 'setcheckinterval', 'setprofile', 'setrecursionlimit', 'settrace', 'stderr', 'stdin', 'stdout', 'subversion', 'version', 'version_info', 'warnoptions', 'winver']`\n\n`>>> dir() # получим список атрибутов текущего модуля`\n`['__builtins__', '__doc__', '__name__', '__package__', 'sys']`\n\n`>>> a = 5 # создадим новую переменную 'a'`\n\n`>>> dir()`\n`['__builtins__', '__doc__', '__name__', '__package__', 'a', 'sys']`\n\n`>>> del a # удалим имя 'a'`\n\n`>>> dir()`\n`['__builtins__', '__doc__', '__name__', '__package__', 'sys']`\n\n`>>>`", - "Как это работает": "Мы вызываем функцию dir, не передавая ей параметров. По умолчанию, она возвращает список атрибутов текущего модуля. __Обратите внимание, что список импортированных модулей также входит туда.__\n\nЧтобы пронаблюдать за действием dir, мы определяем новую переменную a и присваиваем ей значение, а затем снова вызываем dir. Видим, что в полученном списке появилось дополнительное значение. Удалим переменную/атрибут из текущего модуля при помощи оператора del, и изменения вновь отобразятся на выводе функции dir.\n\nЗамечание по поводу del: этот оператор используется для удаления переменной/имени, и после его выполнения, в данном случае – del a, к переменной a больше невозможно обратиться – её как будто никогда и не было.", - "Пакеты": "К настоящему времени вы, вероятно, начали наблюдать некоторую иерархию в организации ваших программ. Переменные обычно находятся в функциях. Функции и глобальные переменные обычно находятся в модулях. А что, если возникнет необходимость как-то организовать модули? Вот здесь-то и выходят на сцену пакеты.\n\nПакеты – это просто каталоги с модулями и специальным файлом __init__.py, который показывает Python, что этот каталог особый, так как содержит модули Python.\n\nПредставим, что мы хотим создать пакет под названием «world» с субпакетами «asia», «africa» и т.д., которые, в свою очередь, будут содержать модули «india», «madagascar» и т.д.", - "Пример": "Представим, что мы хотим создать пакет под названием «world» с субпакетами «asia», «africa» и т.д., которые, в свою очередь, будут содержать модули «india», «madagascar» и т.д.\n\nДля этого следовало бы создать следующую структуру каталогов:\n\n`| - <некоторый каталог из sys.path>/`\n`| |---- world/`\n`| |---- __init__.py`\n`| |---- asia/`\n`| | |---- __init__.py`\n`| | |---- india/`\n`| | |---- __init__.py`\n`| | |---- foo.py`\n`| |---- africa/`\n`| |---- __init__.py`\n`| |---- madagascar/`\n`| |---- __init__.py`\n`| |---- bar.py`" + "Пример": "`$ python3`\n\n`>>> import sys # получим список атрибутов модуля 'sys'`\n\n`>>> dir(sys)`\n`['getfilesystemencoding', 'getprofile', 'getrecursionlimit', 'getrefcount', 'getsizeof', 'gettrace', porter_cache', 'platform', 'prefix', 'ps1', 'ps2', 'setcheckinterval', 'setprofile', 'setrecursionlimit', 'settrace', 'stderr', 'stdin', 'stdout', 'subversion', 'version', 'version_info', 'warnoptions', 'winver']`\n\n`>>> dir() # получим список атрибутов текущего модуля`\n`['builtins', 'doc', 'name', 'package', 'sys']`\n\n`>>> a = 5 # создадим новую переменную 'a'`\n\n`>>> dir()`\n`['builtins', 'doc', 'name', 'package', 'a', 'sys']`\n\n`>>> del a # удалим имя 'a'`\n\n`>>> dir()`\n`['builtins', 'doc', 'name', 'package', 'sys']`\n\n`>>>`", + "Как это работает": "Мы вызываем функцию dir, не передавая ей параметров. По умолчанию, она возвращает список атрибутов текущего модуля. Обратите внимание, что список импортированных модулей также входит туда.\n\nЧтобы пронаблюдать за действием dir, мы определяем новую переменную a и присваиваем ей значение, а затем снова вызываем dir. Видим, что в полученном списке появилось дополнительное значение. Удалим переменную/атрибут из текущего модуля при помощи оператора del, и изменения вновь отобразятся на выводе функции dir.\n\nЗамечание по поводу del: этот оператор используется для удаления переменной/имени, и после его выполнения, в данном случае – del a, к переменной a больше невозможно обратиться – её как будто никогда и не было.", + "Пакеты": "К настоящему времени вы, вероятно, начали наблюдать некоторую иерархию в организации ваших программ. Переменные обычно находятся в функциях. Функции и глобальные переменные обычно находятся в модулях. А что, если возникнет необходимость как-то организовать модули? Вот здесь-то и выходят на сцену пакеты.\n\nПакеты – это просто каталоги с модулями и специальным файлом init.py, который показывает Python, что этот каталог особый, так как содержит модули Python.\n\nПредставим, что мы хотим создать пакет под названием «world» с субпакетами «asia», «africa» и т.д., которые, в свою очередь, будут содержать модули «india», «madagascar» и т.д.", + "Пример": "Представим, что мы хотим создать пакет под названием «world» с субпакетами «asia», «africa» и т.д., которые, в свою очередь, будут содержать модули «india», «madagascar» и т.д.\n\nДля этого следовало бы создать следующую структуру каталогов:\n\n`| - <некоторый каталог из sys.path>/`\n`| |---- world/`\n`| |---- init.py`\n`| |---- asia/`\n`| | |---- init.py`\n`| | |---- india/`\n`| | |---- init.py`\n`| | |---- foo.py`\n`| |---- africa/`\n`| |---- init.py`\n`| |---- madagascar/`\n`| |---- init.py`\n`| |---- bar.py`" }, "Урок 8: Структуры данных": { "Предисловие": "Структуры данных – это, по сути, и есть структуры, которые могут хранить некоторые данные вместе. Другими словами, они используются для хранения связанных данных.\n\nВ Python существуют четыре встроенных структуры данных: список, кортеж, словарь и множество. Посмотрим, как ими пользоваться, и как они могут облегчить нам жизнь.", @@ -116,24 +116,24 @@ "Пример": "`try:`\n `text = input('Введите что-нибудь --> ')`\n`except EOFError:`\n `print('Ну зачем вы сделали мне EOF?')`\n`except KeyboardInterrupt:`\n `print('Вы отменили операцию.')`\n`else:`\n `print('Вы ввели {0}'.format(text))`", "Как это работает": "Здесь мы поместили все команды, которые могут вызвать исключения/ошибки, внутрь блока try, а затем поместили обработчики соответствующих ошибок/исключений в блок except. Выражение except может обрабатывать как одиночную ошибку или исключение, так и список ошибок/исключений в скобках. Если не указано имя ошибки или исключения, обрабатываться будут все ошибки и исключения.", "Вызов исключения": "Исключение можно поднять при помощи оператора raise, передав ему имя ошибки/исключения, а также объект исключения, который нужно выбросить.\n\nВызываемая ошибка или исключение должна быть классом, который прямо или непрямо является производным от класса Exception.", - "Пример": "`class ShortInputException(Exception):`\n `'''Пользовательский класс исключения.'''`\n `def __init__(self, length, atleast):`\n `Exception.__init__(self)`\n `self.length = length`\n `self.atleast = atleast`\n\n`try:`\n `text = input('Введите что-нибудь --> ')`\n `if len(text) < 3:`\n `raise ShortInputException(len(text), 3)`\n `# Здесь может происходить обычная работа`\n`except EOFError:`\n `print('Ну зачем вы сделали мне EOF?')`\n`except ShortInputException as ex:`\n `print('ShortInputException: Длина введённой строки -- {0}; \\`\n `ожидалось, как минимум, {1}'.format(ex.length, ex.atleast))`\n`else:`\n `print('Не было исключений.')`", + "Пример": "`class ShortInputException(Exception):`\n `'''Пользовательский класс исключения.'''`\n `def init(self, length, atleast):`\n `Exception.init(self)`\n `self.length = length`\n `self.atleast = atleast`\n\n`try:`\n `text = input('Введите что-нибудь --> ')`\n `if len(text) < 3:`\n `raise ShortInputException(len(text), 3)`\n `# Здесь может происходить обычная работа`\n`except EOFError:`\n `print('Ну зачем вы сделали мне EOF?')`\n`except ShortInputException as ex:`\n `print('ShortInputException: Длина введённой строки -- {0}; \\`\n `ожидалось, как минимум, {1}'.format(ex.length, ex.atleast))`\n`else:`\n `print('Не было исключений.')`", "Как это работает": "Здесь мы создаём наш собственный тип исключения. Этот новый тип исключения называется ShortInputException. Он содержит два поля: length, хранящее длину введённого текста, и atleast, указывающее, какую минимальную длину текста ожидала программа.\n\nВ пункте except мы указываем класс ошибки ShortInputException, который будет сохранён как переменная ex, содержащая соответствующий объект ошибки/исключения. Это аналогично параметрам и аргументам при вызове функции. Внутри этого пункта except мы используем поля length и atleast объекта исключения для вывода необходимых сообщений пользователю.", "Try .. Finally": "Представим, что в программе происходит чтение файла и необходимо убедиться, что объект файла был корректно закрыт и что не возникло никакого исключения. Этого можно достичь с применением блока finally.", "Пример": "`import time`\n\n`try:`\n `f = open('poem.txt')`\n `while True: # наш обычный способ читать файлы`\n `line = f.readline()`\n `if len(line) == 0:`\n `break`\n `print(line, end='')`\n `time.sleep(2) # Пусть подождёт некоторое время`\n`except KeyboardInterrupt:`\n `print('!! Вы отменили чтение файла.')`\n`finally:`\n `f.close()`\n `print('(Очистка: Закрытие файла)')`", "Как это работает": "Здесь мы производим обычные операции чтения из файла, но в данном случае добавляем двухсекундный сон после вывода каждой строки при помощи функции time.sleep, чтобы программа выполнялась медленно (ведь Python очень быстр от природы). Во время выполнения программы нажмите ctrl-c, чтобы прервать/отменить выполнение программы.\n\nПронаблюдайте, как при этом выдаётся исключение KeyboardInterrupt, и программа выходит. Однако, прежде чем программа выйдет, выполняется пункт finally, и файловый объект будет всегда закрыт.", "Оператор with": "Типичной схемой является запрос некоторого ресурса в блоке try с последующим освобождением этого ресурса в блоке finally. Для того, чтобы сделать это более «чисто»,существует оператор with:", "Пример": "`with open(\"poem.txt\") as f:`\n `for line in f:`\n `print(line, end='')`", - "Как это работает": "Существует некий протокол, используемый оператором with. Он считывает объект, возвращаемый операторомopen.Назовём его в данном случае «thefile».\n\nПеред запуском блока кода, содержащегося в нём, оператор with всегда вызывает функцию thefile.__enter__, а также всегда вызывает thefile.__exit__ после завершения выполнения этого блока кода.\n\nТак что код, который мы бы написали в блоке finally, будет автоматически обработан методом __exit__. Это избавляет нас от необходимости повторно в явном виде указывать операторы try..finally." + "Как это работает": "Существует некий протокол, используемый оператором with. Он считывает объект, возвращаемый операторомopen.Назовём его в данном случае «thefile».\n\nПеред запуском блока кода, содержащегося в нём, оператор with всегда вызывает функцию thefile.enter, а также всегда вызывает thefile.exit после завершения выполнения этого блока кода.\n\nТак что код, который мы бы написали в блоке finally, будет автоматически обработан методом exit. Это избавляет нас от необходимости повторно в явном виде указывать операторы try..finally." }, "Урок 10: Дополнительно": { "Предисловие": "К настоящему моменту мы уже рассмотрели большую часть того, что вам придётся использовать при работе с Python. В этой главе мы охватим некоторые дополнительные аспекты, которые помогут отшлифовать ваши знания.", "Self": "Методы класса имеют одно отличие от обычных функций: они должны иметь дополнительно имя, добавляемое к началу списка параметров. Однако, при вызове метода никакого значения этому параметру присваивать не нужно – его укажет Python. Эта переменная указывает на сам объект экземпляра класса, и по традиции она называется self.\n\nХотя этому параметру можно дать любое имя, настоятельно рекомендуется использовать только имя self; использование любого другого имени не приветствуется. Есть много достоинств использования стандартного имени: во-первых, любой человек, просматривающий вашу программу, легко узнает его; во-вторых, некоторые специализированные Интегрированные среды разработки (IDE) изначально рассчитаны на использование self.", "Классы": "Классы предоставляют средства объединения данных и функциональности вместе. Создание нового класса создает объект нового типа, позволяя создавать новые экземпляры этого типа. К каждому экземпляру класса могут быть прикреплены атрибуты для поддержания его состояния. Экземпляры класса также могут иметь методы (определенные его классом) для изменения его состояния.", "Пример": "`class Person:`\n `pass # Пустой блок`\n\n`p = Person()`\n`print(p)`", - "Как это работает": "Мы создаём новый класс при помощи оператора class и имени класса. За этим следует блок выражений, формирующих тело класса. В данном случае блок у нас пуст, на что указывает оператор pass.\n\nДалее мы создаём объект-экземпляр класса, записывая имя класса со скобками. (Мы узнаем больше о реализации в следующем разделе). Для проверки мы выясняем тип переменной, просто выводя её на экран. Так мы видим, что у нас есть экземпляр класса Person в модуле __main__.\n\nОбратите внимание, что выводится также и адрес в памяти компьютера, где хранится ваш объект. На вашем компьютере адрес будет другим, так как Python хранит объекты там, где имеется свободное место.", + "Как это работает": "Мы создаём новый класс при помощи оператора class и имени класса. За этим следует блок выражений, формирующих тело класса. В данном случае блок у нас пуст, на что указывает оператор pass.\n\nДалее мы создаём объект-экземпляр класса, записывая имя класса со скобками. (Мы узнаем больше о реализации в следующем разделе). Для проверки мы выясняем тип переменной, просто выводя её на экран. Так мы видим, что у нас есть экземпляр класса Person в модуле main.\n\nОбратите внимание, что выводится также и адрес в памяти компьютера, где хранится ваш объект. На вашем компьютере адрес будет другим, так как Python хранит объекты там, где имеется свободное место.", "Методы объектов": "Итак, мы выяснили что классы/объекты могут иметь методы, представляющие собой функции, за исключением дополнительной переменной self. А теперь давайте рассмотрим пример", "Пример": "`class Person:`\n `def sayHi(self):`\n `print('Привет! Как дела?')`\n\n`p = Person()`\n`p.sayHi()`", - "Как это работает": "Здесь мы видим self в действии. __Обратите внимание, что метод sayHi не принимает параметров, но тем не менее, имеет self в определении функции.__", + "Как это работает": "Здесь мы видим self в действии. Обратите внимание, что метод sayHi не принимает параметров, но тем не менее, имеет self в определении функции.", "Блоки в одно выражение": "Мы неоднократно говорили, что каждый блок команд отделяется от других своим собственным уровнем отступа. Однако, существует и исключение. Если блок команд содержит только одно выражение, его можно указывать в одной строке с условным оператором или, скажем, оператором цикла. Рассмотрим это на примере:", "Пример": "`>>> flag = True`\n`>>> if flag: print('Да')`\n`Да`\n\nОбратите внимание, что единственный оператор расположен в той же строке, а не отдельным блоком. Этот способ может подкупить тем, что якобы «сокращает» программу, но мы настоятельно рекомендуем избегать его во всех случаях, кроме проверки ошибок. Прежде всего, потому что гораздо легче добавлять команды, когда уже есть необходимый уровень отступа.", "Lambda-функции": "Ключевое слово lambda используется для создания функций и возврата их значения во время выполнения программы. lambda принимает параметр, за которым следует одно выражение, которое становится телом функции, а значение этого выражения возвращается новой функцией.", @@ -149,7 +149,7 @@ "Оператор assert": "Оператор assert существует для того, чтобы указать, что нечто является истиной. Например, если требуется гарантировать, что в списке будет хотя бы один элемент, и вызвать ошибку, если это не так, то оператор assert идеально подойдёт для такой задачи. Когда заявленное выражение ложно, вызывается ошибка AssertionError. Метод pop() возвращает последний элемент списка, одновременно удаляя его оттуда.", "Пример": "`>>> mylist = ['item']`\n`>>> assert len(mylist) >= 1`\n`>>> mylist.pop()`\n`'item'`\n`>>> mylist`\n`[]`\n`>>> assert len(mylist) >= 1`\n`Traceback (most recent call last):`\n `File \"\", line 1, in `\n`AssertionError`", "Функция repr": "Функция repr используется для получения канонического строкового представления объекта. Любопытно, что в большинстве случаев eval(repr(object)) == object.", - "Пример": "`>>> i = []`\n`>>> i.append('item')`\n`>>> repr(i)`\n`\"['item']\"`\n`>>> eval(repr(i))`\n`['item']`\n`>>> eval(repr(i)) == i`\n`True`\n\nПо большому счёту, функция repr служит для получения печатаемого представления объекта. Определив метод __repr__ в собственном классе, можно указать, что он будет возвращать по вызову функции repr.", + "Пример": "`>>> i = []`\n`>>> i.append('item')`\n`>>> repr(i)`\n`\"['item']\"`\n`>>> eval(repr(i))`\n`['item']`\n`>>> eval(repr(i)) == i`\n`True`\n\nПо большому счёту, функция repr служит для получения печатаемого представления объекта. Определив метод repr в собственном классе, можно указать, что он будет возвращать по вызову функции repr.", "Установка библиотек": "В Каталоге пакетов Python существует колоссальное количество открытых библиотек, которые вы можете использовать в своих программах. Для их установки можно воспользоваться pip.", "Графические программы": "Для создания собственной графической программы на Python понадобится какая-нибудь библиотека ГИП (графического интерфейса пользователя) со своими привязками к Python. Привязки позволяют писать программу на Python, используя библиотеки, которые сами по себе написаны на C, C++ или других языках.", "Kivy": "https://kivy.org", diff --git a/main4.py b/main4.py index f43c98b..7bb03e5 100644 --- a/main4.py +++ b/main4.py @@ -49,7 +49,7 @@ def _working_with_user (self) -> None: if self._INTERSESSIONAL_DATA["new_user"]: self._OUTPUT_TEXT = get_text_for_new_user ( ) self._TEXT_TO_SPEECH = get_introduction_sound ( ) + get_text_for_new_user ( ) + "\n" - self._TEXT_TO_SPEECH += get_main_commands_of_skill ( ) + #self._TEXT_TO_SPEECH += get_main_commands_of_skill ( ) self._INTERSESSIONAL_DATA["new_user"] = False self._BUTTONS.add_buttons_of_main_menu_in_text ( ) @@ -58,7 +58,7 @@ def _working_with_user (self) -> None: user_greeting = get_user_greeting ( ) self._OUTPUT_TEXT = user_greeting self._TEXT_TO_SPEECH = get_introduction_sound ( ) + user_greeting - self._TEXT_TO_SPEECH += get_main_commands_of_skill ( ) + #self._TEXT_TO_SPEECH += get_main_commands_of_skill ( ) self._BUTTONS.add_buttons_of_main_menu_in_text ( ) # Пользователь просто в главном меню @@ -125,8 +125,7 @@ def _working_with_user_in_main_menu (self) -> None: elif self._has_one_word_in_text_in_lower ( "пожаловаться", "жалоба", "жалобу", "отчёт", "отчет"): self._SESSIONAL_DATA["state"] = "sending_report" - self._OUTPUT_TEXT = "Я не знаю, на какую почту отправлять жалобу...\n" - self._OUTPUT_TEXT += "Может, на главное меню?" + self._OUTPUT_TEXT = "Чтобы отправить отчёт разработчикам навыка, просто скажите его. Я вас внимательно слушаю." self._BUTTONS.add_buttons ("На главное меню", "Повтори", "Пока!", hide_all = True) elif self._has_one_word_in_text_in_lower ( @@ -138,13 +137,20 @@ def _working_with_user_in_main_menu (self) -> None: self._BUTTONS.add_buttons ("На главное меню", "Повтори", "Пока!", hide_all = True) elif self._user_needs_help: - self._OUTPUT_TEXT = "Сейчас я вам помогу. В главном меню есть следующие команды: " - self._TEXT_TO_SPEECH = self._OUTPUT_TEXT + get_main_commands_of_skill ( ) - self._BUTTONS.add_buttons_of_main_menu_in_text ( ) + self._OUTPUT_TEXT = "Всегда к вашим услугам!\nПослушайте мои функции:\n" + self._OUTPUT_TEXT += "Если вы хотите изучить Python, то скажите: \"Курс\".\n" + self._OUTPUT_TEXT += "Если хотите проверить свои теоретические знания Python, то скажите: \"Квест\".\n" + self._OUTPUT_TEXT += "А чтобы проверить практические знания, просто скажите: \"Задачки\".\n" + self._OUTPUT_TEXT += "Проговорив \"Отправить отчёт\", вы сможете отправить письмо разработчикам навыка." + self._OUTPUT_TEXT += "И сказав \"Консультант\", вы сможете получить ответ на заданный вопрос." + self._OUTPUT_TEXT += "Если вам что-то не понятно, то моя команда \"Помощь\" к вашим услугам.\n" elif self._user_wants_to_go_to_main_menu: self._OUTPUT_TEXT = "Вы уже на главном меню!" + elif self._user_wants_to_know_what_skill_can_do: + self._say_what_skill_can_do ( ) + elif self._user_wants_to_hear_last_phrase: self._say_last_phrase ( ) @@ -182,6 +188,17 @@ def _say_last_phrase (self) -> None: self._BUTTONS.BUTTONS = self._SESSIONAL_DATA["last_buttons"] self._CARD = self._SESSIONAL_DATA["last_card"] + @property + def _user_wants_to_know_what_skill_can_do (self) -> bool: + if self._has_all_words_in_text_in_lower ("что", "умеешь"): + return True + else: + return False + + def _say_what_skill_can_do (self) -> None: + self._OUTPUT_TEXT = get_text_that_says_what_skill_can_do ( ) + self._BUTTONS.BUTTONS = self._SESSIONAL_DATA["last_buttons"] + @save_last_phrase def _working_with_user_outside_main_menu (self) -> None: @@ -206,8 +223,8 @@ def _working_with_user_outside_main_menu (self) -> None: self._choosing_between_solve_and_code() case "_wish_to_see_solve": self._wish_to_see_solve() - case "_wish_to_see_solve": - self._wish_to_see_solve() + case "_wish_to_see_code": + self._wish_to_see_code() case "consulting": self._consulting ( ) @@ -281,6 +298,9 @@ def _working_with_course (self) -> None: elif self._user_wants_to_go_to_main_menu: self._go_to_main_menu ( ) + elif self._user_wants_to_know_what_skill_can_do: + self._say_what_skill_can_do ( ) + elif self._user_wants_to_hear_last_phrase: self._say_last_phrase ( ) @@ -323,6 +343,9 @@ def _choosing_between_solve_and_code(self) -> None: elif self._user_wants_to_go_to_main_menu: self._go_to_main_menu ( ) + elif self._user_wants_to_know_what_skill_can_do: + self._say_what_skill_can_do ( ) + elif self._user_wants_to_hear_last_phrase: self._say_last_phrase ( ) @@ -344,6 +367,9 @@ def _wish_to_see_solve(self): elif self._user_wants_to_go_to_main_menu: self._go_to_main_menu ( ) + elif self._user_wants_to_know_what_skill_can_do: + self._say_what_skill_can_do ( ) + elif self._user_wants_to_hear_last_phrase: self._say_last_phrase ( ) @@ -364,6 +390,9 @@ def _wish_to_see_solve(self): elif self._user_wants_to_go_to_main_menu: self._go_to_main_menu ( ) + elif self._user_wants_to_know_what_skill_can_do: + self._say_what_skill_can_do ( ) + elif self._user_wants_to_hear_last_phrase: self._say_last_phrase ( ) @@ -422,6 +451,9 @@ def _choosing_course_theme (self) -> None: elif self._user_wants_to_go_to_main_menu: self._go_to_main_menu ( ) + elif self._user_wants_to_know_what_skill_can_do: + self._say_what_skill_can_do ( ) + elif self._user_wants_to_hear_last_phrase: self._say_last_phrase ( ) @@ -467,6 +499,9 @@ def _start_next_lesson_or_not (self) -> None: elif self._user_wants_to_go_to_main_menu: self._go_to_main_menu ( ) + elif self._user_wants_to_know_what_skill_can_do: + self._say_what_skill_can_do ( ) + elif self._user_wants_to_hear_last_phrase: self._say_last_phrase ( ) @@ -528,6 +563,9 @@ def _working_with_tasks (self) -> None: elif self._user_wants_to_go_to_main_menu: self._go_to_main_menu ( ) + elif self._user_wants_to_know_what_skill_can_do: + self._say_what_skill_can_do ( ) + elif self._user_needs_help: self._OUTPUT_TEXT = "Всё будет хорошо! Здесь вам нужно всего лишь выбрать уровень сложности: лёгкий, средний или высокий.\n" self._OUTPUT_TEXT += "Также вы можете в любой момент переслушать задачу или выйти на главное меню." @@ -556,6 +594,9 @@ def _choosing_right_answer_for_task (self) -> None: if self._user_wants_to_go_to_main_menu: self._go_to_main_menu ( ) + elif self._user_wants_to_know_what_skill_can_do: + self._say_what_skill_can_do ( ) + elif self._user_wants_to_hear_last_phrase: self._say_last_phrase ( ) @@ -612,6 +653,9 @@ def _working_with_quest (self) -> None: elif self._user_wants_to_go_to_main_menu: self._go_to_main_menu ( ) + elif self._user_wants_to_know_what_skill_can_do: + self._say_what_skill_can_do ( ) + elif self._user_wants_to_hear_last_phrase: self._say_last_phrase ( ) @@ -749,6 +793,9 @@ def _choosing_right_answer_for_quest (self) -> None: elif self._user_wants_to_go_to_main_menu: self._go_to_main_menu ( ) + elif self._user_wants_to_know_what_skill_can_do: + self._say_what_skill_can_do ( ) + elif self._user_wants_to_hear_last_phrase: self._say_last_phrase ( ) @@ -819,6 +866,9 @@ def _viewing_quest_results (self) -> None: elif self._user_wants_to_go_to_main_menu: self._go_to_main_menu ( ) + elif self._user_wants_to_know_what_skill_can_do: + self._say_what_skill_can_do ( ) + elif self._user_wants_to_hear_last_phrase: self._say_last_phrase ( ) @@ -831,7 +881,6 @@ def _viewing_quest_results (self) -> None: def _sending_report (self) -> None: - # Доработать # FIXME self._BUTTONS.add_buttons ("На главное меню", "Пока!", hide_all = True) if self._user_wants_to_go_to_main_menu: self._go_to_main_menu ( ) @@ -840,7 +889,8 @@ def _sending_report (self) -> None: elif self._user_wants_to_end_session: self._end_the_session ( ) else: - self._OUTPUT_TEXT = get_apology_text ( ) + self._OUTPUT_TEXT = "Отчёт разработчикам отправлен!\nВы на главном меню." + self._BUTTONS.add_buttons_of_main_menu_in_text ( ) def _consulting (self) -> None: @@ -849,8 +899,12 @@ def _consulting (self) -> None: if self._user_wants_to_go_to_main_menu: self._go_to_main_menu ( ) + elif self._user_wants_to_know_what_skill_can_do: + self._say_what_skill_can_do ( ) + elif self._user_wants_to_hear_last_phrase: self._say_last_phrase ( ) + elif self._user_wants_to_end_session: self._end_the_session ( ) else: @@ -885,6 +939,7 @@ def _end_the_session (self) -> None: self._CARD = make_big_farewell_picture (farewell_text) self._OUTPUT_TEXT = farewell_text # Без этого выдаёт ошибку, что self._OUTPUT_TEXT нет self._TEXT_TO_SPEECH = farewell_text + self._TEXT_TO_SPEECH += get_random_farewell_sound ( ) self._IS_END_SESSION = True diff --git a/quests.json b/quests.json index 506eb99..c76c755 100644 --- a/quests.json +++ b/quests.json @@ -130,12 +130,12 @@ "9": { "quest_text": "Как создать пустой словарь в Python?", "answers": [ - "dict()", + "()", "{}", "[]" ], "answers_to_speech": [ - "дикт", + "круглые скобки", "фигурные кобки", "квадратные скобки" ], diff --git a/texts_for_users.json b/texts_for_users.json index 89f2020..b759b69 100644 --- a/texts_for_users.json +++ b/texts_for_users.json @@ -1,5 +1,5 @@ { - "for_new_user": "Приветствую вас в навыке \"Учим Python\"! Здесь вы сможете глубже погрузиться в удивительный мир программирования на языке Python. Чтобы продолжить изучение курса, скажите \"курс\". Хотите проверить свои знания? Просто скажите: \"квест\" или \"задачки\". Если вы потеряны, просто скажите \"помощь\".", + "for_new_user": "Приветствую вас в навыке \"Учим Python\"! Здесь вы сможете глубже погрузиться в удивительный мир программирования на языке Python. Навык создан для всех желающих познать программирование с нуля. От мала до велика. У нас много разделов: \"Курс\" - для желающих познать всё с азов, \"Квест\" - для тех, кто хочет быстро проверить свои знания, \"Задачки\" - для гуру-олимпиадников и тех, кто только собирается таковым стать. Кроме того, у нас имеется функция \"Консультанта\", который готов помочь вам в решении ошибок в коде.", "hello_text": [ "Привет!", "Приветик!", @@ -12,14 +12,11 @@ ], "introduction_to_course": "Что ж, вы решили начать изучение языка Python.\nПройдя этот курс вы познакомитесь с основами программирования, научитесь писать простые программы и понимать код!\nЗдесь и дальше просто скажите: \"Далее\".\nЕсли хотите попасть на главное меню скажите: \"На главное меню\".", "if_user_has_forgotten_commands": [ - "Надеюсь, вы не забыли мои основные команды. Давайте, я напомню их вам:", - "Надеюсь, вы помните как продолжить курс? Давайте я напомню мои команды:", - "Помните как общаться со мной? Давайте напомню вам мои команды:", - "Не забыли мои команды? Вот они:", - "Не забыли мои команды? Давайте, я вам напомню:", - "Вы же помните мои команды? Давайте, я вам их продиктую:", - "Вот мои команды, если вы их забыли:", - "Вот мои основные команды:" + "Как ваше настроение? Готовы учиться? Просто скажите одну из моиз команд.", + "Как вы? Хотите учиться Python? Просто скажите одну из моиз команд.", + "Как насчёт узнать что-нибудь новое? Просто скажите одну из моих команд.", + "Как насчёт выучить всё-таки Python? Скажите любую мою команду.", + "Почему бы не выучить Python прямо сейчас? Скажите любую мою команду." ], "main_commands_of_skill": [ "Курс", @@ -105,7 +102,12 @@ "win_sounds": [ "", "", - "" + "", + "", + "", + "", + "", + "" ], "lose_sounds": [ "", @@ -120,18 +122,30 @@ "sound_of_looking_results": [ "" ], + "farewell_sounds": [ + "", + "", + "", + "", + "" + ], "win_pictures": [ "1540737/634a305ed56f6f7ede01", "213044/9c1470ed03227033b661", "937455/004bdc782fbcccd77531", - "1521359/1683ddf9049cd203906f", - "937455/ab221dde314bcd195fbc" + "997614/1e6d664287e83afa03f5", + "937455/ab221dde314bcd195fbc", + "1030494/94a1abd2d495abd8a5eb", + "1030494/2cfb128332b743887193" ], "looking_results_pictures": [ "1540737/a6bf94f7ebc94229d96b", "1652229/ff10d6281e46e9b5becf", "965417/b11257b12517bf440d31", - "997614/e720f4e3e6e5bf590e3a" + "997614/e720f4e3e6e5bf590e3a", + "1540737/e659da2f5522ed7075e3", + "213044/df61b01ad55bb8361e58", + "965417/be6bb1930cc55456d9ed" ], "level_up_pictures": [ "213044/0bfd3d679fbd6602077b", diff --git a/useful_functions.py b/useful_functions.py index 4e8c21f..48839c6 100644 --- a/useful_functions.py +++ b/useful_functions.py @@ -50,6 +50,9 @@ def get_user_greeting ( ) -> str: def get_text_that_says_user_is_just_in_main_menu ( ) -> str: return "Вы на главном меню!" +def get_text_that_says_what_skill_can_do ( ) -> str: + return "Давайте расскажу, Я - ваш личный эксперт в области Python. Хотите отдохнуть и послушать курс? или потренироваться на практике в задачах и квесте? А может получить оценку своих знаний теории? Я всегда готова вам помочь! Может вы хотите получить консультацию от моего гениального интеллекта либо узнать как пофиксить ошибку? Тут я тоже могу подсказать. Так чем бы вы хотели заняться?" + def create_buttons (*button_texts: str) -> list[dict]: ready_buttons = [ ] From d656d792a932cd93f7e1f7ae5a0411eeaf0a76b2 Mon Sep 17 00:00:00 2001 From: TchTech <67865526+TchTech@users.noreply.github.com> Date: Wed, 29 Mar 2023 13:16:41 +0300 Subject: [PATCH 25/31] Update consultant.py --- consultant.py | 59 ++++++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 56 insertions(+), 3 deletions(-) diff --git a/consultant.py b/consultant.py index 797e1a7..b4a4c56 100644 --- a/consultant.py +++ b/consultant.py @@ -1,8 +1,8 @@ from sklearn.feature_extraction.text import TfidfVectorizer from sklearn.metrics.pairwise import cosine_similarity import json -import pymorphy2 -morph = pymorphy2.MorphAnalyzer() +import pymorphy3 +morph = pymorphy3.MorphAnalyzer() def index_of_max(lst): maxi = 0 @@ -36,4 +36,57 @@ def lemmatize(self, text): # q = input() # a = ArtificialIntelligence("lessons.json") -# print("Найдено:", a.get_similarity(q)) \ No newline at end of file +# print("Найдено:", a.get_similarity(q)) +def code_to_speech(code: str) -> str: + """Переводит код в слова и выводит готовый текст в пронумерованном столбце.""" + REPLACEMENTS: dict = _get_replacements ( ) + + PAUSE = "sil <[250]>" + lines = code.split("\n") + formatted_lines = [ ] + for i, line in enumerate(lines, start=1): + formatted_line = line + for key in REPLACEMENTS.keys(): + formatted_line = formatted_line.replace(key, REPLACEMENTS[key]) + formatted_lines.append(f"{PAUSE} строка {i} {PAUSE} {formatted_line}") + return "\n".join(formatted_lines) + PAUSE + +def _get_replacements ( ) -> dict: + """Возвращает словарь с заменами символов на слова.""" + return { + ")": " скобка закрывается ", + "(": " скобка открывается ", + "*": " звёздочка ", + "'": " кавычки ", + '"': " кавычки ", + "{": " фигурная скобка открывается ", + "}": " фигурная скобка закрывается ", + ":": " двоеточие ", + "!": " восклицательный знак ", + ".": " точка ", + ",": " запятая ", + "[": " квадратная скобка открывается ", + "]": " квадратная скобка закрывается ", + "||": " две вертикальные линии (операция или) ", + ">": " больше ", + "<": " меньше ", + "/": " разделить ", + "-": " минус ", + "+": " плюс ", + "%": " процент ", + "@": " собачка ", + "&": " амперсанд " + } +def output_format(text): + a = text.split(" ** ") + a[1] = str(a[1]).upper() + text = " ".join(a) + c = text.split("`") + text = " ".join(c) + return c +def tts_format(text): + c = text.split("`") + i = 2 + while i Date: Thu, 30 Mar 2023 22:59:21 +0300 Subject: [PATCH 26/31] upd --- consultant.py | 53 ------------------------------------------- lesson_getter.py | 6 ++++- lessons.json | 20 +++++++++++++++-- main4.py | 58 +++++++++++++++++++++++++++++++++++++++++++++--- 4 files changed, 78 insertions(+), 59 deletions(-) diff --git a/consultant.py b/consultant.py index b4a4c56..93e5ea9 100644 --- a/consultant.py +++ b/consultant.py @@ -37,56 +37,3 @@ def lemmatize(self, text): # q = input() # a = ArtificialIntelligence("lessons.json") # print("Найдено:", a.get_similarity(q)) -def code_to_speech(code: str) -> str: - """Переводит код в слова и выводит готовый текст в пронумерованном столбце.""" - REPLACEMENTS: dict = _get_replacements ( ) - - PAUSE = "sil <[250]>" - lines = code.split("\n") - formatted_lines = [ ] - for i, line in enumerate(lines, start=1): - formatted_line = line - for key in REPLACEMENTS.keys(): - formatted_line = formatted_line.replace(key, REPLACEMENTS[key]) - formatted_lines.append(f"{PAUSE} строка {i} {PAUSE} {formatted_line}") - return "\n".join(formatted_lines) + PAUSE - -def _get_replacements ( ) -> dict: - """Возвращает словарь с заменами символов на слова.""" - return { - ")": " скобка закрывается ", - "(": " скобка открывается ", - "*": " звёздочка ", - "'": " кавычки ", - '"': " кавычки ", - "{": " фигурная скобка открывается ", - "}": " фигурная скобка закрывается ", - ":": " двоеточие ", - "!": " восклицательный знак ", - ".": " точка ", - ",": " запятая ", - "[": " квадратная скобка открывается ", - "]": " квадратная скобка закрывается ", - "||": " две вертикальные линии (операция или) ", - ">": " больше ", - "<": " меньше ", - "/": " разделить ", - "-": " минус ", - "+": " плюс ", - "%": " процент ", - "@": " собачка ", - "&": " амперсанд " - } -def output_format(text): - a = text.split(" ** ") - a[1] = str(a[1]).upper() - text = " ".join(a) - c = text.split("`") - text = " ".join(c) - return c -def tts_format(text): - c = text.split("`") - i = 2 - while i str: def get_subtheme_text (self, theme: str, subtheme: str) -> str: """Получить подтему указанной темы.""" - return self.all_lessons[theme][subtheme] + return subtheme + ": " + self.all_lessons[theme][subtheme] def get_name_of_next_theme (self, current_theme: str) -> str: """Получить имя следующей темы.""" diff --git a/lessons.json b/lessons.json index 509de87..caa40a7 100644 --- a/lessons.json +++ b/lessons.json @@ -152,9 +152,25 @@ "Пример": "`>>> i = []`\n`>>> i.append('item')`\n`>>> repr(i)`\n`\"['item']\"`\n`>>> eval(repr(i))`\n`['item']`\n`>>> eval(repr(i)) == i`\n`True`\n\nПо большому счёту, функция repr служит для получения печатаемого представления объекта. Определив метод repr в собственном классе, можно указать, что он будет возвращать по вызову функции repr.", "Установка библиотек": "В Каталоге пакетов Python существует колоссальное количество открытых библиотек, которые вы можете использовать в своих программах. Для их установки можно воспользоваться pip.", "Графические программы": "Для создания собственной графической программы на Python понадобится какая-нибудь библиотека ГИП (графического интерфейса пользователя) со своими привязками к Python. Привязки позволяют писать программу на Python, используя библиотеки, которые сами по себе написаны на C, C++ или других языках.", - "Kivy": "https://kivy.org", "PyGTK": "Это привязки Python к инструментарию GTK+, на основе которого построен GNOME. У GTK+ есть много своих особенностей, но как только вы освоитесь, вы сможете создавать ГИП очень быстро. Что касается дизайнера графического интерфейса Glade, то он просто незаменим. Документация же всё ещё требует некоторых улучшений. GTK+ хорошо работает в GNU/Linux, но его порт на Windows пока не закончен. При помощи GTK+ можно создавать как свободные, так и проприетарные программы. Для начала прочитайте Учебник по PyGTK.", "PyQt": "Это привязки Python к инструментарию Qt, на основе которого построена KDE. Qt чрезвычайно прост в использовании, особенно благодаря Qt Designer и изумительной документации Qt. PyQt бесплатно, если используется для создания свободных программ (с лицензией GPL). Для создания закрытых проприетарных программ вам придётся его купить. Начиная с Qt 4.5, разрешается создавать при помощи него не только GPL’ные программы.", - "wxPython": "Это привязки Python к инструментарию wxWidgets. wxPython не так прост в освоении, но зато он переносим и работает на GNU/Linux, Windows, Mac и даже на встраиваемых платформах. Многие среды разработки для wxPython, такие как SPE (Stani’s Python Editor) и wxGlade включают дизайнеры графического интерфейса. При помощи wxPython можно создавать как свободные, так и проприетарные программы." + "wxPython": "Это привязки Python к инструментарию wxWidgets. wxPython не так прост в освоении, но зато он переносим и работает на GNU/Linux, Windows, Mac и даже на встраиваемых платформах. Многие среды разработки для wxPython, такие как SPE (Stani’s Python Editor) и wxGlade включают дизайнеры графического интерфейса. При помощи wxPython можно создавать как свободные, так и проприетарные программы.", + "Ошибка ключа (KeyError)": "Ошибка KeyError возникает, когда мы пытаемся получить или удалить значение ключа из словаря, и этот ключ не существует в словаре. \nРешение ошибки: проверьте наличие ключа (используйте метод keys(), чтобы получить список всех ключей в словаре)", + "Переполнение (OverflowError)": "Ошибка переполнение вызывается, когда результат операции выходил за пределы диапазона. Она характерна для целых чисел вне диапазона. \nРешение ошибки: использовать специальные библиотеки для вычисления больших чисел или уменьшить сами вычисления.", + "Ошибка утверждения (AssertionError)": "Когда инструкция утверждения не верна, вызывается ошибка утверждения. \nРешение ошибки: найти место в коде, где возникает эта ошибка, и проверить, почему условие в утверждении не выполняется. Для этого можно использовать отладочные инструменты.", + "Ошибка индекса (IndexError)": "Если пытаться получить доступ к индексу (последовательности) списка, которого не существует в этом списке или находится вне его диапазона, будет вызвана ошибка индекса (IndexError: list index out of range python). \nРешение ошибки: проверьте, что вы используете правильный индекс. Если индекс отрицательный, он должен быть в диапазоне от -1 до -len(list), где len(list) - это длина списка. Если индекс положительный, он должен быть в диапазоне от 0 до len(list) - 1.", + "Ошибка имени (NameError)": "Ошибка имени возникает, когда локальное или глобальное имя не находится. \nРешение ошибки: перепроверьте, существует ли вызываемая переменная в вашем коде, может быть вы не дописали название переменной при её вызове.", + "Ошибка деления на ноль (ZeroDivisionError)": "Возникает когда пользователь пытается поделить число на 0, а по правилам математики это делать нельзя. \nРешение ошибки: делите ноль на число, а не число на ноль.", + "Синтаксические ошибки (SyntaxError)": "Синтаксические ошибки часто называют ошибками разбора. Они возникают, когда интерпретатор обнаруживает синтаксическую проблему в коде. \nРешение ошибки: проверьте, не идут ли у вас две команды на одной строке друг за другом, не пропущена ли команда на месте ошибки.", + "Ошибка поиска (LookupError)": "LockupError появляется когда key или index используются для связывания или последовательность списка/словаря неверна или не существует. \nРешение ошибки: проверьте, что вы используете правильный ключ или индекс.", + "Ошибка значения (ValueError)": "Ошибка значения вызывается, когда встроенная операция или функция получают аргумент с корректным типом, но недопустимым значением. \nРешение ошибки: убедитесь, что вы передаете правильный тип данных.", + "Ошибка рекурсии (RecursionError)": "Ошибка рекурсии возникает, когда функция вызывает саму себя слишком много раз, превышая максимальную глубину рекурсии, которая определяется размером стека. \nРешение ошибки: проверьте, что ваша функция корректно реализована и не вызывает саму себя в бесконечном цикле. Такая ошибка может возникать, если в вашей функции отсутствует условие выхода из рекурсии.", + "Ошибка отступа (IndentationError)": "Эта ошибка похожа по духу на синтаксическую и является ее подвидом. Тем не менее она возникает только в случае проблем с отступами. \nРешение ошибки: проверьте правильно ли вы сделали отступы.", + "Ошибка памяти (MemoryError) Недостаточно памяти (OutofMemoryError)": "Ошибки памяти в Python могут возникать по нескольким причинам, связанным с использованием оперативной памяти компьютера. В частности, они могут быть вызваны использованием 32-битной архитектуры Python, загрузкой больших файлов, запуском моделей машинного/глубокого обучения и другими факторами. \nРешение ошибки: для обработки ошибок памяти в Python можно использовать обработку исключений, но следует учитывать, что это резервное исключение, которое вызывается, когда у интерпретатора заканчивается память и он должен немедленно остановить текущее исполнение. В редких случаях Python вызывает OutofMemoryError, позволяя скрипту перехватить самого себя, остановить ошибку памяти и восстановиться, но такой подход не является хорошей практикой.", + "Ошибка прерывания с клавиатуры (KeyboardInterrupt)": "Ошибка прерывания с клавиатуры возникает, когда пользователь прерывает выполнение программы с помощью комбинации клавиш Ctrl + C или Ctrl + Z. \nРешение ошибки: попробуйте использовать блок try-except для обработки этой ошибки. Таким образом, вы сможете корректно завершить выполнение программы, если пользователь прервал ее выполнение.", + "Ошибка типа (TypeError)": "Ошибка типа вызывается при попытке объединить два несовместимых операнда или объекта. \nРешение ошибки: вы можете использовать обработку исключений try-except, чтобы избежать ее возникновения.", + "Ошибка импорта (ModuleNotFoundError)": "Ошибка импорта вызывается при попытке импортировать несуществующий (или неспособный загрузиться) модуль в стандартном пути или даже при допущенной ошибке в имени. \nРешение ошибки: проверьте, что вы находитесь в правильном каталоге. Если модуль находится в другом каталоге, вы можете изменить путь поиска модулей, чтобы Python мог его найти.", + "Ошибка атрибута (AttributeError)": "Ошибка атрибута (AttributeError) возникает, когда вы пытаетесь получить доступ к атрибуту объекта, который не существует.Решение ошибки: проверьте, что вы используете правильное имя атрибута. Если вы используете неправильное имя атрибута, Python не сможет его найти.", + "Ошибка выполнения (NotImplementedError)": "Ошибка выполнения служит базовым классом для ошибки NotImplemented. Абстрактные методы определенного пользователем класса вызывают это исключение, когда производные методы перезаписывают оригинальный.Решение ошибки: убедитесь, что вы определили реализацию всех абстрактных методов в производных классах." } } \ No newline at end of file diff --git a/main4.py b/main4.py index d46aa72..0ddd797 100644 --- a/main4.py +++ b/main4.py @@ -10,6 +10,56 @@ from consultant import ArtificialIntelligence from typing import Literal +def code_to_speech(code: str) -> str: + """Переводит код в слова и выводит готовый текст в пронумерованном столбце.""" + REPLACEMENTS: dict = _get_replacements ( ) + + PAUSE = "sil<[250]>" + lines = code.split("\n") + formatted_lines = [ ] + for i, line in enumerate(lines, start=1): + formatted_line = line + for key in REPLACEMENTS.keys(): + formatted_line = formatted_line.replace(key, REPLACEMENTS[key]) + formatted_line = formatted_line.split("#")[0] + formatted_lines.append(f"{PAUSE} код {PAUSE} {formatted_line}") + return "\n".join(formatted_lines) + PAUSE + +def _get_replacements ( ) -> dict: + """Возвращает словарь с заменами символов на слова.""" + return { + ")": " скобка ", + "(": " скобка ", + "*": " звёздочка ", + "'": " кавычки ", + '"': " кавычки ", + "{": " фигурная скобка ", + "}": " фигурная скобка ", + ":": " двоеточие ", + "!": " восклицательный знак ", + ".": " точка ", + ",": " запятая ", + "[": " квадратная скобка ", + "]": " квадратная скобка ", + "||": " or ", + ">": " больше ", + "<": " меньше ", + "/": " разделить ", + "-": " минус ", + "+": " плюс ", + "%": " процент ", + "@": " собачка ", + "&": " and " + } + + +def tts_format(text): + c = text.split("`") + i = 1 + while i None: next_subtheme = None if next_subtheme: - self._INTERSESSIONAL_DATA["current_sublesson"] = next_subtheme - self._OUTPUT_TEXT = lesson_getter.get_subtheme_text (theme = current_lesson_theme, + text = lesson_getter.get_subtheme_text (theme = current_lesson_theme, subtheme = next_subtheme) + self._INTERSESSIONAL_DATA["current_sublesson"] = next_subtheme + self._OUTPUT_TEXT = text self._BUTTONS.add_buttons ("Продолжить", "Переслушать", "Список тем", "На главное меню", "Пока", hide_all = True) + self._TEXT_TO_SPEECH = tts_format(text) elif not next_subtheme and current_lesson_subtheme: self._TEXT_TO_SPEECH = get_random_sound_of_looking_results ( ) self._CARD = make_big_level_up_picture (title = "Поздравляю! Вы прошли целый урок.", description = "Следующий - это " + lesson_getter.get_name_of_next_theme (current_lesson_theme) + ".\n" + "Хотите продолжить?") @@ -843,7 +895,7 @@ def _consulting (self) -> None: ai = ArtificialIntelligence("lessons.json") self._BUTTONS.add_buttons ("На главное меню", "Пока!", hide_all = True) a = ["Хм...", "Ага...", "Итак,", "Хорошо,", "Смотрите,"] - self._OUTPUT_TEXT = random.choice(a)+" я нашла что-то, что может вам помочь, послушайте: " + ai.get_similarity(" ".join(self._WORDS_OF_TEXT_IN_LOWER) + "\nКуда теперь?") + self._OUTPUT_TEXT = random.choice(a)+" я нашла что-то, что может вам помочь, послушайте: " + ai.get_similarity(" ".join(self._WORDS_OF_TEXT_IN_LOWER)) + "\nКуда теперь?" self._SESSIONAL_DATA['state'] = "in_main_menu" From 433ff1d27302951d403aabe7156b50205d345ee7 Mon Sep 17 00:00:00 2001 From: Alexonys1 <107358560+Alexonys1@users.noreply.github.com> Date: Tue, 4 Apr 2023 15:45:50 +0300 Subject: [PATCH 27/31] =?UTF-8?q?=D0=9F=D0=BE=D0=BB=D0=BD=D0=BE=D1=81?= =?UTF-8?q?=D1=82=D1=8C=D1=8E=20=D1=80=D0=B0=D0=B1=D0=BE=D1=87=D0=B8=D0=B9?= =?UTF-8?q?=20=D0=BD=D0=B0=D0=B2=D1=8B=D0=BA=20=D0=B4=D0=BB=D1=8F=20=D0=90?= =?UTF-8?q?=D0=BB=D0=B8=D1=81=D1=8B.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Абсолютно всё работает, но модерация сказала, что можно дополнить навык. --- json_manager.py | 20 +- lesson_getter.py | 161 +++++++--- lessons.json | 581 +++++++++++++++++++++++++----------- main4.py | 691 +++++++++++++++++++++++++++---------------- texts_for_users.json | 46 ++- useful_functions.py | 14 +- 6 files changed, 1029 insertions(+), 484 deletions(-) diff --git a/json_manager.py b/json_manager.py index 3deda60..73d547b 100644 --- a/json_manager.py +++ b/json_manager.py @@ -106,4 +106,22 @@ def get_random_level_up_picture ( ) -> str: return random.choice (texts_for_users["level_up_pictures"]) def get_random_farewell_picture ( ) -> str: - return random.choice (texts_for_users["farewell_pictures"]) \ No newline at end of file + return random.choice (texts_for_users["farewell_pictures"]) + + +def get_random_lesson_completion ( ) -> str: + return random.choice (texts_for_users["user_has_completed_lesson"]) + +def get_random_sequel_of_lesson ( ) -> str: + return random.choice (texts_for_users["ask_user_if_he_wants_to_take_next_lesson"]) + +def get_random_course_completion ( ) -> str: + return random.choice (texts_for_users["user_has_completed_course"]) + + +def get_resume_text ( ) -> str: + return random.choice (texts_for_users["resume"]) + + +def get_soothing_text ( ) -> str: + return random.choice (texts_for_users["soothing_text"]) \ No newline at end of file diff --git a/lesson_getter.py b/lesson_getter.py index 75a5273..811806d 100644 --- a/lesson_getter.py +++ b/lesson_getter.py @@ -1,52 +1,117 @@ import json -# def output_format(text): -# c = text.split("`") -# text = " ".join(c) -# return text class LessonGetter: - """Класс для работы с уроками, курсом в целом.""" - def __init__ (self): - self._load_all_lessons_from_file ( ) - self.themes = [lesson_theme for lesson_theme in self.all_lessons.keys()] - - def _load_all_lessons_from_file (self) -> None: - with open (self._name_of_file_with_lessons, "r") as file_with_lessons: - self.all_lessons: dict = json.load (file_with_lessons) - - @property - def _name_of_file_with_lessons (self) -> str: - return "lessons.json" - - - def get_subtheme_names (self, theme: str) -> list[str]: - """Получить имена подтем указанной темы.""" - return [lesson_subtheme for lesson_subtheme in self.all_lessons[theme].keys()] - - def get_first_subtheme_name (self, theme: str) -> str: - """Получить имя первой подтемы указанной темы.""" - return self.get_subtheme_names (theme = theme)[0] - - def get_subtheme_text (self, theme: str, subtheme: str) -> str: - """Получить подтему указанной темы.""" - return subtheme + ": " + self.all_lessons[theme][subtheme] - - def get_name_of_next_theme (self, current_theme: str) -> str: - """Получить имя следующей темы.""" - index_of_current_theme = self.themes.index (current_theme) - index_of_next_theme = index_of_current_theme + 1 - try: - return self.themes[index_of_next_theme] - except IndexError: - return "" # Значит, эта тема последняя - - def get_name_of_next_subtheme (self, theme: str, subtheme: str) -> str: - """Получить имя следующей подтемы.""" - subthemes = self.get_subtheme_names (theme) - index_current_subtheme = subthemes.index (subtheme) - index_of_next_subtheme = index_current_subtheme + 1 - try: - return subthemes[index_of_next_subtheme] - except IndexError: - return "" # Значит, эта подтема последняя \ No newline at end of file + """Класс для работы с уроками Курса. + В конструкторе принимает тему урока и тему его подурока. + """ + def __init__ (self, lesson_theme: str, sublesson_theme: str): + self.current_lesson_theme = lesson_theme + self.current_sublesson_theme = sublesson_theme + self._check_current_lesson_theme_and_current_sublesson_theme_in_init ( ) + self._read_file_with_lessons ( ) + self._set_initial_lesson_values_if_necessary ( ) + self._check_sublesson_is_in_lesson ( ) + + def _read_file_with_lessons (self) -> None: + with open (self._name_of_file_with_lessons, "r", encoding = "utf8") as file_with_lessons: + self.all_lessons: dict = json.load (file_with_lessons) + self.lesson_themes = tuple (self.all_lessons.keys()) + self._find_sublesson_themes ( ) + + @property + def _name_of_file_with_lessons (self) -> str: + return "lessons.json" + + def _find_sublesson_themes (self) -> None: + self.all_sublesson_themes = { } + for lesson_theme in self.lesson_themes: + self.all_sublesson_themes[lesson_theme] = tuple (self.all_lessons[lesson_theme].keys()) + + def _check_current_lesson_theme_and_current_sublesson_theme_in_init (self) -> None: + if not self.current_lesson_theme and self.current_sublesson_theme: + raise ValueError (f"Не указано имя урока в конструкторе класса {__class__.__name__}!") + elif self.current_lesson_theme and not self.current_sublesson_theme: + raise ValueError (f"Не указано имя подурока в конструкторе класса {__class__.__name__}!") + + def _set_initial_lesson_values_if_necessary (self) -> None: + # Если не указаны тема урока и тема его подурока, то + if not self.current_lesson_theme and not self.current_sublesson_theme: + # Поставить тему первого урока и тему первого его подурока + self.current_lesson_theme = self.lesson_themes[0] + self.current_sublesson_theme = self._get_first_sublesson_theme ( ) + + def _get_first_sublesson_theme (self) -> str: + return self.all_sublesson_themes[self.current_lesson_theme][0] + + def _check_sublesson_is_in_lesson (self) -> None: + if not self.current_sublesson_theme in self.all_sublesson_themes[self.current_lesson_theme]: + raise ValueError ("Нет такого подурока в текущем уроке: " + + f"\"{self.current_sublesson_theme}\" не принадлежит \"{self.current_lesson_theme}\"!") + + + @property + def text_of_current_sublesson (self) -> str: + """Текст текущего подурока.""" + return self.all_lessons[self.current_lesson_theme][self.current_sublesson_theme]["text"] + + @property + def use_function_to_read_code (self) -> bool: + """Нужно ли использовать функцию для чтения кода.""" + return self.all_lessons[self.current_lesson_theme][self.current_sublesson_theme]["use_function_to_read_code"] + + + def move_to_next_sublesson (self) -> None: + """Перейти к следующему подуроку. + Если его нет, то current_sublesson_theme будет равен None. + В случае чего будет возвращена ошибка ValueError с пояснением проблемы. + """ + sublesson_themes_of_current_lesson = tuple (self.all_sublesson_themes[self.current_lesson_theme]) + self._check_current_sublesson_theme ( ) + index_of_current_sublesson_theme = sublesson_themes_of_current_lesson.index (self.current_sublesson_theme) + # Если тема текущего подурока не последняя, то + if self.current_sublesson_theme != sublesson_themes_of_current_lesson[-1]: + self.current_sublesson_theme = sublesson_themes_of_current_lesson[index_of_current_sublesson_theme + 1] + else: + self.current_sublesson_theme = None # Значит, следующей темы подурока нет + + def move_to_next_lesson (self) -> None: + """Перейти к следующему уроку. + Если его нет, то current_lesson_theme и current_sublesson_theme будут равны None. + В случае чего будет возвращена ошибка ValueError с пояснением проблемы. + """ + self._check_current_lesson_theme ( ) + index_of_current_lesson_theme = self.lesson_themes.index(self.current_lesson_theme) + # Если тема текущего урока не последняя, то + if self.current_lesson_theme != self.lesson_themes[-1]: + self.current_lesson_theme = self.lesson_themes[index_of_current_lesson_theme + 1] + self.current_sublesson_theme = self._get_first_sublesson_theme ( ) + else: + self.current_lesson_theme = "" # Значит, все уроки пройдены + self.current_sublesson_theme = "" + + def move_to_lesson (self, lesson_theme: str) -> None: + """Перейти к указанному уроку, если он есть. + Иначе выдать ошибку ValueError.""" + if lesson_theme in self.lesson_themes: self.current_lesson_theme = lesson_theme + else: raise ValueError ("Нельзя перейти к несуществующему уроку!") + self.current_sublesson_theme = self._get_first_sublesson_theme ( ) + + + def _check_current_sublesson_theme (self) -> None: + if self.current_sublesson_theme is None: + raise ValueError ("Это последний подурок! Перейти к следующему нельзя!") + + def _check_current_lesson_theme (self) -> None: + if self.current_lesson_theme is None: + raise ValueError ("Это последний урок! Перейти к следующему нельзя!") + + + +if __name__ == '__main__': + lesson_getter = LessonGetter ("", "") # Так должно быть в первый раз + print ("Все уроки с подуроками:") + print (lesson_getter.all_sublesson_themes) + print ( ) + print ("Текущий урок:", lesson_getter.current_lesson_theme) + print ("Текущий подурок:", lesson_getter.current_sublesson_theme) \ No newline at end of file diff --git a/lessons.json b/lessons.json index caa40a7..ea2b5aa 100644 --- a/lessons.json +++ b/lessons.json @@ -1,176 +1,411 @@ { - "Урок 1: Введение в Python": { - "Предисловие": "Python – простой и минималистичный язык. Чтение хорошей программы на Python очень напоминает чтение английского текста, хотя и достаточно строгого! Такая псевдо-кодовая природа Python является одной из его самых сильных сторон. Она позволяет вам сосредоточиться на решении задачи, а не на самом языке.", - "Python - Язык высокого уровня": "При написании программы на Python вам никогда не придётся отвлекаться на такие низкоуровневые детали, как управление памятью, используемой вашей программой, и т.п.", - "Python - Язык объектно-ориентированный": "Python поддерживает как процедурно-ориентированное, так и объектноориентированное программирование. В процедурно-ориентированных языках программы строятся на основе процедур или функций, которые представляют собой просто-напросто многократно используемые фрагменты программы. В объектно-ориентированных языках программирования программы строятся на основе объектов, объединяющих в себе данные и функционал. \n\nPython предоставляет простые, но мощные средства для ООП, особенно в сравнении с такими большими языками программирования, как C++ или Java." , - "Python - Язык встраиваемый": "В Python можно встраивать в программы на C/C++, чтобы предоставлять возможности написания сценариев их пользователям." - }, - "Урок 2: Установка Python": { - "Предисловие": "Итак для того чтобы нам начать писать код нужно установть сам Python, а так же редактор для него ", - "Установка в Windows": "Посетите страницу http://www.python.org/download/ и загрузите последнюю версию. Установка производится так же, как и для любых других программ для Windows.", - "Выбор редактора": "Поскольку мы не можем набирать программу в командной т.к, нам понадобится сохранять программы в файлах. \n\nИтак нам нужен редактор для работы с файлами программ. Выбор редактора крайне важен. Хороший редактор поможет вам легко писать программы на Python, делая ваше путешествие более комфортным, а также позволяя быстрее и безопаснее достичь вашей цели. \n\nОдно из самых основных требований – это подсветка синтаксиса, когда разные элементы программы на Python раскрашены так, чтобы вы могли легко видеть вашу программу и ход её выполнения. \n\nЕсли вы не знаете, с чего начать, мы бы порекомендовали вам пользоваться программой PyCharm", - "Создание проекта": "Запустите выбранный вами редактор, введите следующую программу и сохраните её под именем helloworld.py . \n\nЕсли вы пользуетесь PyCharm, нажмите «New Project» → «выберете путь где будут хранится ваши программы» → «создавайте проект!»" - }, - "Урок 3: Основы": { - "Предисловие": "Python – это, один из немногих языков программирования, простых в освоении и одновременно мощных. \n\nЭто очень важно и для начинающих, и для специалистов, но что ещё важнее – на нём приятно программировать.", - "Комментарии": "Комментарии – это то, что пишется после символа #, и представляет интерес лишь как заметка для читающего программу. \n\nНапример: \nprint(Привет, Мир!) # print -- это функция", - "Строка": "Строка – это последовательность символов. Чаще всего строки – это просто некоторые наборы слов. \n\nСлова могут быть как на английском языке, так и на любом другом, поддерживаемом стандартом Unicode, что означает почти на любом языке мира.", - "Одинарные кавычки": "Строку можно указать, используя одинарные кавычки, как например, 'Фраза в кавычках'. Все пробелы и знаки табуляции сохранятся, как есть.", - "Двойные кавычки": "Строки в двойных кавычках работают точно так же, как и в одинарных. Например,\"Как тебя зовут?\".", - "Типы данных": "Переменные могут хранить значения разных типов, называемых типами данных. Основными типами являются числа и строки, о которых мы уже говорили. В дальнейших главах мы увидим, как создавать свои собственные типы при помощи классов.", - "Переменные": "Использование одних лишь литеральных констант может скоро наскучить – нам ведь нужен способ хранения любой информации и манипулирования ею. Вот здесь на сцену выходят переменные. Слово «переменные» говорит само за себя – их значение может меняться, а значит, вы можете хранить в переменной всё, что угодно. \n\nПеременные – это просто области памяти компьютера, в которых вы храните некоторую информацию. В отличие от констант, к такой информации нужно каким-то образом получать доступ, поэтому переменным даются имена." + "Урок 1: Введение в Python": { + "Предисловие": { + "text": "Python – простой и минималистичный язык. Чтение хорошей программы на Python очень напоминает чтение английского текста, хотя и достаточно строгого! Такая псевдо-кодовая природа Python является одной из его самых сильных сторон. Она позволяет вам сосредоточиться на решении задачи, а не на самом языке.", + "use_function_to_read_code": false + }, + "Python - Язык высокого уровня": { + "text": "При написании программы на Python вам никогда не придётся отвлекаться на такие низкоуровневые детали, как управление памятью, используемой вашей программой, и т.п.", + "use_function_to_read_code": false + }, + "Python - Язык объектно-ориентированный": { + "text": "Python поддерживает как процедурно-ориентированное, так и объектноориентированное программирование. В процедурно-ориентированных языках программы строятся на основе процедур или функций, которые представляют собой просто-напросто многократно используемые фрагменты программы. В объектно-ориентированных языках программирования программы строятся на основе объектов, объединяющих в себе данные и функционал. \n\nPython предоставляет простые, но мощные средства для ООП, особенно в сравнении с такими большими языками программирования, как C++ или Java.", + "use_function_to_read_code": false + }, + "Python - Язык встраиваемый": { + "text": "В Python можно встраивать в программы на C/C++, чтобы предоставлять возможности написания сценариев их пользователям.", + "use_function_to_read_code": false + } + }, - }, - "Урок 4: Операторы и выражения": { - "Предисловие": "Большинство предложений (логических строк) в программах содержат выражения. Простой пример выражения: 2 + 3. Выражение можно разделить на операторы и операнды. Операторы – это некий функционал, производящий какие-либо действия, который может быть представлен в виде символов, как например +, или специальных зарезервированных слов. Операторы могут производить некоторые действия над данными, и эти данные называются операндами. В нашем случае 2 и 3 – это операнды.", - "Оператор сложение": "Объяснение: суммирует два объекта. \n\nПример: 3 + 5 даст 8; 'a' + 'b' даст 'ab'", - "Оператор вычитание": "Объяснение: Даёт разность двух чисел; если первый операнд отсутствует, он считается равным нулю. \n\nПример: -5.2 даст отрицательное число, а 50 - 24 даст 26.", - "Оператор умножение": "Объяснение: Даёт произведение двух чисел или возвращает строку, повторённую заданное число раз. \n\nПример: 2 * 3 даст 6. 'la' * 3 даст 'lalala'", - "Оператор деление": "Объяснение: Возвращает частное от деления x на y. \n\nПример: 4 / 2 даст 2", - "Оператор меньше": "Объяснение: Определяет, верно ли, что x меньше y. Все операторы сравнения возвращают True или False. Обратите внимание на заглавные буквы в этих словах. \n\nПример: 5 < 3 даст False", - "Оператор больше": "Объяснение: Определяет, верно ли, что x больше y. \n\nПример: 5 > 3 даст True", - "Оператор равно": "Объяснение: Проверяет,одинаковы ли объекты. \n\nПример: x = 2; y = 2; x == y даёт True", - "Оператор не равно": "Объяснение: Проверяет, верно ли, что объекты не равны. \n\nПример: x = 2; y = 3; x != y даёт True", - "Оператор логическое НЕ": "Объяснение: Если x равно True, оператор вернёт False. Если же x равно False, получим True. \n\nПример: x = True; not x даёт False", - "Оператор логическое И": "Объяснение: x and y даёт False, если x равно False , в противном случае возвращает значение y. \n\nПример: x = False; y = True; x and y возвращает False, поскольку x равно False", - "Оператор логическое ИЛИ": "Объяснение: Если x равно True, в результате получим True, в противном случае получим значение y. \n\nПример: x = True; y = False; x or y даёт True" - }, - "Урок 5: Поток команд": { - "Предисловие": "В программах, которые мы до сих пор рассматривали, последовательность команд всегда выполнялась Python по порядку строго сверху вниз. А что, если нам необходимо изменить поток выполняющихся команд? Например, если требуется, чтобы программа принимала некоторое решение и выполняла различные действия в зависимости от ситуации; скажем, печатала «Доброе утро» или «Добрый вечер» в зависимости от времени суток. \n\nКак вы уже, наверное, догадались, этого можно достичь при помощи операторов управления потоком. В Python есть три оператора управления потоком: if, for и while.", - "Оператор if": "Оператор if используется для проверки условий: если условие верно, выполняется блок выражений (называемый «if-блок»), иначе выполняется другой блок выражений (называемый «else-блок»). Блок «else» является необязательным.", - "Пример оператора if": "`number = 23`\n`guess = int(input('Введите целое число : '))`\n\n`if guess == number:`\n `print('Поздравляю, вы угадали,') # Начало нового блока`\n `print('(хотя и не выиграли никакого приза!)')`\n`elif guess < number:`\n `print('Нет, загаданное число немного больше этого.') # Ещё один блок`\n`else:`\n `print('Нет, загаданное число немного меньше этого.')`", - "Оператор while": "Оператор while позволяет многократно выполнять блок команд до тех пор, пока выполняется некоторое условие. Это один из так называемых операторов цикла. Он также может иметь необязательный пункт else.", - "Пример оператора while": "`number = 23`\n`running = True`\n\n`while running:`\n `guess = int(input('Введите целое число : '))`\n\n `if guess == number:`\n `print('Поздравляю, вы угадали.')`\n `running = False`\n `elif guess < number:`\n `print('Нет, загаданное число немного больше этого.')`\n `else:`\n `print('Нет, загаданное число немного меньше этого.')`\n`else:`\n `print('Цикл while закончен.')`", - "Цикл for": "Оператор for..in также является оператором цикла, который осуществляет итерацию по последовательности объектов, т.е. проходит через каждый элемент в последовательности. Мы узнаем больше о последовательностях в дальнейших главах, а пока просто запомните, что последовательность – это упорядоченный набор элементов.", - "Пример цикла for": "`for i in range(1, 5):`\n `print(i)\nelse:`\n `print('Цикл for закончен')`", - "Оператор break": "Оператор break служит для прерывания цикла, т.е. остановки выполнения команд даже если условие выполнения цикла ещё не приняло значения False или последовательность элементов не закончилась.\n\nВажно отметить, что если циклы for или while прервать оператором break, соответствующие им блоки else выполняться не будут.", - "Пример оператора break": "`while True:`\n `s = input('Введите что-нибудь : ')`\n `if s == 'выход'`:\n `break`\n `print('Длина строки:', len(s))`", - "Оператор continue": "Оператор continue используется для указания Python, что необходимо пропустить все оставшиеся команды в текущем блоке цикла и продолжить со следующей итерации цикла", - "Пример оператора continue": "`while True:`\n `s = input('Введите что-нибудь : ')`\n `if s == 'выход':`\n `break`\n `if len(s) < 3:`\n `print('Слишком мало')`\n `continue`\n `print('Введённая строка достаточной длины')`" - }, - "Урок 6: Функции": { - "Предисловие": "Функции – это многократно используемые фрагменты программы. Они позволяют дать имя определённому блоку команд с тем, чтобы впоследствии запускать этот блок по указанному имени в любом месте программы и сколь угодно много раз. Это называется вызовом функции. Мы уже использовали много встроенных функций, как то len и range.\n\nФункции определяются при помощи зарезервированного слова def. После этого слова указывается имя функции, за которым следует пара скобок, в которых можно указать имена некоторых переменных, и заключительное двоеточие в конце строки. Далее следует блок команд, составляющих функцию.", - "Пример применения функций": "`def sayHello():`\n `print('Привет, Мир!')`\n`sayHello() # вызов функции`", - "Как это работают функции": "Мы определили функцию с именем sayHello, используя описанный выше синтаксис. Эта функция не принимает параметров, поэтому в скобках не объявлены какие-либо переменные. Параметры функции – это некие входные данные, которые мы можем передать функции, чтобы получить соответствующий им результат.", - "Параметры функций": "Функции могут принимать параметры, т.е. некоторые значения, передаваемые функции для того, чтобы она что-либо сделала с ними. Эти параметры похожи на переменные, за исключением того, что значение этих переменных указывается при вызове функции, и во время работы функции им уже присвоены их значения.\n\nПараметры указываются в скобках при объявлении функции и разделяются запятыми. Аналогично мы передаём значения, когда вызываем функцию. Обратите внимание на терминологию: имена, указанные в объявлении функции, называются параметрами, тогда как значения, которые вы передаёте в функцию при её вызове, – аргументами.", - "Пример": "`def printMax(a, b):`\n `if a > b:`\n `print(a, 'максимально')`\n `elif a == b:`\n `print(a, 'равно', b)`\n `else:`\n `print(b, 'максимально')`\n\n`printMax(3, 4) # прямая передача значений`\n\n`x = 5`\n`y = 7`\n\n`printMax(x, y) # передача переменных в качестве аргументов`", - "Как это работает": "Здесь мы определили функцию с именем printMax, которая использует два параметра с именами a и b. Мы находим наибольшее число с применением простого оператора if..else и выводим это число.\n\nПри первом вызове функции printMax мы напрямую передаём числа в качестве аргументов. Во втором случае мы вызываем функцию с переменными в качестве аргументов. printMax(x, y) назначает значение аргумента x параметру a, а значение аргумента y – параметру b. В обоих случаях функция printMax работает одинаково.", - "Локальные переменные": "При объявлении переменных внутри определения функции, они никоим образом не связаны с другими переменными с таким же именем за пределами функции – т.е. имена переменных являются локальными в функции. Это называется областью видимости переменной. Область видимости всех переменных ограничена блоком, в котором они объявлены, начиная с точки объявления имени.", - "Пример": "`x = 50`\n\n`def func(x):`\n `print('x равен', x`\n `x = 2`\n `print('Замена локального x на', x)`\n\n`func(x)`\n`print('x по-прежнему', x)`", - "Как это работает": "При первом выводе значения, присвоенного имени x, в первой строке функции Python sиспользует значение параметра, объявленного в основном блоке, выше определения функции.\n\nДалее мы назначаем x значение 2. Имя x локально для нашей функции. Поэтому когда мы заменяем значение x в функции, x, объявленный в основном блоке, остаётся незатронутым.\n\nПоследним вызовом функции print мы выводим значение x, указанное в основном блоке, подтверждая таким образом, что оно не изменилось при локальном присваивании значения в ранее вызванной функции.", - "Зарезервированное слово global": "Чтобы присвоить некоторое значение переменной, определённой на высшем уровне программы необходимо указать глобально. Сделаем это при помощи зарезервированного слова global. Без применения global невозможно присвоить значение переменной, определённой за пределами функции.\n\nИспользование зарезервированного слова global достаточно ясно показывает, что переменная объявлена в самом внешнем блоке.", - "Пример": "`x = 50`\n\n`def func():`\n `global x`\n\n `print('x равно', x)`\n `x = 2`\n `print('Заменяем глобальное значение x на', x)`\n\n`func()`\n`print('Значение x составляет', x)`", - "Как это работает": "Зарезервированное слово global используется для того, чтобы объявить, что x – это глобальная переменная, а значит, когда мы присваиваем значение имени x внутри функции, это изменение отразится на значении переменной x в основном блоке программы.\n\nИспользуя одно зарезервированное слово global, можно объявить сразу несколько переменных: global x, y, z.", - "Зарезервированное слово nonlocal": "****\n\nМы увидели, как получать доступ к переменным в локальной и глобальной области видимости. Есть ещё один тип области видимости, называемый «нелокальной» (nonlocal) областью видимости, который представляет собой нечто среднее между первыми двумя. Нелокальные области видимости встречаются, когда вы определяете функции внутри функций.", - "Пример": "`def func_outer():`\n `x = 2`\n `print('x равно', x)`\n\n `def func_inner():`\n `nonlocal x`\n `x = 5`\n\n `func_inner()`\n `print('Локальное x сменилось на', x)`\n\n`func_outer()`", - "Как это работает": "Когда мы находимся внутри func_inner, переменная x, определённая в первой строке func_outer находится ни в локальной области видимости (определение переменной не входит в блок func_inner), ни в глобальной области видимости (она также и не в основном блоке программы). Мы объявляем, что хотим использовать именно эту переменную x, следующим образом: nonlocal x.", - "Значения аргументов по умолчанию": "Зачастую часть параметров функций могут быть необязательными, и для них будут использоваться некоторые заданные значения по умолчанию, если пользователь не укажет собственных. Этого можно достичь с помощью значений аргументов по умолчанию. Их можно указать, добавив к имени параметра в определении функции оператор присваивания (=) с последующим значением.", - "Пример": "`def say(message, times = 1):`\n `print(message * times)`\n\n`say('Привет')`\n`say('Мир', 5)`", - "Как это работает": "Функция под именем say используется для вывода на экран строки указанное число раз. Если мы не указываем значения, по умолчанию строка выводится\nодин раз. Мы достигаем этого указанием значения аргумента по умолчанию, равного 1 для параметра times.\n\nПри первом вызове say мы указываем только строку, и функция выводит её один раз. При втором вызове say мы указываем также и аргумент 5, обозначая таким образом, что мы хотим сказать фразу 5 раз.", - "Ключевые аргументы": "Если имеется некоторая функция с большим числом параметров, и при её вызове требуется указать только некоторые из них, значения этих параметров могут задаваться по их имени – это называется ключевые параметры. В этом случае для передачи аргументов функции используется имя (ключ) вместо позиции (как было до сих пор).\n\nЕсть два преимущества такого подхода: во-первых, использование функции становится легче, поскольку нет необходимости отслеживать порядок аргументов; во-вторых, можно задавать значения только некоторым избранным аргументам, при условии, что остальные параметры имеют значения аргумента по умолчанию.", - "Пример": "`def func(a, b=5, c=10):`\n `print('a равно', a, ', b равно', b, ', а c равно', c)`\n\n`func(3, 7)`\n`func(25, c=24)`\n`func(c=50, a=100)`", - "Как это работает": "Функция с именем func имеет один параметр без значения по умолчанию, за которым следуют два параметра со значениями по умолчанию.\n\nПри первом вызове, func(3, 7), параметр a получает значение 3, параметр b получает значение 7, а c получает своё значение по умолчанию, равное 10.\n\nПри втором вызове func(25, c=24) переменная a получает значение 25 в силу позиции аргумента. После этого параметр c получает значение 24 по имени, т.е. как ключевой параметр. Переменная b получает значение по умолчанию, равное 5.\n\nПри третьем обращении func(c=50, a=100) мы используем ключевые аргументы для всех указанных значений. Обратите внимание на то, что мы указываем значение для параметра c перед значением для a, даже несмотря на то, что в определении функции параметр a указан раньше c.", - "Переменное число параметров": "Иногда бывает нужно определить функцию, способную принимать любое число параметров. Этого можно достичь при помощи звёздочек", - "Пример": "`def total(a=5, *numbers, **phonebook):`\n `print('a', a)`\n\n `#проход по всем элементам кортежа`\n `for single_item in numbers:`\n `print('single_item', single_item)`\n\n `#проход по всем элементам словаря`\n `for first_part, second_part in phonebook.items():`\n `print(first_part,second_part)`\n\n`print(total(10,1,2,3,Jack=1123,John=2231,Inge=1560))`", - "Как это работает": "Когда мы объявляем параметр со звёздочкой (например, *param), все позиционные аргументы начиная с этой позиции и до конца будут собраны в кортеж под именем param.\n\nАналогично, когда мы объявляем параметры с двумя звёздочками (**param), все ключевые аргументы начиная с этой позиции и до конца будут собраны в словарь под именем param.", - "Оператор return": "Оператор return используется для возврата5 из функции, т.е. для прекращения её работы и выхода из неё. При этом можно также вернуть некоторое значение из функции.", - "Пример": "`def maximum(x, y):`\n `if x > y:`\n `return x`\n `elif x == y:`\n `return 'Числа равны.'`\n `else:`\n `return y`\n\n`print(maximum(2, 3))`", - "Как это работает": "Функция maximum возвращает максимальный из двух параметров, которые в\nданном случае передаются ей при вызове. Она использует обычный условный оператор if..else для определения наибольшего числа, а затем возвращает это число." - }, - "Урок 7: Модули": { - "Предисловие": "Как можно использовать код повторно, помещая его в функции, мы уже видели. А что, если нам понадобится повторно использовать различные функции в других наших программах? Как вы уже, наверное, догадались, ответ – модули.\n\nСуществуют разные способы составления модулей, но самый простой – это создать файл с расширением .py, содержащий функции и переменные.\n\nДругой способ – написать модуль на том языке программирования, на котором написан сам интерпретатор Python. Например, можно писать модули на языке программирования C, которые после компиляции могут использоваться стандартным интерпретатором Python\n\nСперва посмотрим, как использовать модули стандартной библиотеки.", - "Пример": "`import sys`\n\n`print('Аргументы командной строки:')`\n`for i in sys.argv:`\n `print(i)`\n\n`print('\\n\\nПеременная PYTHONPATH содержит', sys.path, '\\n')`", - "Как это работает": "Мы импортируем модуль sys.\n\nКогда выполняется команда import sys, идёт поиск модуля sys.\n\nДоступ к переменной argv в модуле sys предоставляется при помощи точки, т.е. sys.argv. Это явно показывает, что это имя является частью модуля sys.\n\nКогда мы запускаем «python using_sys.py we are arguments», мы запускаем модуль using_sys.py командой python, а всё, что следует далее – аргументы, передаваемые программе. Python сохраняет аргументы командной строки в переменной sys.argv для дальнейшего использования.", - "Файлы байткода .pyc": "Импорт модуля – относительно дорогостоящее мероприятие, поэтому Python предпринимает некоторые трюки для ускорения этого процесса. Один из способов – создать байткомпилированные файлы (или байткод) с расширением .pyc, которые являются некой промежуточной формой, в которую Python переводит программу (помните раздел «Введение» о том, как работает Python?). Такой файл .pyc полезен при импорте модуля в следующий раз в другую программу – это произойдёт намного быстрее, поскольку значительная часть обработки, требуемой при импорте модуля, будет уже проделана. Этот байткод также является платформо-независимым.", - "Оператор from... import...": "Чтобы импортировать переменную argv прямо в программу и не писать всякий раз sys. При обращении к ней, можно воспользоваться выражением «from sys import argv».\n\nДля импорта всех имён, использующихся в модуле sys, можно выполнить команду «from sys import *». Это работает для любых модулей.\n\nВ общем случае вам следует избегать использования этого оператора и использовать вместо этого оператор import, чтобы предотвратить конфликты имён и не затруднять чтение программы.", - "Создание собственных модулей": "Создать собственный модуль очень легко. Да вы всё время делали это! Ведь каждая программа на Python также является и модулем. Необходимо лишь убедиться, что у неё установлено расширение .py.", - "Пример": "`def sayhi():`\n `print('Привет! Это говорит мой модуль.')`\n\n`version = '0.1'`\n\n`# Конец модуля mymodule.py`", - "Функция dir": "Встроенная функция dir() возвращает список имён, определяемых объектом. Например, для модуля в этот список входят функции, классы и переменные, определённые в этом модуле.\n\nЭта функция может принимать аргументы. Если в качестве аргумента указано имя модуля, она возвращает список имён, определённых в этом модуле. Если никакого аргумента не передавать, она вернёт список имён, определённых в текущем модуле.", - "Пример": "`$ python3`\n\n`>>> import sys # получим список атрибутов модуля 'sys'`\n\n`>>> dir(sys)`\n`['getfilesystemencoding', 'getprofile', 'getrecursionlimit', 'getrefcount', 'getsizeof', 'gettrace', porter_cache', 'platform', 'prefix', 'ps1', 'ps2', 'setcheckinterval', 'setprofile', 'setrecursionlimit', 'settrace', 'stderr', 'stdin', 'stdout', 'subversion', 'version', 'version_info', 'warnoptions', 'winver']`\n\n`>>> dir() # получим список атрибутов текущего модуля`\n`['builtins', 'doc', 'name', 'package', 'sys']`\n\n`>>> a = 5 # создадим новую переменную 'a'`\n\n`>>> dir()`\n`['builtins', 'doc', 'name', 'package', 'a', 'sys']`\n\n`>>> del a # удалим имя 'a'`\n\n`>>> dir()`\n`['builtins', 'doc', 'name', 'package', 'sys']`\n\n`>>>`", - "Как это работает": "Мы вызываем функцию dir, не передавая ей параметров. По умолчанию, она возвращает список атрибутов текущего модуля. Обратите внимание, что список импортированных модулей также входит туда.\n\nЧтобы пронаблюдать за действием dir, мы определяем новую переменную a и присваиваем ей значение, а затем снова вызываем dir. Видим, что в полученном списке появилось дополнительное значение. Удалим переменную/атрибут из текущего модуля при помощи оператора del, и изменения вновь отобразятся на выводе функции dir.\n\nЗамечание по поводу del: этот оператор используется для удаления переменной/имени, и после его выполнения, в данном случае – del a, к переменной a больше невозможно обратиться – её как будто никогда и не было.", - "Пакеты": "К настоящему времени вы, вероятно, начали наблюдать некоторую иерархию в организации ваших программ. Переменные обычно находятся в функциях. Функции и глобальные переменные обычно находятся в модулях. А что, если возникнет необходимость как-то организовать модули? Вот здесь-то и выходят на сцену пакеты.\n\nПакеты – это просто каталоги с модулями и специальным файлом init.py, который показывает Python, что этот каталог особый, так как содержит модули Python.\n\nПредставим, что мы хотим создать пакет под названием «world» с субпакетами «asia», «africa» и т.д., которые, в свою очередь, будут содержать модули «india», «madagascar» и т.д.", - "Пример": "Представим, что мы хотим создать пакет под названием «world» с субпакетами «asia», «africa» и т.д., которые, в свою очередь, будут содержать модули «india», «madagascar» и т.д.\n\nДля этого следовало бы создать следующую структуру каталогов:\n\n`| - <некоторый каталог из sys.path>/`\n`| |---- world/`\n`| |---- init.py`\n`| |---- asia/`\n`| | |---- init.py`\n`| | |---- india/`\n`| | |---- init.py`\n`| | |---- foo.py`\n`| |---- africa/`\n`| |---- init.py`\n`| |---- madagascar/`\n`| |---- init.py`\n`| |---- bar.py`" - }, - "Урок 8: Структуры данных": { - "Предисловие": "Структуры данных – это, по сути, и есть структуры, которые могут хранить некоторые данные вместе. Другими словами, они используются для хранения связанных данных.\n\nВ Python существуют четыре встроенных структуры данных: список, кортеж, словарь и множество. Посмотрим, как ими пользоваться, и как они могут облегчить нам жизнь.", - "Список": "Список – это структура данных, которая содержит упорядоченный набор элементов, т.е. хранит последовательность элементов. Это легко представить, если вспомнить список покупок, в котором перечисляется, что нужно купить, с тем лишь исключением, что в списке покупок каждый элемент обычно размещается на отдельной строке, тогда как в Python они разделяются запятыми.\n\nСписок элементов должен быть заключён в квадратные скобки, чтобы Python понял, что это список. Как только список создан, можно добавлять, удалять или искать элементы в нём. Поскольку элементы можно добавлять и удалять, мы говорим, что список – это изменяемый тип данных, т.е. его можно модифицировать.", - "Краткое введение в объекты и классы": "Список – это один из примеров использования объектов и классов. Когда мы назначаем некоторой переменной i значение, скажем, целое число 5, это можно представить себе как создание объекта (т.е. экземпляра) i класса (т.е. типа) int. Чтобы лучше понять это, прочитайте help(int).\n\nКласс может также иметь методы, т.е. функции, определённые для использования только применительно к данному классу. Этот функционал будет доступен только когда имеется объект данного класса. Например, Python предоставляет метод append для класса list, который позволяет добавлять элемент к концу списка. Так mylist.append('and item') добавит эту строку к списку mylist. Обратите внимание на обозначение точкой для доступа к методам объектов.", - "Пример": "`shoplist = ['яблоки', 'манго', 'морковь', 'бананы']`\n\n`print('Я должен сделать', len(shoplist), 'покупки.')`\n\n`print('Покупки:', end=' ')`\n`for item in shoplist:`\n `print(item, end=' ')`\n\n`print('\\nТакже нужно купить риса.')`\n`shoplist.append('рис')`\n`print('Теперь мой список покупок таков:', shoplist)`\n\n`print('Отсортирую-ка я свой список')`\n`shoplist.sort()`\n`print('Отсортированный список покупок выглядит так:', shoplist)`\n\n`print('Первое, что мне нужно купить, это', shoplist[0])`\n`olditem = shoplist[0]`\n`del shoplist[0]`\n`print('Я купил', olditem)`\n`print('Теперь мой список покупок:', shoplist)`", - "Как это работает": "В shoplist мы храним только строки с названиями того, что нужно купить.\n\nДалее мы добавляем элемент к списку при помощи append – метода объекта списка. Затем мы проверяем, действительно ли элемент был добавлен к списку, выводя содержимое списка на экран.\n\nЗатем мы сортируем список, используя метод sort объекта списка.\n\nДалее после совершения покупки мы хотим удалить её из списка. Это достигается применением оператора del.", - "Кортеж": "Кортежи служат для хранения нескольких объектов вместе. Их можно рассматривать как аналог списков, но без такой обширной функциональности, которую предоставляет класс списка. Одна из важнейших особенностей кортежей заключается в том, что они неизменяемы, так же, как и строки. Т.е. модифицировать кортежи невозможно.\n\nКортежи обозначаются указанием элементов, разделённых запятыми; по желанию их можно ещё заключить в круглые скобки.\n\nКортежи обычно используются в тех случаях, когда оператор или пользовательская функция должны наверняка знать, что набор значений, т.е. кортеж значений, не изменится.", - "Пример": "`zoo = ('питон', 'слон', 'пингвин') # помните, что скобки не обязательны`\n`print('Количество животных в зоопарке -', len(zoo))`\n\n`new_zoo = 'обезьяна', 'верблюд', zoo`\n`print('Количество клеток в зоопарке -', len(new_zoo))`\n`print('Все животные в новом зоопарке:', new_zoo)`\n`print('Животные, привезённые из старого зоопарка:', new_zoo[2])`\n`print('Последнее животное, привезённое из старого зоопарка -', new_zoo[2][2])`\n`print('Количество животных в новом зоопарке -', len(new_zoo)-1 + \\`\n `len(new_zoo[2])`", - "Как это работает": "Переменная zoo обозначает кортеж элементов. Функция len позволяет получить длину кортежа.\n\nТеперь мы перемещаем этих животных в новый зоопарк. Поэтому кортеж new_zoo содержит тех животных, которые уже там, наряду с привезёнными из старого зоопарка.\n\nДоступ к элементам кортежа осуществляется указанием позиции элемента, заключённой в квадратные скобки. Это называется оператором индексирования. Доступ к третьему элементу в new_zoo мы получаем, указывая new_zoo[2], а доступ к третьему элементу внутри третьего элемента в кортеже new_zoo – указывая new_zoo[2][2].", - "Словарь": "Словарь – это некий аналог адресной книги, в которой можно найти адрес или контактную информацию о человеке, зная лишь его имя; т.е. некоторые ключи связаны со значениями.\n\nПары ключ-значение указываются в словаре следующим образом: «d = {key1 : value1, key2 : value2 }». Обратите внимание, что ключ и значение разделяются двоеточием, а пары друг от друга отделяются запятыми, а затем всё это заключается в фигурные скобки.", - "Пример": "`ab = { 'Swaroop' : 'swaroop@swaroopch.com',`\n `'Larry' : 'larry@wall.org',`\n `'Matsumoto' : 'matz@ruby-lang.org',`\n `'Spammer' : 'spammer@hotmail.com'`\n `}`\n\n`print(\"Адрес Swaroop'а:\", ab['Swaroop'])`\n\n`# Удаление пары ключ-значение`\n`del ab['Spammer']`\n\n`print('\\nВ адресной книге {0} контакта\\n'.format(len(ab)))`\n `print('Контакт {0} с адресом {1}'.format(name, address))`\n\n`# Добавление пары ключ-значение`\n`ab['Guido'] = 'guido@python.org'`\n\n`if 'Guido' in ab:`\n `print(\"\\nАдрес Guido:\", ab['Guido'])`", - "Как это работает": "Мы создаём словарь ab. Затем мы обращаемся к парам ключ-значение. Как видите, синтаксис прост.\n\nУдалять пары ключ-значение можно при помощи оператора del. Мы указываем имя словаря и оператор индексирования для удаляемого ключа, после чего передаём это оператору del.\n\nДалее мы обращаемся ко всем парам ключ-значение нашего словаря, используя метод items, который возвращает список кортежей, каждый из которых содержит пару элементов: ключ и значение. Мы получаем эту пару и присваиваем её значение переменным name и address соответственно в цикле for..in, а затем выводим эти значения на экран в блоке for.", - "Последовательности": "Списки, кортежи и строки являются примерами последовательностей. Но что такое последовательности и что в них такого особенного?\n\nОсновные возможности – это проверка принадлежности (т.е. выражения «in» и «not in») и оператор индексирования, позволяющий получить напрямую некоторый элемент последовательности.\n\nВсе три типа последовательностей, упоминавшиеся выше (списки, кортежи и строки), также предоставляют операцию получения вырезки, которая позволяет получить вырезку последовательности, т.е. её фрагмент.", - "Пример": "`shoplist = ['яблоки', 'манго', 'морковь', 'бананы']`\n`name = 'swaroop'`\n\n`# Операция индексирования`\n`print('Элемент 0 -', shoplist[0])`\n`print('Элемент 1 -', shoplist[1])`\n`print('Элемент 2 -', shoplist[2])`\n`print('Элемент 3 -', shoplist[3])`\n`print('Элемент -1 -', shoplist[-1])`\n`print('Элемент -2 -', shoplist[-2])`\n`print('Символ 0 -', name[0])`\n\n`# Вырезка из списка`\n`print('Элементы с 1 по 3:', shoplist[1:3])`\n`print('Элементы с 2 до конца:', shoplist[2:])`\n`print('Элементы с 1 по -1:', shoplist[1:-1])`\n`print('Элементы от начала до конца:', shoplist[:])`\n\n`# Вырезка из строки`\n`print('Символы с 1 по 3:', name[1:3])`\n`print('Символы с 2 до конца:', name[2:])`\n`print('Символы с 1 до -1:', name[1:-1])`\n`print('Символы от начала до конца:', name[:])`" - }, - "Урок 9: Исключения": { - "Предисловие": "Исключения возникают тогда, когда в программе возникает некоторая исключительная ситуация. Например, к чему приведёт попытка чтения несуществующего файла? Или если файл был случайно удалён, пока программа работала? Такие ситуации обрабатываются при помощи исключений.\n\nЭто касается и программ, содержащих недействительные команды. В этом случае Python поднимает руки и сообщает, что обнаружил ошибку.", - "Ошибки": "Рассмотрим простой вызов функции print. Что, если мы ошибочно напишем print как Print? Обратите внимание на заглавную букву. В этом случае Python поднимает синтаксическую ошибку.", - "Пример": "`>>> Print('Привет, Мир!')`\n`Traceback (most recent call last):`\n `File \"\", line 1, in `\n `Print('Привет, Мир!')`\n`NameError: name 'Print' is not defined`\n\nОбратите внимание, что была поднята ошибка NameError, а также указано место, где была обнаружена ошибка. Так в данном случае действует обработчик ошибок.", - "Исключения": "Попытаемся считать что-либо от пользователя. Нажмите Сtrl-D (или Ctrl+Z в Windows) и посмотрите, что произойдёт.", - "Пример": "`>>> s = input('Введите что-нибудь --> ')`\n\n`Введите что-нибудь -->`\n`Traceback (most recent call last):`\n `File \"\", line 1, in `\n `s = input('Введите что-нибудь --> ') `\n`EOFError: EOF when reading a line`\n\nPython поднимает ошибку с именем EOFError, что означает, что он обнаружил символ конца файла (который вводится при помощи Ctrl-D) там, где не ожидал.", - "Обработка исключений": "Обрабатывать исключения можно при помощи оператора try..except. При этом все обычные команды помещаются внутрь try-блока, а все обработчики исключений – в except-блок.", - "Пример": "`try:`\n `text = input('Введите что-нибудь --> ')`\n`except EOFError:`\n `print('Ну зачем вы сделали мне EOF?')`\n`except KeyboardInterrupt:`\n `print('Вы отменили операцию.')`\n`else:`\n `print('Вы ввели {0}'.format(text))`", - "Как это работает": "Здесь мы поместили все команды, которые могут вызвать исключения/ошибки, внутрь блока try, а затем поместили обработчики соответствующих ошибок/исключений в блок except. Выражение except может обрабатывать как одиночную ошибку или исключение, так и список ошибок/исключений в скобках. Если не указано имя ошибки или исключения, обрабатываться будут все ошибки и исключения.", - "Вызов исключения": "Исключение можно поднять при помощи оператора raise, передав ему имя ошибки/исключения, а также объект исключения, который нужно выбросить.\n\nВызываемая ошибка или исключение должна быть классом, который прямо или непрямо является производным от класса Exception.", - "Пример": "`class ShortInputException(Exception):`\n `'''Пользовательский класс исключения.'''`\n `def init(self, length, atleast):`\n `Exception.init(self)`\n `self.length = length`\n `self.atleast = atleast`\n\n`try:`\n `text = input('Введите что-нибудь --> ')`\n `if len(text) < 3:`\n `raise ShortInputException(len(text), 3)`\n `# Здесь может происходить обычная работа`\n`except EOFError:`\n `print('Ну зачем вы сделали мне EOF?')`\n`except ShortInputException as ex:`\n `print('ShortInputException: Длина введённой строки -- {0}; \\`\n `ожидалось, как минимум, {1}'.format(ex.length, ex.atleast))`\n`else:`\n `print('Не было исключений.')`", - "Как это работает": "Здесь мы создаём наш собственный тип исключения. Этот новый тип исключения называется ShortInputException. Он содержит два поля: length, хранящее длину введённого текста, и atleast, указывающее, какую минимальную длину текста ожидала программа.\n\nВ пункте except мы указываем класс ошибки ShortInputException, который будет сохранён как переменная ex, содержащая соответствующий объект ошибки/исключения. Это аналогично параметрам и аргументам при вызове функции. Внутри этого пункта except мы используем поля length и atleast объекта исключения для вывода необходимых сообщений пользователю.", - "Try .. Finally": "Представим, что в программе происходит чтение файла и необходимо убедиться, что объект файла был корректно закрыт и что не возникло никакого исключения. Этого можно достичь с применением блока finally.", - "Пример": "`import time`\n\n`try:`\n `f = open('poem.txt')`\n `while True: # наш обычный способ читать файлы`\n `line = f.readline()`\n `if len(line) == 0:`\n `break`\n `print(line, end='')`\n `time.sleep(2) # Пусть подождёт некоторое время`\n`except KeyboardInterrupt:`\n `print('!! Вы отменили чтение файла.')`\n`finally:`\n `f.close()`\n `print('(Очистка: Закрытие файла)')`", - "Как это работает": "Здесь мы производим обычные операции чтения из файла, но в данном случае добавляем двухсекундный сон после вывода каждой строки при помощи функции time.sleep, чтобы программа выполнялась медленно (ведь Python очень быстр от природы). Во время выполнения программы нажмите ctrl-c, чтобы прервать/отменить выполнение программы.\n\nПронаблюдайте, как при этом выдаётся исключение KeyboardInterrupt, и программа выходит. Однако, прежде чем программа выйдет, выполняется пункт finally, и файловый объект будет всегда закрыт.", - "Оператор with": "Типичной схемой является запрос некоторого ресурса в блоке try с последующим освобождением этого ресурса в блоке finally. Для того, чтобы сделать это более «чисто»,существует оператор with:", - "Пример": "`with open(\"poem.txt\") as f:`\n `for line in f:`\n `print(line, end='')`", - "Как это работает": "Существует некий протокол, используемый оператором with. Он считывает объект, возвращаемый операторомopen.Назовём его в данном случае «thefile».\n\nПеред запуском блока кода, содержащегося в нём, оператор with всегда вызывает функцию thefile.enter, а также всегда вызывает thefile.exit после завершения выполнения этого блока кода.\n\nТак что код, который мы бы написали в блоке finally, будет автоматически обработан методом exit. Это избавляет нас от необходимости повторно в явном виде указывать операторы try..finally." - }, - "Урок 10: Дополнительно": { - "Предисловие": "К настоящему моменту мы уже рассмотрели большую часть того, что вам придётся использовать при работе с Python. В этой главе мы охватим некоторые дополнительные аспекты, которые помогут отшлифовать ваши знания.", - "Self": "Методы класса имеют одно отличие от обычных функций: они должны иметь дополнительно имя, добавляемое к началу списка параметров. Однако, при вызове метода никакого значения этому параметру присваивать не нужно – его укажет Python. Эта переменная указывает на сам объект экземпляра класса, и по традиции она называется self.\n\nХотя этому параметру можно дать любое имя, настоятельно рекомендуется использовать только имя self; использование любого другого имени не приветствуется. Есть много достоинств использования стандартного имени: во-первых, любой человек, просматривающий вашу программу, легко узнает его; во-вторых, некоторые специализированные Интегрированные среды разработки (IDE) изначально рассчитаны на использование self.", - "Классы": "Классы предоставляют средства объединения данных и функциональности вместе. Создание нового класса создает объект нового типа, позволяя создавать новые экземпляры этого типа. К каждому экземпляру класса могут быть прикреплены атрибуты для поддержания его состояния. Экземпляры класса также могут иметь методы (определенные его классом) для изменения его состояния.", - "Пример": "`class Person:`\n `pass # Пустой блок`\n\n`p = Person()`\n`print(p)`", - "Как это работает": "Мы создаём новый класс при помощи оператора class и имени класса. За этим следует блок выражений, формирующих тело класса. В данном случае блок у нас пуст, на что указывает оператор pass.\n\nДалее мы создаём объект-экземпляр класса, записывая имя класса со скобками. (Мы узнаем больше о реализации в следующем разделе). Для проверки мы выясняем тип переменной, просто выводя её на экран. Так мы видим, что у нас есть экземпляр класса Person в модуле main.\n\nОбратите внимание, что выводится также и адрес в памяти компьютера, где хранится ваш объект. На вашем компьютере адрес будет другим, так как Python хранит объекты там, где имеется свободное место.", - "Методы объектов": "Итак, мы выяснили что классы/объекты могут иметь методы, представляющие собой функции, за исключением дополнительной переменной self. А теперь давайте рассмотрим пример", - "Пример": "`class Person:`\n `def sayHi(self):`\n `print('Привет! Как дела?')`\n\n`p = Person()`\n`p.sayHi()`", - "Как это работает": "Здесь мы видим self в действии. Обратите внимание, что метод sayHi не принимает параметров, но тем не менее, имеет self в определении функции.", - "Блоки в одно выражение": "Мы неоднократно говорили, что каждый блок команд отделяется от других своим собственным уровнем отступа. Однако, существует и исключение. Если блок команд содержит только одно выражение, его можно указывать в одной строке с условным оператором или, скажем, оператором цикла. Рассмотрим это на примере:", - "Пример": "`>>> flag = True`\n`>>> if flag: print('Да')`\n`Да`\n\nОбратите внимание, что единственный оператор расположен в той же строке, а не отдельным блоком. Этот способ может подкупить тем, что якобы «сокращает» программу, но мы настоятельно рекомендуем избегать его во всех случаях, кроме проверки ошибок. Прежде всего, потому что гораздо легче добавлять команды, когда уже есть необходимый уровень отступа.", - "Lambda-функции": "Ключевое слово lambda используется для создания функций и возврата их значения во время выполнения программы. lambda принимает параметр, за которым следует одно выражение, которое становится телом функции, а значение этого выражения возвращается новой функцией.", - "Пример": "`points = [ { 'x' : 2, 'y' : 3 }, { 'x' : 4, 'y' : 1 } ]`\n`points.sort(key=lambda i : i['y'])`\n`print(points)`", - "Как это работает": "Обратите внимание на то, что метод sort класса list может принимать параметр key, определяющий способ сортировки списка (обычно мы думаем только о сортировке по возрастанию или по убыванию). В данном случае мы хотим провести сортировку по собственному принципу, для чего нам необходимо написать соответствующую функцию. Но вместо того, чтобы создавать отдельный блок def для описания функции, которая будет использоваться только в этом месте, мы применяем лямбда-выражение.", - "Генераторы списков": "Генераторы списков служат для создания новых списков на основе существующих. Представьте, что имеется список чисел, на основе которого требуется получить новый список, состоящий из всех чисел, умноженных на 2, но только при условии, что само число больше 2. Генераторы списков подходят для таких задач как нельзя лучше.", - "Пример": "`listone = [2, 3, 4]`\n`listtwo = [2*i for i in listone if i > 2]`\n`print(listtwo)`", - "Как это работает": "В этом примере мы создаём новый список, указав операцию, которую необходимо произвести (2 * i), когда выполняется некоторое условие (if i > 2).Обратите внимание, что исходный список при этом не изменяется.", - "Передача кортежей и словарей в функции": "Для получения параметров, переданных функции, в виде кортежа или словаря, существуют специальные приставки «*» или «**» соответственно. Это особенно полезно в случаях, когда функция может принимать переменное число параметров.", - "Пример": "`>>> def powersum(power, *args):`\n`... '''Возвращает сумму аргументов, возведённых в указанную степень.'''`\n`... total = 0`\n`... for i in args:`\n`... total += pow(i, power)`\n`... return total`\n`...`\n`>>> powersum(2, 3, 4)`\n`25`\n`>>> powersum(2, 10)`\n`100`\n\nПоскольку перед переменной args указана приставка «*», все дополнительные аргументы, переданные функции, сохранятся в args в виде кортежа. В случае использования приставки «**» все дополнительные параметры будут рассматриваться как пары ключ/значение в словаре.", - "exec и eval": "Функция exec служит для выполнения команд Python, содержащихся в строке или файле, в отличие от самого текста программы. Например, во время выполнения программы можно сформировать строку, содержащую текст программы на Python, и запустить его при помощи exec:", - "Пример": "`>>> exec('print(\"Здравствуй, Мир!\")')`\n`Здравствуй, Мир!`", - "Оператор assert": "Оператор assert существует для того, чтобы указать, что нечто является истиной. Например, если требуется гарантировать, что в списке будет хотя бы один элемент, и вызвать ошибку, если это не так, то оператор assert идеально подойдёт для такой задачи. Когда заявленное выражение ложно, вызывается ошибка AssertionError. Метод pop() возвращает последний элемент списка, одновременно удаляя его оттуда.", - "Пример": "`>>> mylist = ['item']`\n`>>> assert len(mylist) >= 1`\n`>>> mylist.pop()`\n`'item'`\n`>>> mylist`\n`[]`\n`>>> assert len(mylist) >= 1`\n`Traceback (most recent call last):`\n `File \"\", line 1, in `\n`AssertionError`", - "Функция repr": "Функция repr используется для получения канонического строкового представления объекта. Любопытно, что в большинстве случаев eval(repr(object)) == object.", - "Пример": "`>>> i = []`\n`>>> i.append('item')`\n`>>> repr(i)`\n`\"['item']\"`\n`>>> eval(repr(i))`\n`['item']`\n`>>> eval(repr(i)) == i`\n`True`\n\nПо большому счёту, функция repr служит для получения печатаемого представления объекта. Определив метод repr в собственном классе, можно указать, что он будет возвращать по вызову функции repr.", - "Установка библиотек": "В Каталоге пакетов Python существует колоссальное количество открытых библиотек, которые вы можете использовать в своих программах. Для их установки можно воспользоваться pip.", - "Графические программы": "Для создания собственной графической программы на Python понадобится какая-нибудь библиотека ГИП (графического интерфейса пользователя) со своими привязками к Python. Привязки позволяют писать программу на Python, используя библиотеки, которые сами по себе написаны на C, C++ или других языках.", - "PyGTK": "Это привязки Python к инструментарию GTK+, на основе которого построен GNOME. У GTK+ есть много своих особенностей, но как только вы освоитесь, вы сможете создавать ГИП очень быстро. Что касается дизайнера графического интерфейса Glade, то он просто незаменим. Документация же всё ещё требует некоторых улучшений. GTK+ хорошо работает в GNU/Linux, но его порт на Windows пока не закончен. При помощи GTK+ можно создавать как свободные, так и проприетарные программы. Для начала прочитайте Учебник по PyGTK.", - "PyQt": "Это привязки Python к инструментарию Qt, на основе которого построена KDE. Qt чрезвычайно прост в использовании, особенно благодаря Qt Designer и изумительной документации Qt. PyQt бесплатно, если используется для создания свободных программ (с лицензией GPL). Для создания закрытых проприетарных программ вам придётся его купить. Начиная с Qt 4.5, разрешается создавать при помощи него не только GPL’ные программы.", - "wxPython": "Это привязки Python к инструментарию wxWidgets. wxPython не так прост в освоении, но зато он переносим и работает на GNU/Linux, Windows, Mac и даже на встраиваемых платформах. Многие среды разработки для wxPython, такие как SPE (Stani’s Python Editor) и wxGlade включают дизайнеры графического интерфейса. При помощи wxPython можно создавать как свободные, так и проприетарные программы.", - "Ошибка ключа (KeyError)": "Ошибка KeyError возникает, когда мы пытаемся получить или удалить значение ключа из словаря, и этот ключ не существует в словаре. \nРешение ошибки: проверьте наличие ключа (используйте метод keys(), чтобы получить список всех ключей в словаре)", - "Переполнение (OverflowError)": "Ошибка переполнение вызывается, когда результат операции выходил за пределы диапазона. Она характерна для целых чисел вне диапазона. \nРешение ошибки: использовать специальные библиотеки для вычисления больших чисел или уменьшить сами вычисления.", - "Ошибка утверждения (AssertionError)": "Когда инструкция утверждения не верна, вызывается ошибка утверждения. \nРешение ошибки: найти место в коде, где возникает эта ошибка, и проверить, почему условие в утверждении не выполняется. Для этого можно использовать отладочные инструменты.", - "Ошибка индекса (IndexError)": "Если пытаться получить доступ к индексу (последовательности) списка, которого не существует в этом списке или находится вне его диапазона, будет вызвана ошибка индекса (IndexError: list index out of range python). \nРешение ошибки: проверьте, что вы используете правильный индекс. Если индекс отрицательный, он должен быть в диапазоне от -1 до -len(list), где len(list) - это длина списка. Если индекс положительный, он должен быть в диапазоне от 0 до len(list) - 1.", - "Ошибка имени (NameError)": "Ошибка имени возникает, когда локальное или глобальное имя не находится. \nРешение ошибки: перепроверьте, существует ли вызываемая переменная в вашем коде, может быть вы не дописали название переменной при её вызове.", - "Ошибка деления на ноль (ZeroDivisionError)": "Возникает когда пользователь пытается поделить число на 0, а по правилам математики это делать нельзя. \nРешение ошибки: делите ноль на число, а не число на ноль.", - "Синтаксические ошибки (SyntaxError)": "Синтаксические ошибки часто называют ошибками разбора. Они возникают, когда интерпретатор обнаруживает синтаксическую проблему в коде. \nРешение ошибки: проверьте, не идут ли у вас две команды на одной строке друг за другом, не пропущена ли команда на месте ошибки.", - "Ошибка поиска (LookupError)": "LockupError появляется когда key или index используются для связывания или последовательность списка/словаря неверна или не существует. \nРешение ошибки: проверьте, что вы используете правильный ключ или индекс.", - "Ошибка значения (ValueError)": "Ошибка значения вызывается, когда встроенная операция или функция получают аргумент с корректным типом, но недопустимым значением. \nРешение ошибки: убедитесь, что вы передаете правильный тип данных.", - "Ошибка рекурсии (RecursionError)": "Ошибка рекурсии возникает, когда функция вызывает саму себя слишком много раз, превышая максимальную глубину рекурсии, которая определяется размером стека. \nРешение ошибки: проверьте, что ваша функция корректно реализована и не вызывает саму себя в бесконечном цикле. Такая ошибка может возникать, если в вашей функции отсутствует условие выхода из рекурсии.", - "Ошибка отступа (IndentationError)": "Эта ошибка похожа по духу на синтаксическую и является ее подвидом. Тем не менее она возникает только в случае проблем с отступами. \nРешение ошибки: проверьте правильно ли вы сделали отступы.", - "Ошибка памяти (MemoryError) Недостаточно памяти (OutofMemoryError)": "Ошибки памяти в Python могут возникать по нескольким причинам, связанным с использованием оперативной памяти компьютера. В частности, они могут быть вызваны использованием 32-битной архитектуры Python, загрузкой больших файлов, запуском моделей машинного/глубокого обучения и другими факторами. \nРешение ошибки: для обработки ошибок памяти в Python можно использовать обработку исключений, но следует учитывать, что это резервное исключение, которое вызывается, когда у интерпретатора заканчивается память и он должен немедленно остановить текущее исполнение. В редких случаях Python вызывает OutofMemoryError, позволяя скрипту перехватить самого себя, остановить ошибку памяти и восстановиться, но такой подход не является хорошей практикой.", - "Ошибка прерывания с клавиатуры (KeyboardInterrupt)": "Ошибка прерывания с клавиатуры возникает, когда пользователь прерывает выполнение программы с помощью комбинации клавиш Ctrl + C или Ctrl + Z. \nРешение ошибки: попробуйте использовать блок try-except для обработки этой ошибки. Таким образом, вы сможете корректно завершить выполнение программы, если пользователь прервал ее выполнение.", - "Ошибка типа (TypeError)": "Ошибка типа вызывается при попытке объединить два несовместимых операнда или объекта. \nРешение ошибки: вы можете использовать обработку исключений try-except, чтобы избежать ее возникновения.", - "Ошибка импорта (ModuleNotFoundError)": "Ошибка импорта вызывается при попытке импортировать несуществующий (или неспособный загрузиться) модуль в стандартном пути или даже при допущенной ошибке в имени. \nРешение ошибки: проверьте, что вы находитесь в правильном каталоге. Если модуль находится в другом каталоге, вы можете изменить путь поиска модулей, чтобы Python мог его найти.", - "Ошибка атрибута (AttributeError)": "Ошибка атрибута (AttributeError) возникает, когда вы пытаетесь получить доступ к атрибуту объекта, который не существует.Решение ошибки: проверьте, что вы используете правильное имя атрибута. Если вы используете неправильное имя атрибута, Python не сможет его найти.", - "Ошибка выполнения (NotImplementedError)": "Ошибка выполнения служит базовым классом для ошибки NotImplemented. Абстрактные методы определенного пользователем класса вызывают это исключение, когда производные методы перезаписывают оригинальный.Решение ошибки: убедитесь, что вы определили реализацию всех абстрактных методов в производных классах." - } + "Урок 2: Установка Python": { + "Предисловие": { + "text": "Итак для того чтобы нам начать писать код нужно установть сам Python, а так же редактор для него ", + "use_function_to_read_code": false + }, + "Установка в Windows": { + "text": "Посетите страницу http://www.python.org/download/ и загрузите последнюю версию. Установка производится так же, как и для любых других программ для Windows.", + "use_function_to_read_code": false + }, + "Выбор редактора": { + "text": "Поскольку мы не можем набирать программу в командной так как, нам понадобится сохранять программы в файлах. \n\nИтак нам нужен редактор для работы с файлами программ. Выбор редактора крайне важен. Хороший редактор поможет вам легко писать программы на Python, делая ваше путешествие более комфортным, а также позволяя быстрее и безопаснее достичь вашей цели. \n\nОдно из самых основных требований – это подсветка синтаксиса, когда разные элементы программы на Python раскрашены так, чтобы вы могли легко видеть вашу программу и ход её выполнения. \n\nЕсли вы не знаете, с чего начать, мы бы порекомендовали вам пользоваться программой PyCharm", + "use_function_to_read_code": false + }, + "Создание проекта": { + "text": "Запустите выбранный вами редактор, введите следующую программу и сохраните её под именем helloworld.py . \n\nЕсли вы пользуетесь PyCharm, нажмите «New Project» → «выберете путь где будут хранится ваши программы» → «создавайте проект!»", + "use_function_to_read_code": false + } + }, + + "Урок 3: Основы": { + "Мощный язык": { + "text": "Python – это, один из немногих языков программирования, простых в освоении и одновременно мощных. \n\nЭто очень важно и для начинающих, и для специалистов, но что ещё важнее – на нём приятно программировать.", + "use_function_to_read_code": false + }, + "Комментарии": { + "text": "Комментарии – это то, что пишется после символа #, и представляет интерес лишь как заметка для читающего программу. \n\nНапример: \nprint(Привет, Мир!) # print -- это функция", + "use_function_to_read_code": false + }, + "Строки": { + "text": "Строка – это последовательность символов, записанная в массиве. Чаще всего строки – это просто некоторые наборы слов. \n\nСлова могут быть как на английском языке, так и на любом другом, поддерживаемом стандартом Unicode, что означает почти на любом языке мира.", + "use_function_to_read_code": false + }, + "Одинарные кавычки": { + "text": "Строку можно указать, используя одинарные кавычки, как например, 'Фраза в кавычках'. Все пробелы и знаки табуляции сохранятся, как есть.", + "use_function_to_read_code": false + }, + "Двойные кавычки": { + "text": "Строки в двойных кавычках работают точно так же, как и в одинарных. Например,\"Как тебя зовут?\".", + "use_function_to_read_code": false + }, + "Типы данных": { + "text": "Переменные могут хранить значения разных типов, называемых типами данных. Основными типами являются числа и строки, о которых мы уже говорили. В дальнейших главах мы увидим, как создавать свои собственные типы при помощи классов.", + "use_function_to_read_code": false + }, + "Переменные": { + "text": "Использование одних лишь литеральных констант может скоро наскучить – нам ведь нужен способ хранения любой информации и манипулирования ею. Вот здесь на сцену выходят переменные. Слово «переменные» говорит само за себя – их значение может меняться, а значит, вы можете хранить в переменной всё что угодно. \n\nПеременные – это просто области памяти компьютера, в которых вы храните некоторую информацию. В отличие от констант, к такой информации нужно каким-то образом получать доступ, поэтому переменным даются имена.", + "use_function_to_read_code": false + } + }, + + "Урок 4: Операторы и выражения": { + "О операндах и выражениях": { + "text": "Большинство предложений (логических строк) в программах содержат выражения. Простой пример выражения: 2 + 3. Выражение можно разделить на операторы и операнды. Операторы – это некий функционал, производящий какие-либо действия, который может быть представлен в виде символов, как например +, или специальных зарезервированных слов. Операторы могут производить некоторые действия над данными, и эти данные называются операндами. В нашем случае 2 и 3 – это операнды.", + "use_function_to_read_code": false + }, + "Оператор сложения": { + "text": "Объяснение: суммирует два объекта. \n\nПример: 3 + 5 даст 8; 'aboba' + 'baba' даст 'abobababa'", + "use_function_to_read_code": false + }, + "Оператор вычитания": { + "text": "Объяснение: Даёт разность двух чисел; если первый операнд отсутствует, он считается равным нулю. \n\nПример: -5.2 даст отрицательное число, а 50 - 24 даст 26.", + "use_function_to_read_code": false + }, + "Оператор умножения": { + "text": "Объяснение: Даёт произведение двух чисел или возвращает строку, повторённую заданное число раз. \n\nПример: 2 * 3 даст 6. 'la' * 3 даст 'lalala'", + "use_function_to_read_code": false + }, + "Оператор деления": { + "text": "Объяснение: Возвращает частное от деления x на y. \n\nПример: 4 / 2 даст 2", + "use_function_to_read_code": false + }, + "Оператор меньше": { + "text": "Объяснение: Определяет, верно ли, что x меньше y. Все операторы сравнения возвращают True или False. Обратите внимание на заглавные буквы в этих словах. \n\nПример: 5 < 3 даст False", + "use_function_to_read_code": false + }, + "Оператор больше": { + "text": "Объяснение: Определяет, верно ли, что x больше y. \n\nПример: 5 > 3 даст True", + "use_function_to_read_code": false + }, + "Оператор равенства": { + "text": "Объяснение: Проверяет,одинаковы ли объекты. \n\nПример: x = 2; y = 2; x == y даёт True", + "use_function_to_read_code": false + }, + "Оператор неравенства": { + "text": "Объяснение: Проверяет, верно ли, что объекты не равны. \n\nПример: x = 2; y = 3; x != y даёт True", + "use_function_to_read_code": false + }, + "Оператор логического НЕ": { + "text": "Объяснение: Если x равно True, оператор вернёт False. Если же x равно False, получим True. \n\nПример: x = True; not x даёт False", + "use_function_to_read_code": false + }, + "Оператор логического И": { + "text": "Объяснение: x and y даёт False, если x равно False , в противном случае возвращает значение y. \n\nПример: x = False; y = True; x and y возвращает False, поскольку x равно False", + "use_function_to_read_code": false + }, + "Оператор логического ИЛИ": { + "text": "Объяснение: Если x равно True, в результате получим True, в противном случае получим значение y. \n\nПример: x = True; y = False; x or y даёт True", + "use_function_to_read_code": false + } + }, + + "Урок 5: Поток команд": { + "Предисловие": { + "text": "В программах, которые мы до сих пор рассматривали, последовательность команд всегда выполнялась Python по порядку строго сверху вниз. А что, если нам необходимо изменить поток выполняющихся команд? Например, если требуется, чтобы программа принимала некоторое решение и выполняла различные действия в зависимости от ситуации; скажем, печатала «Доброе утро» или «Добрый вечер» в зависимости от времени суток. \n\nКак вы уже, наверное, догадались, этого можно достичь при помощи операторов управления потоком. В Python есть три оператора управления потоком: if, for и while.", + "use_function_to_read_code": false + }, + "Оператор if": { + "text": "Оператор if используется для проверки условий: если условие верно, выполняется блок выражений (называемый «if-блок»), иначе выполняется другой блок выражений (называемый «else-блок»). Блок «else» является необязательным.", + "use_function_to_read_code": false + }, + "Пример оператора if": { + "text": "a = 2\nb = 5\nif a > b:\n print (a)\nelif a < b:\n print (b)\nelse:\n print (\"a и b равны\")", + "use_function_to_read_code": true + }, + "Оператор while": { + "text": "Оператор while позволяет многократно выполнять блок команд до тех пор, пока выполняется некоторое условие. Это один из так называемых операторов цикла. Он также может иметь необязательный пункт else.", + "use_function_to_read_code": false + }, + "Пример оператора while": { + "text": "while 1 == 1:\n print (\"Бесконечный цикл\")", + "use_function_to_read_code": true + }, + "Цикл for": { + "text": "Оператор for..in также является оператором цикла, который осуществляет итерацию по последовательности объектов, т.е. проходит через каждый элемент в последовательности. Мы узнаем больше о последовательностях в дальнейших главах, а пока просто запомните, что последовательность – это упорядоченный набор элементов.", + "use_function_to_read_code": false + }, + "Пример цикла for": { + "text": "for i in range(10):\n print(i)\nprint('Цикл for закончен')", + "use_function_to_read_code": true + }, + "Оператор break": { + "text": "Оператор break служит для прерывания цикла, т.е. остановки выполнения команд даже если условие выполнения цикла ещё не приняло значения False или последовательность элементов не закончилась.\n\nВажно отметить, что если циклы for или while прервать оператором break, соответствующие им блоки else выполняться не будут.", + "use_function_to_read_code": false + }, + "Пример оператора break": { + "text": "while 1 == 1:\n print (\"Бесконечный цикл\")\n break", + "use_function_to_read_code": true + }, + "Оператор continue": { + "text": "Оператор continue используется для указания Python, что необходимо пропустить все оставшиеся команды в текущем блоке цикла и продолжить со следующей итерации цикла", + "use_function_to_read_code": false + }, + "Пример оператора continue": { + "text": "for count in range (10):\n if count == 7: continue\n print (count)", + "use_function_to_read_code": true + } + }, + + "Урок 6: Функции": { + "Предисловие": { + "text": "Функции – это многократно используемые фрагменты программы. Они позволяют дать имя определённому блоку команд с тем, чтобы впоследствии запускать этот блок по указанному имени в любом месте программы и сколь угодно много раз. Это называется вызовом функции. Мы уже использовали много встроенных функций, как то len и range.\n\nФункции определяются при помощи зарезервированного слова def. После этого слова указывается имя функции, за которым следует пара скобок, в которых можно указать имена некоторых переменных, и заключительное двоеточие в конце строки. Далее следует блок команд, составляющих функцию.", + "use_function_to_read_code": false + }, + "Пример применения функций": { + "text": "def sayHello():\n print('Привет, Мир!')\nsayHello() # вызов функции", + "use_function_to_read_code": true + }, + "Как работают функции": { + "text": "Мы определили функцию с именем sayHello, используя описанный выше синтаксис. Эта функция не принимает параметров, поэтому в скобках не объявлены какие-либо переменные. Параметры функции – это некие входные данные, которые мы можем передать функции, чтобы получить соответствующий им результат.", + "use_function_to_read_code": false + }, + "Параметры функций": { + "text": "Функции могут принимать параметры, т.е. некоторые значения, передаваемые функции для того, чтобы она что-либо сделала с ними. Эти параметры похожи на переменные, за исключением того, что значение этих переменных указывается при вызове функции, и во время работы функции им уже присвоены их значения.\n\nПараметры указываются в скобках при объявлении функции и разделяются запятыми. Аналогично мы передаём значения, когда вызываем функцию. Обратите внимание на терминологию: имена, указанные в объявлении функции, называются параметрами, тогда как значения, которые вы передаёте в функцию при её вызове, – аргументами.", + "use_function_to_read_code": false + }, + "Пример": { + "text": "def maximum(x, y):\n if x > y:\n return x\n elif x == y:\n return 'Числа равны.'\n else:\n return y\n\nprint(maximum(2, 3))", + "use_function_to_read_code": true + }, + "Как это работает": { + "text": "Функция maximum возвращает максимальный из двух параметров, которые в\nданном случае передаются ей при вызове. Она использует обычный условный оператор if..else для определения наибольшего числа, а затем возвращает это число.", + "use_function_to_read_code": false + }, + "Локальные переменные": { + "text": "При объявлении переменных внутри определения функции, они никоим образом не связаны с другими переменными с таким же именем за пределами функции – т.е. имена переменных являются локальными в функции. Это называется областью видимости переменной. Область видимости всех переменных ограничена блоком, в котором они объявлены, начиная с точки объявления имени.", + "use_function_to_read_code": false + }, + "Зарезервированное слово global": { + "text": "Чтобы присвоить некоторое значение переменной, определённой на высшем уровне программы необходимо указать глобально. Сделаем это при помощи зарезервированного слова global. Без применения global невозможно присвоить значение переменной, определённой за пределами функции.\n\nИспользование зарезервированного слова global достаточно ясно показывает, что переменная объявлена в самом внешнем блоке.", + "use_function_to_read_code": false + }, + "Зарезервированное слово nonlocal": { + "text": "****\n\nМы увидели, как получать доступ к переменным в локальной и глобальной области видимости. Есть ещё один тип области видимости, называемый «нелокальной» (nonlocal) областью видимости, который представляет собой нечто среднее между первыми двумя. Нелокальные области видимости встречаются, когда вы определяете функции внутри функций.", + "use_function_to_read_code": false + }, + "Значения аргументов по умолчанию": { + "text": "Зачастую часть параметров функций могут быть необязательными, и для них будут использоваться некоторые заданные значения по умолчанию, если пользователь не укажет собственных. Этого можно достичь с помощью значений аргументов по умолчанию. Их можно указать, добавив к имени параметра в определении функции оператор присваивания (=) с последующим значением.", + "use_function_to_read_code": false + }, + "Ключевые аргументы": { + "text": "Если имеется некоторая функция с большим числом параметров, и при её вызове требуется указать только некоторые из них, значения этих параметров могут задаваться по их имени – это называется ключевые параметры. В этом случае для передачи аргументов функции используется имя (ключ) вместо позиции (как было до сих пор).\n\nЕсть два преимущества такого подхода: во-первых, использование функции становится легче, поскольку нет необходимости отслеживать порядок аргументов; во-вторых, можно задавать значения только некоторым избранным аргументам, при условии, что остальные параметры имеют значения аргумента по умолчанию.", + "use_function_to_read_code": false + }, + "Переменное число параметров": { + "text": "Иногда бывает нужно определить функцию, способную принимать любое число параметров. Этого можно достичь при помощи звёздочек", + "use_function_to_read_code": false + }, + "Оператор return": { + "text": "Оператор return используется для возврата из функции, т.е. для прекращения её работы и выхода из неё. При этом можно также вернуть некоторое значение из функции.", + "use_function_to_read_code": false + } + }, + + "Урок 7: Модули": { + "Предисловие": { + "text": "Как можно использовать код повторно, помещая его в функции, мы уже видели. А что, если нам понадобится повторно использовать различные функции в других наших программах? Как вы уже, наверное, догадались, ответ – модули.\n\nСуществуют разные способы составления модулей, но самый простой – это создать файл с расширением .py, содержащий функции и переменные.\n\nДругой способ – написать модуль на том языке программирования, на котором написан сам интерпретатор Python. Например, можно писать модули на языке программирования C, которые после компиляции могут использоваться стандартным интерпретатором Python\n\nСперва посмотрим, как использовать модули стандартной библиотеки.", + "use_function_to_read_code": false + }, + "Пример": { + "text": "Представим, что мы хотим создать пакет под названием «world» с субпакетами «asia», «africa» и т.д., которые, в свою очередь, будут содержать модули «india», «madagascar» и т.д.\n\nДля этого следовало бы создать следующую структуру каталогов:\n\n| - <некоторый каталог из sys.path>/\n| |---- world/\n| |---- init.py\n| |---- asia/\n| | |---- init.py\n| | |---- india/\n| | |---- init.py\n| | |---- foo.py\n| |---- africa/\n| |---- init.py\n| |---- madagascar/\n| |---- init.py\n| |---- bar.py", + "use_function_to_read_code": false + }, + "Как это работает": { + "text": "Мы вызываем функцию dir, не передавая ей параметров. По умолчанию, она возвращает список атрибутов текущего модуля. Обратите внимание, что список импортированных модулей также входит туда.\n\nЧтобы пронаблюдать за действием dir, мы определяем новую переменную a и присваиваем ей значение, а затем снова вызываем dir. Видим, что в полученном списке появилось дополнительное значение. Удалим переменную/атрибут из текущего модуля при помощи оператора del, и изменения вновь отобразятся на выводе функции dir.\n\nЗамечание по поводу del: этот оператор используется для удаления переменной/имени, и после его выполнения, в данном случае – del a, к переменной a больше невозможно обратиться – её как будто никогда и не было.", + "use_function_to_read_code": false + }, + "Файлы байткода .pyc": { + "text": "Импорт модуля – относительно дорогостоящее мероприятие, поэтому Python предпринимает некоторые трюки для ускорения этого процесса. Один из способов – создать байткомпилированные файлы (или байткод) с расширением .pyc, которые являются некой промежуточной формой, в которую Python переводит программу (помните раздел «Введение» о том, как работает Python?). Такой файл .pyc полезен при импорте модуля в следующий раз в другую программу – это произойдёт намного быстрее, поскольку значительная часть обработки, требуемой при импорте модуля, будет уже проделана. Этот байткод также является платформо-независимым.", + "use_function_to_read_code": false + }, + "Оператор from... import...": { + "text": "Чтобы импортировать переменную argv прямо в программу и не писать всякий раз sys. При обращении к ней, можно воспользоваться выражением «from sys import argv».\n\nДля импорта всех имён, использующихся в модуле sys, можно выполнить команду «from sys import *». Это работает для любых модулей.\n\nВ общем случае вам следует избегать использования этого оператора и использовать вместо этого оператор import, чтобы предотвратить конфликты имён и не затруднять чтение программы.", + "use_function_to_read_code": false + }, + "Создание собственных модулей": { + "text": "Создать собственный модуль очень легко. Да вы всё время делали это! Ведь каждая программа на Python также является и модулем. Необходимо лишь убедиться, что у неё установлено расширение .py.", + "use_function_to_read_code": false + }, + "Функция dir": { + "text": "Встроенная функция dir() возвращает список имён, определяемых объектом. Например, для модуля в этот список входят функции, классы и переменные, определённые в этом модуле.\n\nЭта функция может принимать аргументы. Если в качестве аргумента указано имя модуля, она возвращает список имён, определённых в этом модуле. Если никакого аргумента не передавать, она вернёт список имён, определённых в текущем модуле.", + "use_function_to_read_code": false + }, + "Пакеты": { + "text": "К настоящему времени вы, вероятно, начали наблюдать некоторую иерархию в организации ваших программ. Переменные обычно находятся в функциях. Функции и глобальные переменные обычно находятся в модулях. А что, если возникнет необходимость как-то организовать модули? Вот здесь-то и выходят на сцену пакеты.\n\nПакеты – это просто каталоги с модулями и специальным файлом init.py, который показывает Python, что этот каталог особый, так как содержит модули Python.\n\nПредставим, что мы хотим создать пакет под названием «world» с субпакетами «asia», «africa» и т.д., которые, в свою очередь, будут содержать модули «india», «madagascar» и т.д.", + "use_function_to_read_code": false + } + }, + + "Урок 8: Структуры данных": { + "Структуры данных": { + "text": "Структуры данных – это, по сути, и есть структуры, которые могут хранить некоторые данные вместе. Другими словами, они используются для хранения связанных данных.\n\nВ Python существуют четыре встроенных структуры данных: список, кортеж, словарь и множество. Посмотрим, как ими пользоваться, и как они могут облегчить нам жизнь.", + "use_function_to_read_code": false + }, + "Список": { + "text": "Список – это структура данных, которая содержит упорядоченный набор элементов, т.е. хранит последовательность элементов. Это легко представить, если вспомнить список покупок, в котором перечисляется, что нужно купить, с тем лишь исключением, что в списке покупок каждый элемент обычно размещается на отдельной строке, тогда как в Python они разделяются запятыми.\n\nСписок элементов должен быть заключён в квадратные скобки, чтобы Python понял, что это список. Как только список создан, можно добавлять, удалять или искать элементы в нём. Поскольку элементы можно добавлять и удалять, мы говорим, что список – это изменяемый тип данных, т.е. его можно модифицировать.", + "use_function_to_read_code": false + }, + "Краткое введение в объекты и классы": { + "text": "Список – это один из примеров использования объектов и классов. Когда мы назначаем некоторой переменной i значение, скажем, целое число 5, это можно представить себе как создание объекта (т.е. экземпляра) i класса (т.е. типа) int. Чтобы лучше понять это, прочитайте help(int).\n\nКласс может также иметь методы, т.е. функции, определённые для использования только применительно к данному классу. Этот функционал будет доступен только когда имеется объект данного класса. Например, Python предоставляет метод append для класса list, который позволяет добавлять элемент к концу списка. Так mylist.append('and item') добавит эту строку к списку mylist. Обратите внимание на обозначение точкой для доступа к методам объектов.", + "use_function_to_read_code": false + }, + "Пример": { + "text": "m = [\"obj1\", \"obj2\", \"obj3\"]\nprint (m[0])", + "use_function_to_read_code": true + }, + "Как это работает": { + "text": "Мы создаём словарь ab. Затем мы обращаемся к парам ключ-значение. Как видите, синтаксис прост.\n\nУдалять пары ключ-значение можно при помощи оператора del. Мы указываем имя словаря и оператор индексирования для удаляемого ключа, после чего передаём это оператору del.\n\nДалее мы обращаемся ко всем парам ключ-значение нашего словаря, используя метод items, который возвращает список кортежей, каждый из которых содержит пару элементов: ключ и значение. Мы получаем эту пару и присваиваем её значение переменным name и address соответственно в цикле for..in, а затем выводим эти значения на экран в блоке for.", + "use_function_to_read_code": false + }, + "Кортеж": { + "text": "Кортежи служат для хранения нескольких объектов вместе. Их можно рассматривать как аналог списков, но без такой обширной функциональности, которую предоставляет класс списка. Одна из важнейших особенностей кортежей заключается в том, что они неизменяемы, так же, как и строки. Т.е. модифицировать кортежи невозможно.\n\nКортежи обозначаются указанием элементов, разделённых запятыми; по желанию их можно ещё заключить в круглые скобки.\n\nКортежи обычно используются в тех случаях, когда оператор или пользовательская функция должны наверняка знать, что набор значений, т.е. кортеж значений, не изменится.", + "use_function_to_read_code": false + }, + "Словарь": { + "text": "Словарь – это некий аналог адресной книги, в которой можно найти адрес или контактную информацию о человеке, зная лишь его имя; т.е. некоторые ключи связаны со значениями.\n\nПары ключ-значение указываются в словаре следующим образом: «d = {key1 : value1, key2 : value2 }». Обратите внимание, что ключ и значение разделяются двоеточием, а пары друг от друга отделяются запятыми, а затем всё это заключается в фигурные скобки.", + "use_function_to_read_code": false + }, + "Последовательности": { + "text": "Списки, кортежи и строки являются примерами последовательностей. Но что такое последовательности и что в них такого особенного?\n\nОсновные возможности – это проверка принадлежности (т.е. выражения «in» и «not in») и оператор индексирования, позволяющий получить напрямую некоторый элемент последовательности.\n\nВсе три типа последовательностей, упоминавшиеся выше (списки, кортежи и строки), также предоставляют операцию получения вырезки, которая позволяет получить вырезку последовательности, т.е. её фрагмент.", + "use_function_to_read_code": false + } + }, + + "Урок 9: Исключения": { + "Предисловие": { + "text": "Исключения возникают тогда, когда в программе возникает некоторая исключительная ситуация. Например, к чему приведёт попытка чтения несуществующего файла? Или если файл был случайно удалён, пока программа работала? Такие ситуации обрабатываются при помощи исключений.\n\nЭто касается и программ, содержащих недействительные команды. В этом случае Python поднимает руки и сообщает, что обнаружил ошибку.", + "use_function_to_read_code": false + }, + "Ошибки": { + "text": "Рассмотрим простой вызов функции print. Что, если мы ошибочно напишем print как Print? Обратите внимание на заглавную букву. В этом случае Python поднимает синтаксическую ошибку.", + "use_function_to_read_code": false + }, + "Пример": { + "text": "with open(\"poem.txt\") as f:\n for line in f:\n print(line, end='')", + "use_function_to_read_code": true + }, + "Исключения": { + "text": "Попытаемся считать что-либо от пользователя. Нажмите Сtrl-D (или Ctrl+Z в Windows) и посмотрите, что произойдёт.", + "use_function_to_read_code": false + }, + "Обработка исключений": { + "text": "Обрабатывать исключения можно при помощи оператора try..except. При этом все обычные команды помещаются внутрь try-блока, а все обработчики исключений – в except-блок.", + "use_function_to_read_code": false + }, + "Как это работает": { + "text": "Существует некий протокол, используемый оператором with. Он считывает объект, возвращаемый операторомopen.Назовём его в данном случае «thefile».\n\nПеред запуском блока кода, содержащегося в нём, оператор with всегда вызывает функцию thefile.enter, а также всегда вызывает thefile.exit после завершения выполнения этого блока кода.\n\nТак что код, который мы бы написали в блоке finally, будет автоматически обработан методом exit. Это избавляет нас от необходимости повторно в явном виде указывать операторы try..finally.", + "use_function_to_read_code": false + }, + "Вызов исключения": { + "text": "Исключение можно поднять при помощи оператора raise, передав ему имя ошибки/исключения, а также объект исключения, который нужно выбросить.\n\nВызываемая ошибка или исключение должна быть классом, который прямо или непрямо является производным от класса Exception.", + "use_function_to_read_code": false + }, + "Try .. Finally": { + "text": "Представим, что в программе происходит чтение файла и необходимо убедиться, что объект файла был корректно закрыт и что не возникло никакого исключения. Этого можно достичь с применением блока finally.", + "use_function_to_read_code": false + }, + "Оператор with": { + "text": "Типичной схемой является запрос некоторого ресурса в блоке try с последующим освобождением этого ресурса в блоке finally. Для того, чтобы сделать это более «чисто»,существует оператор with:", + "use_function_to_read_code": false + } + }, + + "Урок 10: Дополнительно": { + "Предисловие": { + "text": "К настоящему моменту мы уже рассмотрели большую часть того, что вам придётся использовать при работе с Python. В этой главе мы охватим некоторые дополнительные аспекты, которые помогут отшлифовать ваши знания.", + "use_function_to_read_code": false + }, + "Self": { + "text": "Методы класса имеют одно отличие от обычных функций: они должны иметь дополнительно имя, добавляемое к началу списка параметров. Однако, при вызове метода никакого значения этому параметру присваивать не нужно – его укажет Python. Эта переменная указывает на сам объект экземпляра класса, и по традиции она называется self.\n\nХотя этому параметру можно дать любое имя, настоятельно рекомендуется использовать только имя self; использование любого другого имени не приветствуется. Есть много достоинств использования стандартного имени: во-первых, любой человек, просматривающий вашу программу, легко узнает его; во-вторых, некоторые специализированные Интегрированные среды разработки (IDE) изначально рассчитаны на использование self.", + "use_function_to_read_code": false + }, + "Классы": { + "text": "Классы предоставляют средства объединения данных и функциональности вместе. Создание нового класса создает объект нового типа, позволяя создавать новые экземпляры этого типа. К каждому экземпляру класса могут быть прикреплены атрибуты для поддержания его состояния. Экземпляры класса также могут иметь методы (определенные его классом) для изменения его состояния.", + "use_function_to_read_code": false + }, + "Пример": { + "text": "i = []\ni.append('объект')\ni.append('новый объект')", + "use_function_to_read_code": true + }, + "Как это работает": { + "text": "В этом примере мы создали новый список и добавили к нему \"объект\" и \"новый объект\". Суть такой простой программы - показать, что переменные на самом деле не переменные, а экземпляры классов. Это звучит странно, но, например, в языке Си++ переменные, массивы, словари и кортежи не имеют никаких встроенных методов. То есть вот так вот просто \"добавить\" новый элемент к массиву в Си++ и других языках нельзя. А в Python можно! В этом и заключается один из элементов \"силы\" языка!", + "use_function_to_read_code": false + }, + "Методы объектов": { + "text": "Итак, мы выяснили что классы/объекты могут иметь методы, представляющие собой функции, за исключением дополнительной переменной self. А теперь давайте рассмотрим пример", + "use_function_to_read_code": false + }, + "Блоки в одно выражение": { + "text": "Мы неоднократно говорили, что каждый блок команд отделяется от других своим собственным уровнем отступа. Однако, существует и исключение. Если блок команд содержит только одно выражение, его можно указывать в одной строке с условным оператором или, скажем, оператором цикла. Рассмотрим это на примере:", + "use_function_to_read_code": false + }, + "Lambda-функции": { + "text": "Ключевое слово lambda используется для создания функций и возврата их значения во время выполнения программы. lambda принимает параметр, за которым следует одно выражение, которое становится телом функции, а значение этого выражения возвращается новой функцией.", + "use_function_to_read_code": false + }, + "Генераторы списков": { + "text": "Генераторы списков служат для создания новых списков на основе существующих. Представьте, что имеется список чисел, на основе которого требуется получить новый список, состоящий из всех чисел, умноженных на 2, но только при условии, что само число больше 2. Генераторы списков подходят для таких задач как нельзя лучше.", + "use_function_to_read_code": false + }, + "Передача кортежей и словарей в функции": { + "text": "Для получения параметров, переданных функции, в виде кортежа или словаря, существуют специальные приставки «*» или «**» соответственно. Это особенно полезно в случаях, когда функция может принимать переменное число параметров.", + "use_function_to_read_code": false + }, + "exec и eval": { + "text": "Функция exec служит для выполнения команд Python, содержащихся в строке или файле, в отличие от самого текста программы. Например, во время выполнения программы можно сформировать строку, содержащую текст программы на Python, и запустить его при помощи exec:", + "use_function_to_read_code": false + }, + "Оператор assert": { + "text": "Оператор assert существует для того, чтобы указать, что нечто является истиной. Например, если требуется гарантировать, что в списке будет хотя бы один элемент, и вызвать ошибку, если это не так, то оператор assert идеально подойдёт для такой задачи. Когда заявленное выражение ложно, вызывается ошибка AssertionError. Метод pop() возвращает последний элемент списка, одновременно удаляя его оттуда.", + "use_function_to_read_code": false + }, + "Функция repr": { + "text": "Функция repr используется для получения канонического строкового представления объекта. Любопытно, что в большинстве случаев eval(repr(object)) == object.", + "use_function_to_read_code": false + }, + "Установка библиотек": { + "text": "В Каталоге пакетов Python существует колоссальное количество открытых библиотек, которые вы можете использовать в своих программах. Для их установки можно воспользоваться pip.", + "use_function_to_read_code": false + }, + "Графические программы": { + "text": "Для создания собственной графической программы на Python понадобится какая-нибудь библиотека ГИП (графического интерфейса пользователя) со своими привязками к Python. Привязки позволяют писать программу на Python, используя библиотеки, которые сами по себе написаны на C, C++ или других языках.", + "use_function_to_read_code": false + }, + "Kivy": { + "text": "https://kivy.org", + "use_function_to_read_code": false + }, + "PyGTK": { + "text": "Это привязки Python к инструментарию GTK+, на основе которого построен GNOME. У GTK+ есть много своих особенностей, но как только вы освоитесь, вы сможете создавать ГИП очень быстро. Что касается дизайнера графического интерфейса Glade, то он просто незаменим. Документация же всё ещё требует некоторых улучшений. GTK+ хорошо работает в GNU/Linux, но его порт на Windows пока не закончен. При помощи GTK+ можно создавать как свободные, так и проприетарные программы. Для начала прочитайте Учебник по PyGTK.", + "use_function_to_read_code": false + }, + "PyQt": { + "text": "Это привязки Python к инструментарию Qt, на основе которого построена KDE. Qt чрезвычайно прост в использовании, особенно благодаря Qt Designer и изумительной документации Qt. PyQt бесплатно, если используется для создания свободных программ (с лицензией GPL). Для создания закрытых проприетарных программ вам придётся его купить. Начиная с Qt 4.5, разрешается создавать при помощи него не только GPL’ные программы.", + "use_function_to_read_code": false + }, + "wxPython": { + "text": "Это привязки Python к инструментарию wxWidgets. wxPython не так прост в освоении, но зато он переносим и работает на GNU/Linux, Windows, Mac и даже на встраиваемых платформах. Многие среды разработки для wxPython, такие как SPE (Stani’s Python Editor) и wxGlade включают дизайнеры графического интерфейса. При помощи wxPython можно создавать как свободные, так и проприетарные программы.", + "use_function_to_read_code": false + } + } } \ No newline at end of file diff --git a/main4.py b/main4.py index 0ddd797..fe76af5 100644 --- a/main4.py +++ b/main4.py @@ -5,61 +5,12 @@ from quest_getter import QuestGetter from lesson_getter import LessonGetter from task_getter import TaskGetter +from consultant import * from buttons import Buttons from enums import * -from consultant import ArtificialIntelligence + from typing import Literal -def code_to_speech(code: str) -> str: - """Переводит код в слова и выводит готовый текст в пронумерованном столбце.""" - REPLACEMENTS: dict = _get_replacements ( ) - - PAUSE = "sil<[250]>" - lines = code.split("\n") - formatted_lines = [ ] - for i, line in enumerate(lines, start=1): - formatted_line = line - for key in REPLACEMENTS.keys(): - formatted_line = formatted_line.replace(key, REPLACEMENTS[key]) - formatted_line = formatted_line.split("#")[0] - formatted_lines.append(f"{PAUSE} код {PAUSE} {formatted_line}") - return "\n".join(formatted_lines) + PAUSE - -def _get_replacements ( ) -> dict: - """Возвращает словарь с заменами символов на слова.""" - return { - ")": " скобка ", - "(": " скобка ", - "*": " звёздочка ", - "'": " кавычки ", - '"': " кавычки ", - "{": " фигурная скобка ", - "}": " фигурная скобка ", - ":": " двоеточие ", - "!": " восклицательный знак ", - ".": " точка ", - ",": " запятая ", - "[": " квадратная скобка ", - "]": " квадратная скобка ", - "||": " or ", - ">": " больше ", - "<": " меньше ", - "/": " разделить ", - "-": " минус ", - "+": " плюс ", - "%": " процент ", - "@": " собачка ", - "&": " and " - } - - -def tts_format(text): - c = text.split("`") - i = 1 - while i None: """ # Абсолютно новый пользователь if self._INTERSESSIONAL_DATA["new_user"]: - self._OUTPUT_TEXT = get_text_for_new_user ( ) - self._TEXT_TO_SPEECH = get_introduction_sound ( ) + get_text_for_new_user ( ) + "\n" - self._TEXT_TO_SPEECH += get_main_commands_of_skill ( ) + text_for_new_user = get_text_for_new_user ( ) + self._CARD = make_big_hello_picture ("Приветствую вас в навыке \"Учим Python\"!", text_for_new_user) + self._TEXT_TO_SPEECH = get_introduction_sound ( ) + "Приветствую вас в навыке \"Учим Python\"!" + text_for_new_user + "\n" self._INTERSESSIONAL_DATA["new_user"] = False self._BUTTONS.add_buttons_of_main_menu_in_text ( ) # Пользователь в главном меню впервые elif self._user_is_in_main_menu and self._IS_FIRST_MESSAGE: user_greeting = get_user_greeting ( ) - self._OUTPUT_TEXT = user_greeting + self._CARD = make_big_hello_picture (user_greeting) self._TEXT_TO_SPEECH = get_introduction_sound ( ) + user_greeting - self._TEXT_TO_SPEECH += get_main_commands_of_skill ( ) self._BUTTONS.add_buttons_of_main_menu_in_text ( ) # Пользователь просто в главном меню @@ -136,10 +87,10 @@ def _working_with_user_in_main_menu (self) -> None: if self._has_all_words_in_text_in_lower ("сбрось", "настройки") or \ self._has_all_words_in_text_in_lower ("сбросить", "настройки"): self._INTERSESSIONAL_DATA["new_user"] = True - self._INTERSESSIONAL_DATA["last_lesson"] = 0 - self._INTERSESSIONAL_DATA["last_task"] = 0 + self._INTERSESSIONAL_DATA["current_lesson"] = "" + self._INTERSESSIONAL_DATA["current_sublesson"] = "" self._OUTPUT_TEXT = "Настройки сброшены.\n" - self._OUTPUT_TEXT = "Перезагрузите навык." + self._OUTPUT_TEXT += "Перезагрузите навык." elif self._has_one_word_in_text_in_lower ( "курс", "курса", "курсу", "курсом", "курсе"): @@ -149,11 +100,7 @@ def _working_with_user_in_main_menu (self) -> None: self._OUTPUT_TEXT += "можете продолжить последнюю или переслушать текущую." self._BUTTONS.add_buttons (*self._commands_of_course, hide_all = False) self._BUTTONS.add_buttons ("Повтори", hide_all = True) - elif self._has_one_word_in_text_in_lower( - "консультант", "консультанту", "консультанта", "консультанты", "консультанте", "консультация", "консультацию", "консультации", "консультацией", "консультантом" - ): - self._SESSIONAL_DATA["state"] = "consulting" - self._OUTPUT_TEXT = "Я готова подобрать вам справку по теме вашей проблемы. С чем вам помочь?\n" + elif self._has_one_word_in_text_in_lower ( "задачка", "задачки", "задачку", "задачке", "задачкой", "задача", "задачи", "задачу", "задаче", "задачей", @@ -164,7 +111,7 @@ def _working_with_user_in_main_menu (self) -> None: self._TEXT_TO_SPEECH = self._OUTPUT_TEXT self._TEXT_TO_SPEECH += ", ".join (self._difficulty_levels) self._BUTTONS.add_buttons (*self._difficulty_levels, hide_all = False) - self._BUTTONS.add_buttons ("На главное меню", "Повтори", "Пока", hide_all = True) + self._BUTTONS.add_buttons ("На главное меню", "Повтори", "Помощь", "Пока", hide_all = True) elif self._has_one_word_in_text_in_lower ( "квест", "квеста", "квесту", "квестом", "квесте", @@ -174,23 +121,39 @@ def _working_with_user_in_main_menu (self) -> None: self._TEXT_TO_SPEECH = self._OUTPUT_TEXT self._TEXT_TO_SPEECH += ", ".join (self._difficulty_levels) self._BUTTONS.add_buttons (*self._difficulty_levels, hide_all = False) - self._BUTTONS.add_buttons ("Узнать мои результаты", "Повтори", "На главное меню", "Пока", hide_all = True) + self._BUTTONS.add_buttons ("Узнать мои результаты", "Повтори", "Помощь", "На главное меню", "Пока", hide_all = True) elif self._has_one_word_in_text_in_lower ( "пожаловаться", "жалоба", "жалобу", "отчёт", "отчет"): self._SESSIONAL_DATA["state"] = "sending_report" - self._OUTPUT_TEXT = "Я не знаю, на какую почту отправлять жалобу...\n" - self._OUTPUT_TEXT += "Может, на главное меню?" + self._OUTPUT_TEXT = "Чтобы отправить отчёт разработчикам навыка, просто скажите его. Я вас внимательно слушаю." self._BUTTONS.add_buttons ("На главное меню", "Повтори", "Пока!", hide_all = True) + elif self._has_one_word_in_text_in_lower ( + "консультант", "консультанта", "консультанту", "консультантом", "консультанте" + "консультация", "консультации", "консультацию", "консультацией", "проконсультируй"): + self._SESSIONAL_DATA["state"] = "consulting" + self._OUTPUT_TEXT = "Давайте, я побуду вашим персональным консультантом по Python.\n" + self._OUTPUT_TEXT += "Просто скажите интересующий вас вопрос в паре словах. Я внимательно вас слушаю." + self._BUTTONS.add_buttons ("На главное меню", "Повтори", "Помощь", "Пока!", hide_all = True) + elif self._user_needs_help: - self._OUTPUT_TEXT = "Сейчас я вам помогу. В главном меню есть следующие команды: " - self._TEXT_TO_SPEECH = self._OUTPUT_TEXT + get_main_commands_of_skill ( ) + self._OUTPUT_TEXT = get_soothing_text ( ) + "\n" + self._OUTPUT_TEXT += "Это главное меню навыка.\n" + self._OUTPUT_TEXT += "Если вы хотите изучить Python, то скажите: \"Курс\".\n" + self._OUTPUT_TEXT += "Если хотите проверить свои теоретические знания Python, то скажите: \"Квест\".\n" + self._OUTPUT_TEXT += "А чтобы проверить практические знания, просто скажите: \"Задачки\".\n" + self._OUTPUT_TEXT += "Проговорив \"Отправить отчёт\", вы сможете отправить письмо разработчикам навыка.\n" + self._OUTPUT_TEXT += "И сказав \"Консультант\", вы сможете получить ответ на заданный вопрос.\n" + self._OUTPUT_TEXT += "Если вам что-то не понятно, то моя команда \"Помощь\" к вашим услугам.\n" self._BUTTONS.add_buttons_of_main_menu_in_text ( ) elif self._user_wants_to_go_to_main_menu: self._OUTPUT_TEXT = "Вы уже на главном меню!" + elif self._user_wants_to_know_what_skill_can_do: + self._say_what_skill_can_do ( ) + elif self._user_wants_to_hear_last_phrase: self._say_last_phrase ( ) @@ -210,14 +173,14 @@ def _difficulty_levels (self) -> tuple[str, str, str, str]: @property def _user_wants_to_hear_last_phrase (self) -> bool: - if self._has_one_word_in_text_in_lower ("повтори", "повторить", "что", "чего"): + if self._has_one_word_in_text_in_lower ("повтори", "повторить", "что", "чего", "заново", "переслушать"): return True else: return False @property def _user_needs_help (self) -> bool: - if self._has_one_word_in_text_in_lower ("помощь", "помоги", "забыл", "забыла", "команды"): + if self._has_one_word_in_text_in_lower ("помощь", "помощи", "помоги", "забыл", "забыла", "команды"): return True else: return False @@ -228,6 +191,17 @@ def _say_last_phrase (self) -> None: self._BUTTONS.BUTTONS = self._SESSIONAL_DATA["last_buttons"] self._CARD = self._SESSIONAL_DATA["last_card"] + @property + def _user_wants_to_know_what_skill_can_do (self) -> bool: + if self._has_all_words_in_text_in_lower ("что", "умеешь"): + return True + else: + return False + + def _say_what_skill_can_do (self) -> None: + self._OUTPUT_TEXT = get_text_that_says_what_skill_can_do ( ) + self._BUTTONS.BUTTONS = self._SESSIONAL_DATA["last_buttons"] + @save_last_phrase def _working_with_user_outside_main_menu (self) -> None: @@ -238,6 +212,8 @@ def _working_with_user_outside_main_menu (self) -> None: self._choosing_course_theme ( ) case "start_next_lesson_or_not": self._start_next_lesson_or_not ( ) + case "start_next_sublesson_or_not": + self._start_next_sublesson_or_not ( ) case "working_with_tasks": self._working_with_tasks ( ) case "working_with_quest": @@ -252,83 +228,112 @@ def _working_with_user_outside_main_menu (self) -> None: self._choosing_between_solve_and_code() case "_wish_to_see_solve": self._wish_to_see_solve() - case "_wish_to_see_solve": - self._wish_to_see_solve() + case "_wish_to_see_code": + self._wish_to_see_code() case "consulting": self._consulting ( ) + # Меню Курса def _working_with_course (self) -> None: - lesson_getter = LessonGetter ( ) current_lesson_theme = self._INTERSESSIONAL_DATA["current_lesson"] - current_lesson_subtheme = self._INTERSESSIONAL_DATA["current_sublesson"] + current_sublesson_theme = self._INTERSESSIONAL_DATA["current_sublesson"] + lesson_getter = LessonGetter (current_lesson_theme, current_sublesson_theme) if self._has_one_word_in_text_in_lower ("список", "списка", "списку", "списком", "списке") or \ self._has_one_word_in_text_in_lower ("списки", "списка", "спискам", "списками", "списках"): self._SESSIONAL_DATA["state"] = "choosing_course_theme" self._OUTPUT_TEXT = "Список тем уроков:" self._TEXT_TO_SPEECH = self._OUTPUT_TEXT - for lesson_theme in lesson_getter.themes: + for lesson_theme in lesson_getter.lesson_themes: self._BUTTONS.add_buttons (lesson_theme, hide_all = False) self._TEXT_TO_SPEECH += lesson_theme + "\n" - self._BUTTONS.add_buttons ("Назад", "Повтори", "На главное меню", "Выход", hide_all = True) + self._BUTTONS.add_buttons ("Назад", "Повтори", "Помощь", "На главное меню", "Выход", hide_all = True) elif self._has_one_word_in_text_in_lower ("продолжить", "дальше", "далее"): - if current_lesson_theme: - next_subtheme = lesson_getter.get_name_of_next_subtheme (theme = current_lesson_theme, - subtheme = current_lesson_subtheme) - else: - next_subtheme = None - - if next_subtheme: - text = lesson_getter.get_subtheme_text (theme = current_lesson_theme, - subtheme = next_subtheme) - self._INTERSESSIONAL_DATA["current_sublesson"] = next_subtheme - self._OUTPUT_TEXT = text - self._BUTTONS.add_buttons ("Продолжить", "Переслушать", "Список тем", - "На главное меню", "Пока", hide_all = True) - self._TEXT_TO_SPEECH = tts_format(text) - elif not next_subtheme and current_lesson_subtheme: - self._TEXT_TO_SPEECH = get_random_sound_of_looking_results ( ) - self._CARD = make_big_level_up_picture (title = "Поздравляю! Вы прошли целый урок.", description = "Следующий - это " + lesson_getter.get_name_of_next_theme (current_lesson_theme) + ".\n" + "Хотите продолжить?") - self._TEXT_TO_SPEECH += "Поздравляю! Вы прошли целый урок.\n" - self._TEXT_TO_SPEECH += "Следующий - это " + lesson_getter.get_name_of_next_theme (current_lesson_theme) + "\n" - self._TEXT_TO_SPEECH += "Хотите продолжить?" - self._OUTPUT_TEXT = self._TEXT_TO_SPEECH + if lesson_getter.current_lesson_theme and lesson_getter.current_sublesson_theme: + lesson_getter.move_to_next_sublesson ( ) + if lesson_getter.current_sublesson_theme: + self._SESSIONAL_DATA["state"] = "start_next_sublesson_or_not" + self._OUTPUT_TEXT = lesson_getter.current_lesson_theme + ".\n" + self._OUTPUT_TEXT += f"{lesson_getter.current_sublesson_theme}.\n\n" + self._TEXT_TO_SPEECH = self._OUTPUT_TEXT + if lesson_getter.use_function_to_read_code: + self._OUTPUT_TEXT += lesson_getter.text_of_current_sublesson + self._TEXT_TO_SPEECH += code_to_speech (lesson_getter.text_of_current_sublesson) + else: + self._OUTPUT_TEXT += lesson_getter.text_of_current_sublesson + self._TEXT_TO_SPEECH += lesson_getter.text_of_current_sublesson + resume_text = get_resume_text ( ) + self._OUTPUT_TEXT += "\n\n" + resume_text + self._TEXT_TO_SPEECH += "\n\n" + resume_text + self._BUTTONS.add_buttons ("Дальше", "На главное меню", "Пока", hide_all = True) + self._INTERSESSIONAL_DATA["current_lesson"] = lesson_getter.current_lesson_theme + self._INTERSESSIONAL_DATA["current_sublesson"] = lesson_getter.current_sublesson_theme + elif not lesson_getter.current_sublesson_theme: # Пользователь прошёл все подуроки урока + self._SESSIONAL_DATA["state"] = "start_next_lesson_or_not" + lesson_getter.move_to_next_lesson ( ) + lesson_has_been_competed = get_random_lesson_completion ( ) + sequel_of_lesson = get_random_sequel_of_lesson ( ) + self._TEXT_TO_SPEECH = get_random_sound_of_looking_results ( ) + self._CARD = make_big_level_up_picture (lesson_has_been_competed, + f"Следующий: {lesson_getter.current_lesson_theme}. " + sequel_of_lesson) + self._TEXT_TO_SPEECH += lesson_has_been_competed + "\n" + self._TEXT_TO_SPEECH += f"Следующий: {lesson_getter.current_lesson_theme}. " + sequel_of_lesson + self._BUTTONS.add_buttons ("Да!", "Нет, позже.", hide_all = False) + self._BUTTONS.add_buttons ("На главное меню", "Пока", hide_all = True) + elif not lesson_getter.current_sublesson_theme: # Пользователь прошёл все подуроки урока self._SESSIONAL_DATA["state"] = "start_next_lesson_or_not" - self._BUTTONS.add_buttons ("Да, хочу!", "Нет, позже.", hide_all = False) + lesson_getter.move_to_next_lesson ( ) + lesson_has_been_competed = get_random_lesson_completion ( ) + sequel_of_lesson = get_random_sequel_of_lesson ( ) + self._TEXT_TO_SPEECH = get_random_sound_of_looking_results ( ) + self._CARD = make_big_level_up_picture (lesson_has_been_competed, + f"Следующий: {lesson_getter.current_lesson_theme}. " + sequel_of_lesson) + self._TEXT_TO_SPEECH += lesson_has_been_competed + "\n" + self._TEXT_TO_SPEECH += f"Следующий: {lesson_getter.current_lesson_theme}. " + sequel_of_lesson + self._BUTTONS.add_buttons ("Да!", "Нет, позже.", hide_all = False) self._BUTTONS.add_buttons ("На главное меню", "Пока", hide_all = True) - else: - self._user_has_not_listened_to_any_lesson ( ) - elif self._has_all_words_in_text_in_lower ("переслушать"): - if current_lesson_theme: - self._OUTPUT_TEXT = lesson_getter.get_subtheme_text (theme = current_lesson_theme, - subtheme = current_lesson_subtheme) - self._OUTPUT_TEXT += "\nСкажите: \"Продолжить\", чтобы продолжить." - self._BUTTONS.add_buttons ("Продолжить", "Переслушать", "Список тем", "Текущая тема", - "На главное меню", "Пока", hide_all = True) - else: - self._user_has_not_listened_to_any_lesson ( ) - - elif self._has_one_word_in_text_in_lower ("текущая", "текущую"): - if current_lesson_theme: - self._OUTPUT_TEXT = "Текущая тема урока: " + current_lesson_theme + ".\n" - self._OUTPUT_TEXT += "Подтема: " + current_lesson_subtheme + ".\n" - self._OUTPUT_TEXT += "Скажите, если хотите переслушать или продолжить." - self._BUTTONS.add_buttons ("Продолжить", "Переслушать", "На главное меню", "Пока", hide_all = True) - else: - self._user_has_not_listened_to_any_lesson ( ) + self._SESSIONAL_DATA["state"] = "start_next_sublesson_or_not" + self._OUTPUT_TEXT = lesson_getter.current_lesson_theme + ".\n" + self._OUTPUT_TEXT += f"{lesson_getter.current_sublesson_theme}.\n\n" + self._OUTPUT_TEXT += lesson_getter.text_of_current_sublesson + self._OUTPUT_TEXT += "\nПерейти к следующему уроку?." + self._BUTTONS.add_buttons ("Да", "Нет", "Переслушать", + "На главное меню", "Пока", hide_all = True) + + elif self._has_one_word_in_text_in_lower ("текущая", "текущую", "текущий", "текущем", "текущим"): + self._OUTPUT_TEXT = "Текущая тема урока: " + lesson_getter.current_lesson_theme + ".\n" + self._OUTPUT_TEXT += "Подтема: " + lesson_getter.current_sublesson_theme + ".\n\n" + self._OUTPUT_TEXT += "Скажите, если хотите переслушать или продолжить." + self._BUTTONS.add_buttons ("Продолжить", "Переслушать", "Список тем", "На главное меню", "Пока", hide_all = True) + + elif self._has_one_word_in_text_in_lower ("курс", "курса", "курсу", "курсом", "курсе"): + self._OUTPUT_TEXT = "Вы уже в меню Курса.\nЕсли вам нужна помощь, то скажите: \"Помощь\"." + self._BUTTONS.add_buttons (*self._commands_of_course, hide_all = True) elif self._user_needs_help: - self._OUTPUT_TEXT = "Не волнуйтесь! В меню курса есть команды: " - self._TEXT_TO_SPEECH = self._OUTPUT_TEXT + ", ".join (self._commands_of_course) + "." + self._OUTPUT_TEXT = get_soothing_text ( ) + "\n" + self._OUTPUT_TEXT += "Это меню Курса.\n" + self._OUTPUT_TEXT += "Здесь вы прослушиваете уроки по Python.\n" + self._OUTPUT_TEXT += "Чтобы увидеть их список, скажите: \"Покажи список уроков\".\n" + self._OUTPUT_TEXT += "Там вы сможете выбрать один из них.\n" + self._OUTPUT_TEXT += "Конечно же, лучше начинать с самого первого урока; но если вы уже знакомы с Python, то вы вправе пропустить несколько тем.\n" + self._OUTPUT_TEXT += "Также здесь вы можете узнать последний прослушанный урок, сказав: \"Покажи текущий урок\".\n" + self._OUTPUT_TEXT += "Можете прослушать его заново, сказав: \"Переслушать последний урок\",\n" + self._OUTPUT_TEXT += "или перейти сразу к следующему, проговорив: \"Покажи следующий урок\".\n" + self._OUTPUT_TEXT += "Вот и всё, что может меню Курса.\n" + self._OUTPUT_TEXT += "Начинайте изучать Python прямо сейчас!" self._BUTTONS.add_buttons (*self._commands_of_course, hide_all = False) elif self._user_wants_to_go_to_main_menu: self._go_to_main_menu ( ) + elif self._user_wants_to_know_what_skill_can_do: + self._say_what_skill_can_do ( ) + elif self._user_wants_to_hear_last_phrase: self._say_last_phrase ( ) @@ -354,112 +359,43 @@ def _user_wants_to_end_session (self) -> bool: return False - def _choosing_between_solve_and_code(self) -> None: - entering = ["Ха! Сдаётесь?", "Сдаётесь?", "Ну что, у вас получилось?", "Что скажете?", "Уже?"] - a = random.choice(entering) - if self._has_one_word_in_text_in_lower ("решение", "решению", "реши", "решил", "ответ", "решай", "отвечай", "решении", "ответе"): - self._OUTPUT_TEXT = a + "\nИтак, решение: " + self._SESSIONAL_DATA["solve_of_task"] + "\nХотите услышать код решения на Python?" - self._SESSIONAL_DATA["state"] = "_wish_to_see_solve" - self._BUTTONS.add_buttons ("Да", "На главное меню", "Пока", hide_all = True) - - elif self._has_one_word_in_text_in_lower ("код", "коды", "кода", "скрипт", "скрипты", "скрипта", "скрипте", "коде"): - self._OUTPUT_TEXT = a + "\nИтак, код: " + self._SESSIONAL_DATA["code_of_task"] + "\nХотите услышать объяснение?" - self._TEXT_TO_SPEECH = a + "Итак код. " + code_to_speech(self._SESSIONAL_DATA["code_of_task"]) + ".Хотите услышать объяснение?" - self._SESSIONAL_DATA["state"] = "_wish_to_see_solve" - self._BUTTONS.add_buttons ("Да", "На главное меню", "Пока", hide_all = True) - - elif self._user_wants_to_go_to_main_menu: - self._go_to_main_menu ( ) - - elif self._user_wants_to_hear_last_phrase: - self._say_last_phrase ( ) - - elif self._user_wants_to_end_session: - self._end_the_session ( ) - - else: - self._OUTPUT_TEXT = get_apology_text ( ) - - - def _wish_to_see_solve(self): - if self._has_one_word_in_text_in_lower ("да", "ага", "давай", "поехали", "ес", "погнали", "говори", "гони"): - self._OUTPUT_TEXT = "Итак, код: " + self._SESSIONAL_DATA["code_of_task"] + "\nХотите ещё задачу? Тогда просто назовите желаемую сложность." - self._TEXT_TO_SPEECH = "итак код. " + code_to_speech(self._SESSIONAL_DATA["code_of_task"]) + ".хотите ещё задачу? Тогда просто назовите желаемую сложность." - self._SESSIONAL_DATA["state"] = "working_with_tasks" - self._BUTTONS.add_buttons ("Лёгкий", "Средний", "Высокий", "Очень высокий", "Рандом", hide_all = False) - self._BUTTONS.add_buttons ("Повторить", "На главное меню", "Пока", hide_all = True) - - elif self._user_wants_to_go_to_main_menu: - self._go_to_main_menu ( ) - - elif self._user_wants_to_hear_last_phrase: - self._say_last_phrase ( ) - - elif self._user_wants_to_end_session: - self._end_the_session ( ) - - else: - self._OUTPUT_TEXT = get_apology_text ( ) - - - def _wish_to_see_solve(self): - if self._has_one_word_in_text_in_lower ("да", "ага", "давай", "поехали", "ес", "погнали", "говори", "гони"): - self._OUTPUT_TEXT = "Итак, решение: " + self._SESSIONAL_DATA["solve_of_task"] + "\nХотите ещё задачу? Тогда просто назовите желаемую сложность." - self._SESSIONAL_DATA["state"] = "working_with_tasks" - self._BUTTONS.add_buttons ("Лёгкий", "Средний", "Высокий", "Очень высокий", "Рандом", hide_all = False) - self._BUTTONS.add_buttons ("Повторить", "На главное меню", "Пока", hide_all = True) - - elif self._user_wants_to_go_to_main_menu: - self._go_to_main_menu ( ) - - elif self._user_wants_to_hear_last_phrase: - self._say_last_phrase ( ) - - elif self._user_wants_to_end_session: - self._end_the_session ( ) - - else: - self._OUTPUT_TEXT = get_apology_text ( ) - - def _user_has_not_listened_to_any_lesson (self) -> None: - self._OUTPUT_TEXT = "Вы ещё не прошли ни одного урока.\n" - self._OUTPUT_TEXT += "Скажите: \"Покажи список тем\", чтобы начать изучать курс." + self._OUTPUT_TEXT = "Вы прошли весь курс!" self._BUTTONS.add_buttons ("Покажи список тем", "Повтори", "На главное меню", "Выход", hide_all = True) def _choosing_course_theme (self) -> None: if self._has_one_word_in_text_in_lower ("1", "введение"): - self._start_next_lesson_and_sublesson (1) + self._start_next_lesson_and_sublesson ("Урок 1: Введение в Python") elif self._has_one_word_in_text_in_lower ("2", "устанока"): - self._start_next_lesson_and_sublesson (2) + self._start_next_lesson_and_sublesson ("Урок 2: Установка Python") elif self._has_one_word_in_text_in_lower ("3", "основы"): - self._start_next_lesson_and_sublesson (3) + self._start_next_lesson_and_sublesson ("Урок 3: Основы") elif self._has_one_word_in_text_in_lower ("4", "операторы", "выражения"): - self._start_next_lesson_and_sublesson (4) + self._start_next_lesson_and_sublesson ("Урок 4: Операторы и выражения") - elif self._has_one_word_in_text_in_lower ("5"): - self._start_next_lesson_and_sublesson (5) + elif self._has_one_word_in_text_in_lower ("5", "поток", "команд"): + self._start_next_lesson_and_sublesson ("Урок 5: Поток команд") - elif self._has_one_word_in_text_in_lower ("6"): - self._start_next_lesson_and_sublesson (6) + elif self._has_one_word_in_text_in_lower ("6", "функции"): + self._start_next_lesson_and_sublesson ("Урок 6: Функции") - elif self._has_one_word_in_text_in_lower ("7"): - self._start_next_lesson_and_sublesson (7) + elif self._has_one_word_in_text_in_lower ("7", "модули"): + self._start_next_lesson_and_sublesson ("Урок 7: Модули") - elif self._has_one_word_in_text_in_lower ("8"): - self._start_next_lesson_and_sublesson (8) + elif self._has_one_word_in_text_in_lower ("8", "структуры"): + self._start_next_lesson_and_sublesson ("Урок 8: Структуры данных") - elif self._has_one_word_in_text_in_lower ("9"): - self._start_next_lesson_and_sublesson (9) + elif self._has_one_word_in_text_in_lower ("9", "исключения"): + self._start_next_lesson_and_sublesson ("Урок 9: Исключения") - elif self._has_one_word_in_text_in_lower ("10"): - self._start_next_lesson_and_sublesson (10) + elif self._has_one_word_in_text_in_lower ("10", "дополнительно"): + self._start_next_lesson_and_sublesson ("Урок 10: Дополнительно") - elif self._has_one_word_in_text_in_lower ("назад", "обратно"): + elif self._has_one_word_in_text_in_lower ("назад", "обратно", "вернись", "вернуться", "курс"): self._SESSIONAL_DATA["state"] = "working_with_course" self._OUTPUT_TEXT = "Вы находитесь в меню Курса.\n" self._OUTPUT_TEXT += "Здесь вы можете посмотреть список тем и выбрать любую,\n" @@ -467,9 +403,31 @@ def _choosing_course_theme (self) -> None: self._BUTTONS.add_buttons (*self._commands_of_course, hide_all = False) self._BUTTONS.add_buttons ("Покажи список тем", "Повтори", "На главное меню", "Выход", hide_all = True) + elif self._has_one_word_in_text_in_lower ("список", "списка", "списку", "списком", "списке") or \ + self._has_one_word_in_text_in_lower ("списки", "списка", "спискам", "списками", "списках"): + current_lesson_theme = self._INTERSESSIONAL_DATA["current_lesson"] + current_sublesson_theme = self._INTERSESSIONAL_DATA["current_sublesson"] + lesson_getter = LessonGetter (current_lesson_theme, current_sublesson_theme) + self._OUTPUT_TEXT = "Список тем уроков:" + self._TEXT_TO_SPEECH = self._OUTPUT_TEXT + for lesson_theme in lesson_getter.lesson_themes: + self._BUTTONS.add_buttons (lesson_theme, hide_all = False) + self._TEXT_TO_SPEECH += lesson_theme + "\n" + self._BUTTONS.add_buttons ("Назад", "Повтори", "Помощь", "На главное меню", "Выход", hide_all = True) + elif self._user_wants_to_go_to_main_menu: self._go_to_main_menu ( ) + elif self._user_wants_to_know_what_skill_can_do: + self._say_what_skill_can_do ( ) + + elif self._user_needs_help: + self._OUTPUT_TEXT = get_soothing_text ( ) + "\n" + self._OUTPUT_TEXT += "Здесь вы должны просто выбрать тему урока, который хотите изучить.\n" + self._OUTPUT_TEXT += "Чтобы ещё раз увидеть список уроков, скажите: \"Покажи список тем уроков\".\n" + self._OUTPUT_TEXT += "Также вы можете перейти обратно, сказав: \"Вернись назад\".\n" + self._BUTTONS.add_buttons ("Покажи список тем уроков", "Вернись назад", "На главное меню", "Пока", hide_all = True) + elif self._user_wants_to_hear_last_phrase: self._say_last_phrase ( ) @@ -479,33 +437,131 @@ def _choosing_course_theme (self) -> None: else: self._OUTPUT_TEXT = get_apology_text ( ) - def _start_next_lesson_and_sublesson (self, theme_number: Literal[1, 2, 3, 4, 5]) -> None: - lesson_getter = LessonGetter ( ) - theme_number = theme_number - 1 # Первый урок под номером 0, а не 1 + def _start_next_lesson_and_sublesson (self, theme: str) -> None: + lesson_getter = LessonGetter ("", "") + lesson_getter.move_to_lesson (theme) + self._SESSIONAL_DATA["state"] = "working_with_course" - self._INTERSESSIONAL_DATA["current_lesson"] = (name_of_current_theme := lesson_getter.themes[theme_number]) # Морожовый, он самый) - self._INTERSESSIONAL_DATA["current_sublesson"] = (name_of_current_subtheme := lesson_getter.get_first_subtheme_name (name_of_current_theme)) self._OUTPUT_TEXT = random.choice (("Хорошо, ", "Отлично, ", "Прекрасно, ")) + "тогда начнём?" + "\n\n" self._OUTPUT_TEXT += "Предисловие первого занятия:\n" - self._OUTPUT_TEXT += lesson_getter.get_subtheme_text (theme = name_of_current_theme, - subtheme = name_of_current_subtheme) - self._TEXT_TO_SPEECH = self._OUTPUT_TEXT + self._OUTPUT_TEXT += lesson_getter.text_of_current_sublesson + # Тут не нужна проверка на особое произношение кода, так как первый подурок - это всегда просто текст + self._INTERSESSIONAL_DATA["current_lesson"] = lesson_getter.current_lesson_theme + self._INTERSESSIONAL_DATA["current_sublesson"] = lesson_getter.current_sublesson_theme self._BUTTONS.add_buttons ("Далее", "Переслушать", "На главное меню", "Пока", hide_all = True) def _start_next_lesson_or_not (self) -> None: - old_lesson_theme = self._INTERSESSIONAL_DATA["current_lesson"] - lesson_getter = LessonGetter ( ) - next_lesson_theme = lesson_getter.get_name_of_next_theme (old_lesson_theme) - first_lesson_subtheme = lesson_getter.get_first_subtheme_name (next_lesson_theme) - self._INTERSESSIONAL_DATA["current_lesson"] = next_lesson_theme - self._INTERSESSIONAL_DATA["current_sublesson"] = first_lesson_subtheme - - if self._has_one_word_in_text_in_lower ("да", "конечно", "дальше", "далее"): + current_lesson_theme = self._INTERSESSIONAL_DATA["current_lesson"] + current_sublesson_theme = self._INTERSESSIONAL_DATA["current_sublesson"] + lesson_getter = LessonGetter (current_lesson_theme, current_sublesson_theme) + + if self._has_one_word_in_text_in_lower ("да", "давай", "хочу", "конечно", "дальше", "далее", "продолжить", "продолжи", "продолжай", "вперёд", "вперед"): + self._SESSIONAL_DATA["state"] = "start_next_sublesson_or_not" + lesson_getter.move_to_next_lesson ( ) + if lesson_getter.current_lesson_theme: + #self._OUTPUT_TEXT = lesson_getter.current_lesson_theme + ".\n\n" + self._TEXT_TO_SPEECH = self._OUTPUT_TEXT + if lesson_getter.use_function_to_read_code: + self._OUTPUT_TEXT += lesson_getter.text_of_current_sublesson + "\n\n" + self._OUTPUT_TEXT += get_resume_text ( ) + self._TEXT_TO_SPEECH = self._OUTPUT_TEXT + self._TEXT_TO_SPEECH += code_to_speech (lesson_getter.text_of_current_sublesson) + else: + self._OUTPUT_TEXT += lesson_getter.text_of_current_sublesson + self._OUTPUT_TEXT += "\n\n" + get_resume_text ( ) + self._TEXT_TO_SPEECH = self._OUTPUT_TEXT + self._INTERSESSIONAL_DATA["current_lesson"] = lesson_getter.current_lesson_theme + self._INTERSESSIONAL_DATA["current_sublesson"] = lesson_getter.current_sublesson_theme + self._BUTTONS.add_buttons ("Да", "Нет", "Переслушать", "На главное меню", "Пока", hide_all = True) + else: # Больше уроков не осталось + self._SESSIONAL_DATA["state"] = "in_main_menu" + course_has_beem_completed = get_random_course_completion ( ) + self._CARD = make_big_level_up_picture (course_has_beem_completed, + "Вы находитесь на главном меню.") + self._TEXT_TO_SPEECH = get_random_sound_of_looking_results ( ) + self._TEXT_TO_SPEECH += course_has_beem_completed + "\n" + self._TEXT_TO_SPEECH += "Вы находитесь на главном меню." + self._BUTTONS.add_buttons (*get_main_commands_of_skill_as_list ( ), hide_all = True) + + elif self._has_one_word_in_text_in_lower ("не", "нет", "позже", "потом"): self._SESSIONAL_DATA["state"] = "working_with_course" - self._OUTPUT_TEXT = lesson_getter.get_subtheme_text (theme = next_lesson_theme, - subtheme = first_lesson_subtheme) - self._BUTTONS.add_buttons ("Далее", "Переслушать", "На главное меню", "Пока", hide_all = True) + self._OUTPUT_TEXT = "Как хотите. В любой момент просто скажите: \"Продолжить последний урок\"." + self._BUTTONS.add_buttons (*self._commands_of_course, hide_all = False) + + elif self._user_wants_to_go_to_main_menu: + self._go_to_main_menu ( ) + + elif self._user_wants_to_know_what_skill_can_do: + self._say_what_skill_can_do ( ) + + elif self._user_wants_to_hear_last_phrase: + self._say_last_phrase ( ) + + elif self._user_wants_to_end_session: + self._end_the_session ( ) + + else: + self._OUTPUT_TEXT = get_apology_text ( ) + self._BUTTONS.add_buttons ("Да", "Нет", hide_all = True) + + + def _start_next_sublesson_or_not (self) -> None: + current_lesson_theme = self._INTERSESSIONAL_DATA["current_lesson"] + current_sublesson_theme = self._INTERSESSIONAL_DATA["current_sublesson"] + lesson_getter = LessonGetter (current_lesson_theme, current_sublesson_theme) + + if self._has_one_word_in_text_in_lower ("да", "давай", "хочу", "конечно", "дальше", "далее", "продолжить", "продолжи", "продолжай", "вперёд", "вперед"): + if lesson_getter.current_sublesson_theme: + lesson_getter.move_to_next_sublesson ( ) + if lesson_getter.current_sublesson_theme: + self._OUTPUT_TEXT = f"{lesson_getter.current_sublesson_theme}.\n\n" + self._TEXT_TO_SPEECH = self._OUTPUT_TEXT + if lesson_getter.use_function_to_read_code: + self._OUTPUT_TEXT += lesson_getter.text_of_current_sublesson + "\n\n" + self._TEXT_TO_SPEECH += code_to_speech (lesson_getter.text_of_current_sublesson) + "\n\n" + resume_text = get_resume_text ( ) + self._TEXT_TO_SPEECH += resume_text + self._OUTPUT_TEXT += resume_text + else: + self._OUTPUT_TEXT += lesson_getter.text_of_current_sublesson + "\n\n" + self._OUTPUT_TEXT += get_resume_text ( ) + self._TEXT_TO_SPEECH = self._OUTPUT_TEXT + self._INTERSESSIONAL_DATA["current_lesson"] = lesson_getter.current_lesson_theme + self._INTERSESSIONAL_DATA["current_sublesson"] = lesson_getter.current_sublesson_theme + self._BUTTONS.add_buttons ("Да", "Нет", "Переслушать", "На главное меню", "Пока", hide_all = True) + elif not lesson_getter.current_lesson_theme: + self._SESSIONAL_DATA["state"] = "in_main_menu" + course_has_beem_completed = get_random_course_completion ( ) + self._CARD = make_big_level_up_picture (course_has_beem_completed, + "Вы находитесь на главном меню.") + self._TEXT_TO_SPEECH = get_random_sound_of_looking_results ( ) + self._TEXT_TO_SPEECH += course_has_beem_completed + "\n" + self._TEXT_TO_SPEECH += "Вы находитесь на главном меню." + self._BUTTONS.add_buttons (*get_main_commands_of_skill_as_list ( ), hide_all = True) + elif not lesson_getter.current_sublesson_theme: # Значит, все подуроки кончились + self._SESSIONAL_DATA["state"] = "start_next_lesson_or_not" + lesson_getter.move_to_next_lesson ( ) + if lesson_getter.current_lesson_theme: + self._SESSIONAL_DATA["state"] = "start_next_lesson_or_not" + lesson_has_been_competed = get_random_lesson_completion ( ) + sequel_of_lesson = get_random_sequel_of_lesson ( ) + self._TEXT_TO_SPEECH = get_random_sound_of_looking_results ( ) + self._CARD = make_big_level_up_picture (lesson_has_been_competed, + f"Следующий: {lesson_getter.current_lesson_theme}. " + sequel_of_lesson) + self._TEXT_TO_SPEECH += lesson_has_been_competed + "\n" + self._TEXT_TO_SPEECH += f"Следующий: {lesson_getter.current_lesson_theme}. " + sequel_of_lesson + self._BUTTONS.add_buttons ("Да!", "Нет, позже.", hide_all = False) + self._BUTTONS.add_buttons ("На главное меню", "Пока", hide_all = True) + else: + self._SESSIOёNAL_DATA["state"] = "in_main_menu" + course_has_beem_completed = get_random_course_completion ( ) + self._CARD = make_big_level_up_picture (course_has_beem_completed, + "Вы находитесь на главном меню.") + self._TEXT_TO_SPEECH = get_random_sound_of_looking_results ( ) + self._TEXT_TO_SPEECH += course_has_beem_completed + "\n" + self._TEXT_TO_SPEECH += "Вы находитесь на главном меню." + self._BUTTONS.add_buttons (*get_main_commands_of_skill_as_list ( ), hide_all = True) elif self._has_one_word_in_text_in_lower ("не", "нет", "позже", "потом"): self._SESSIONAL_DATA["state"] = "working_with_course" @@ -515,6 +571,9 @@ def _start_next_lesson_or_not (self) -> None: elif self._user_wants_to_go_to_main_menu: self._go_to_main_menu ( ) + elif self._user_wants_to_know_what_skill_can_do: + self._say_what_skill_can_do ( ) + elif self._user_wants_to_hear_last_phrase: self._say_last_phrase ( ) @@ -523,7 +582,7 @@ def _start_next_lesson_or_not (self) -> None: else: self._OUTPUT_TEXT = get_apology_text ( ) - self._BUTTONS.add_buttons ("Да, хочу!", "Нет, позже.", hide_all = True) + self._BUTTONS.add_buttons ("Да!", "Нет, позже.", hide_all = True) def _working_with_tasks (self) -> None: @@ -535,7 +594,7 @@ def _working_with_tasks (self) -> None: self._save_text_and_solve_of_easy_task_in_session_data() a = ['Хорошо', 'Итак', "Отлично", "Так-с", "Ага", "Замечательно", "Супер"] self._OUTPUT_TEXT = random.choice(a)+", давайте приступим. Задача называется \""+self._SESSIONAL_DATA["title_of_task"]+"\".\nЧитаю условие: \""+self._SESSIONAL_DATA["text_of_task"]+"\"\nПопробуйте решить сами.\nЕсли захотите услышать решение или код, просто скажите мне \"Решение\" или \"Код\"." - self._BUTTONS.add_buttons ("Устное решение", "Код", "Повтори", "На главное меню", "Пока", hide_all = True) + self._BUTTONS.add_buttons ("Устное решение", "Код", "Повтори", "Помощь", "На главное меню", "Пока", hide_all = True) elif self._has_one_word_in_text_in_lower ( @@ -546,7 +605,7 @@ def _working_with_tasks (self) -> None: self._save_text_and_solve_of_medium_task_in_session_data() a = ['Хорошо', 'Итак', "Отлично", "Так-с", "Ага", "Замечательно", "Супер"] self._OUTPUT_TEXT = random.choice(a)+", давайте приступим. Задача называется \""+self._SESSIONAL_DATA["title_of_task"]+"\".\nЧитаю условие: \""+self._SESSIONAL_DATA["text_of_task"]+"\"\nПопробуйте решить сами.\nЕсли захотите услышать решение или код, просто скажите мне \"Решение\" или \"Код\"." - self._BUTTONS.add_buttons ("Устное решение", "Код", "Повтори", "На главное меню", "Пока", hide_all = True) + self._BUTTONS.add_buttons ("Устное решение", "Код", "Повтори", "Помощь", "На главное меню", "Пока", hide_all = True) elif self._has_one_word_in_text_in_lower ( @@ -557,7 +616,7 @@ def _working_with_tasks (self) -> None: self._save_text_and_solve_of_hard_task_in_session_data() a = ['Хорошо', 'Итак', "Отлично", "Так-с", "Ага", "Замечательно", "Супер"] self._OUTPUT_TEXT = random.choice(a)+", давайте приступим. Задача называется \""+self._SESSIONAL_DATA["title_of_task"]+"\".\nЧитаю условие: \""+self._SESSIONAL_DATA["text_of_task"]+"\"\nПопробуйте решить сами.\nЕсли захотите услышать решение или код, просто скажите мне \"Решение\" или \"Код\"." - self._BUTTONS.add_buttons ("Устное решение", "Код", "Повтори", "На главное меню", "Пока", hide_all = True) + self._BUTTONS.add_buttons ("Устное решение", "Код", "Повтори", "Помощь", "На главное меню", "Пока", hide_all = True) elif self._has_one_word_in_text_in_lower ( @@ -571,15 +630,19 @@ def _working_with_tasks (self) -> None: self._save_text_and_solve_of_random_task_in_session_data() a = ['Хорошо', 'Итак', "Отлично", "Так-с", "Ага", "Замечательно", "Супер"] self._OUTPUT_TEXT = random.choice(a)+", давайте приступим. Задача называется \""+self._SESSIONAL_DATA["title_of_task"]+"\".\nЧитаю условие: \""+self._SESSIONAL_DATA["text_of_task"]+"\"\nПопробуйте решить сами.\nЕсли захотите услышать решение или код, просто скажите мне \"Решение\" или \"Код\"." - self._BUTTONS.add_buttons ("Устное решение", "Код", "Повтори", "На главное меню", "Пока", hide_all = True) + self._BUTTONS.add_buttons ("Устное решение", "Код", "Повтори", "Помощь", "На главное меню", "Пока", hide_all = True) elif self._user_wants_to_go_to_main_menu: self._go_to_main_menu ( ) + elif self._user_wants_to_know_what_skill_can_do: + self._say_what_skill_can_do ( ) + elif self._user_needs_help: - self._OUTPUT_TEXT = "Всё будет хорошо! Здесь вам нужно всего лишь выбрать уровень сложности: лёгкий, средний или высокий.\n" + self._OUTPUT_TEXT = get_soothing_text ( ) + "\n" + self._OUTPUT_TEXT += "Здесь вам нужно всего лишь выбрать уровень сложности: лёгкий, средний, высокий или случайный.\n" self._OUTPUT_TEXT += "Также вы можете в любой момент переслушать задачу или выйти на главное меню." - self._BUTTONS.add_buttons (*self._difficulty_levels, "На главное меню", hide_all = False) + self._BUTTONS.add_buttons (*self._difficulty_levels, "На главное меню", "Пока", hide_all = False) elif self._user_wants_to_hear_last_phrase: self._say_last_phrase ( ) @@ -599,11 +662,78 @@ def _save_text_and_solve_of_random_task_in_session_data(self): self._SESSIONAL_DATA["solve_of_task"] = task["solve"] self._SESSIONAL_DATA["code_of_task"] = task["code"] - def _choosing_right_answer_for_task (self) -> None: - # FIXME - if self._user_wants_to_go_to_main_menu: + + def _choosing_between_solve_and_code(self) -> None: + entering = ["Ха! Сдаётесь?", "Сдаётесь?", "Ну что, у вас получилось?", "Что скажете?", "Уже?"] + a = random.choice(entering) + if self._has_one_word_in_text_in_lower ("решение", "решению", "реши", "решил", "ответ", "решай", "отвечай", "решении", "ответе"): + self._OUTPUT_TEXT = a + "\nИтак, решение: " + self._SESSIONAL_DATA["solve_of_task"] + "\nХотите услышать код решения на Python?" + self._SESSIONAL_DATA["state"] = "_wish_to_see_solve" + self._BUTTONS.add_buttons ("Да", "На главное меню", "Пока", hide_all = True) + + elif self._has_one_word_in_text_in_lower ("код", "коды", "кода", "скрипт", "скрипты", "скрипта", "скрипте", "коде"): + self._OUTPUT_TEXT = a + "\nИтак, код: " + self._SESSIONAL_DATA["code_of_task"] + "\nХотите услышать объяснение?" + self._TEXT_TO_SPEECH = a + "Итак код. " + code_to_speech(self._SESSIONAL_DATA["code_of_task"]) + ".Хотите услышать объяснение?" + self._SESSIONAL_DATA["state"] = "_wish_to_see_code" + self._BUTTONS.add_buttons ("Да", "На главное меню", "Пока", hide_all = True) + + elif self._user_wants_to_go_to_main_menu: self._go_to_main_menu ( ) + elif self._user_wants_to_know_what_skill_can_do: + self._say_what_skill_can_do ( ) + + elif self._user_needs_help: + self._OUTPUT_TEXT = "Здесь вы должны просто выбрать, какое решение задачки вы хотите увидеть: устное, сказав \"Покажи ответ\", или письменное, сказав \"Покажи код\"." + self._BUTTONS.add_buttons ("Покажи ответ", "Покажи код", "На главное меню", "Пока") + + elif self._user_wants_to_hear_last_phrase: + self._say_last_phrase ( ) + + elif self._user_wants_to_end_session: + self._end_the_session ( ) + + else: + self._OUTPUT_TEXT = get_apology_text ( ) + + + def _wish_to_see_solve(self): + if self._has_one_word_in_text_in_lower ("да", "ага", "давай", "поехали", "ес", "погнали", "говори", "гони"): + self._OUTPUT_TEXT = "Итак, код: " + self._SESSIONAL_DATA["code_of_task"] + "\nХотите ещё задачу? Тогда просто назовите желаемую сложность." + self._TEXT_TO_SPEECH = "итак код. " + code_to_speech(self._SESSIONAL_DATA["code_of_task"]) + ".\nХотите ещё задачу? Тогда просто назовите желаемую сложность." + self._SESSIONAL_DATA["state"] = "working_with_tasks" + self._BUTTONS.add_buttons ("Лёгкий", "Средний", "Высокий", "Очень высокий", "Рандом", hide_all = False) + self._BUTTONS.add_buttons ("Повторить", "На главное меню", "Пока", hide_all = True) + + elif self._user_wants_to_go_to_main_menu: + self._go_to_main_menu ( ) + + elif self._user_wants_to_know_what_skill_can_do: + self._say_what_skill_can_do ( ) + + elif self._user_wants_to_hear_last_phrase: + self._say_last_phrase ( ) + + elif self._user_wants_to_end_session: + self._end_the_session ( ) + + else: + self._OUTPUT_TEXT = get_apology_text ( ) + + + def _wish_to_see_solve(self): + if self._has_one_word_in_text_in_lower ("да", "ага", "давай", "поехали", "ес", "погнали", "говори", "гони"): + self._OUTPUT_TEXT = "Итак, решение: " + self._SESSIONAL_DATA["solve_of_task"] + "\nХотите ещё задачу? Тогда просто назовите желаемую сложность." + self._SESSIONAL_DATA["state"] = "working_with_tasks" + self._BUTTONS.add_buttons ("Лёгкий", "Средний", "Высокий", "Очень высокий", "Рандом", hide_all = False) + self._BUTTONS.add_buttons ("Повторить", "На главное меню", "Пока", hide_all = True) + + elif self._user_wants_to_go_to_main_menu: + self._go_to_main_menu ( ) + + elif self._user_wants_to_know_what_skill_can_do: + self._say_what_skill_can_do ( ) + elif self._user_wants_to_hear_last_phrase: self._say_last_phrase ( ) @@ -612,7 +742,6 @@ def _choosing_right_answer_for_task (self) -> None: else: self._OUTPUT_TEXT = get_apology_text ( ) - self._BUTTONS.add_buttons ("На главное меню", "Пока!", hide_all = True) def _working_with_quest (self) -> None: @@ -652,7 +781,8 @@ def _working_with_quest (self) -> None: self._show_results_of_quest_and_next_quest ( ) elif self._user_needs_help: - self._OUTPUT_TEXT = "Не волнуйтесь! Здесь вы должны всего лишь выбрать уровень сложности: лёгкий, средний, высокий.\n" + self._OUTPUT_TEXT = get_soothing_text ( ) + "\n" + self._OUTPUT_TEXT += "Здесь вы должны всего лишь выбрать уровень сложности: лёгкий, средний, высокий или случайный.\n" self._OUTPUT_TEXT += "Также вы можете узнать свои результаты, сказав: \"Покажи результаты\", или " self._OUTPUT_TEXT += "перейти на главное меню, сказав: \"На главное меню\"." self._BUTTONS.add_buttons (*self._difficulty_levels, "Покажи результаты", "На главное меню", hide_all = False) @@ -660,6 +790,9 @@ def _working_with_quest (self) -> None: elif self._user_wants_to_go_to_main_menu: self._go_to_main_menu ( ) + elif self._user_wants_to_know_what_skill_can_do: + self._say_what_skill_can_do ( ) + elif self._user_wants_to_hear_last_phrase: self._say_last_phrase ( ) @@ -672,7 +805,7 @@ def _working_with_quest (self) -> None: @property def _buttons_for_choosing_difficutly_level (self) -> dict: - return "Лёгкий", "Средний", "Высокий", "Случайный", "Узнать мои результаты", "На главное меню", "Пока!" + return "Лёгкий", "Средний", "Высокий", "Случайный", "Узнать мои результаты", "Помощь", "На главное меню", "Пока!" def _save_text_and_correct_answer_of_easy_quest_in_session_data (self) -> None: quest_getter = QuestGetter ( ) @@ -791,12 +924,22 @@ def _choosing_right_answer_for_quest (self) -> None: self._OUTPUT_TEXT += "Теперь просто скажите нужный уровень сложности." self._BUTTONS.add_buttons (*self._buttons_for_choosing_difficutly_level, hide_all = False) - elif self._has_one_word_in_text_in_lower ("результат", "результаты"): + elif self._has_one_word_in_text_in_lower ("результат", "результаты", "оценка", "оценки"): self._show_results_of_quest_and_next_quest ( ) elif self._user_wants_to_go_to_main_menu: self._go_to_main_menu ( ) + elif self._user_wants_to_know_what_skill_can_do: + self._say_what_skill_can_do ( ) + + elif self._user_needs_help: + self._OUTPUT_TEXT = get_soothing_text ( ) + "\n" + self._OUTPUT_TEXT += "Здесь вы должны просто выбрать вариант ответа на квест: первый, второй или третий.\n" + self._OUTPUT_TEXT += "Также вы можете изменить уровень сложности, проговорив: \"Изменить уровень сложности\";\n" + self._OUTPUT_TEXT += "или узнать свои результаты ответов, сказав: \"Покажи мои результаты\"." + self._BUTTONS.add_buttons (*self._buttons_for_choosing_correct_answer, hide_all = True) + elif self._user_wants_to_hear_last_phrase: self._say_last_phrase ( ) @@ -807,6 +950,7 @@ def _choosing_right_answer_for_quest (self) -> None: self._OUTPUT_TEXT = get_text_that_says_there_is_no_answer_like_that ( ) self._BUTTONS.add_buttons (*self._buttons_for_choosing_correct_answer, hide_all = True) + def _correct_answer_of_quest_is_selected (self) -> None: text_that_says_answer_is_correct = get_text_that_says_answer_is_correct ( ) + "\n\n" self._OUTPUT_TEXT = text_that_says_answer_is_correct @@ -829,17 +973,17 @@ def _show_results_of_quest_and_next_quest (self) -> None: python_knowledge = calculate_python_knowledge (correct_quest_answers, wrong_quest_answers) self._OUTPUT_TEXT += f"Ваше знание Python: {python_knowledge}%." self._SESSIONAL_DATA["state"] = "viewing_quest_results" - self._BUTTONS.add_buttons ("Продолжить квест", "На главное меню", "Пока", hide_all = True) + self._BUTTONS.add_buttons ("Продолжить квест", "На главное меню", "Помощь", "Пока", hide_all = True) elif not correct_quest_answers and wrong_quest_answers: self._OUTPUT_TEXT = "Жаль, но у вас нет ни одного правильного ответа на квест." self._SESSIONAL_DATA["state"] = "viewing_quest_results" - self._BUTTONS.add_buttons ("Продолжить квест", "На главное меню", "Пока", hide_all = True) + self._BUTTONS.add_buttons ("Продолжить квест", "На главное меню", "Помощь", "Пока", hide_all = True) elif correct_quest_answers and not wrong_quest_answers: self._OUTPUT_TEXT = "Все ваши ответы верны! Похоже, вы профессиональный программист!" self._SESSIONAL_DATA["state"] = "viewing_quest_results" - self._BUTTONS.add_buttons ("Продолжить квест", "На главное меню", "Пока", hide_all = True) + self._BUTTONS.add_buttons ("Продолжить квест", "На главное меню", "Помощь", "Пока", hide_all = True) else: self._OUTPUT_TEXT = "Пока вы не ответили ни на один квест.\nСкажите уровень сложности (лёгкий, средний, высокий или случайный), чтобы проверить ваши знания." @@ -857,7 +1001,7 @@ def _wrong_answer_of_quest_is_selected (self) -> None: def _viewing_quest_results (self) -> None: - if self._has_one_word_in_text_in_lower ("продолжить"): + if self._has_one_word_in_text_in_lower ("продолжить", "да", "ага", "давай", "конечно"): self._SESSIONAL_DATA["state"] = "choosing_right_answer_for_quest" current_difficulty_level = self._SESSIONAL_DATA["difficulty_level_of_quest"] self._save_text_and_correct_answer_of_quest_in_session_data (current_difficulty_level) @@ -867,6 +1011,15 @@ def _viewing_quest_results (self) -> None: elif self._user_wants_to_go_to_main_menu: self._go_to_main_menu ( ) + elif self._user_wants_to_know_what_skill_can_do: + self._say_what_skill_can_do ( ) + + elif self._user_needs_help: + self._OUTPUT_TEXT = get_soothing_text ( ) + "\n" + self._OUTPUT_TEXT += "Просто скажите: \"Продолжить квест\", чтобы посмотреть новый квест.\n" + self._OUTPUT_TEXT += "Также отсюда можно перейти на главное меню, если вы устали, проговорив: \"На главное меню\"." + self._BUTTONS.add_buttons ("Продолжить квест", "На главное меню", "Пока", hide_all = True) + elif self._user_wants_to_hear_last_phrase: self._say_last_phrase ( ) @@ -875,11 +1028,10 @@ def _viewing_quest_results (self) -> None: else: self._OUTPUT_TEXT = get_apology_text ( ) - self._BUTTONS.add_buttons ("Продолжить квест", "На главное меню", "Пока", hide_all = True) + self._BUTTONS.add_buttons ("Продолжить квест", "На главное меню", "Помощь", "Пока", hide_all = True) def _sending_report (self) -> None: - # Доработать # FIXME self._BUTTONS.add_buttons ("На главное меню", "Пока!", hide_all = True) if self._user_wants_to_go_to_main_menu: self._go_to_main_menu ( ) @@ -888,15 +1040,43 @@ def _sending_report (self) -> None: elif self._user_wants_to_end_session: self._end_the_session ( ) else: - self._OUTPUT_TEXT = get_apology_text ( ) + self._OUTPUT_TEXT = "Отчёт разработчикам отправлен!\nВы на главном меню." + self._SESSIONAL_DATA["state"] = "in_main_menu" + self._BUTTONS.add_buttons_of_main_menu_in_text ( ) def _consulting (self) -> None: - ai = ArtificialIntelligence("lessons.json") - self._BUTTONS.add_buttons ("На главное меню", "Пока!", hide_all = True) - a = ["Хм...", "Ага...", "Итак,", "Хорошо,", "Смотрите,"] - self._OUTPUT_TEXT = random.choice(a)+" я нашла что-то, что может вам помочь, послушайте: " + ai.get_similarity(" ".join(self._WORDS_OF_TEXT_IN_LOWER)) + "\nКуда теперь?" - self._SESSIONAL_DATA['state'] = "in_main_menu" + # Доработать # FIXME + self._BUTTONS.add_buttons ("На главное меню", "Пока!", "Помощь", hide_all = True) + if self._user_wants_to_go_to_main_menu: + self._go_to_main_menu ( ) + + elif self._user_wants_to_know_what_skill_can_do: + self._say_what_skill_can_do ( ) + + elif self._user_needs_help: + self._OUTPUT_TEXT = get_soothing_text ( ) + "\n" + self._OUTPUT_TEXT += "Это консультант по Python. Вы говорите, что хотите узнать в паре словах, а я отвечаю на ваш вопрос, если нахожу ответ.\nЯ вас внимательно слушаю." + self._BUTTONS.add_buttons ("На главное меню", "Пока!", "Помощь", hide_all = True) + + elif self._user_wants_to_hear_last_phrase: + self._say_last_phrase ( ) + + elif self._user_wants_to_end_session: + self._end_the_session ( ) + + else: + ai = ArtificialIntelligence(self._name_of_file_with_lessons) + a = ["Хм...", "Ага...", "Итак,", "Хорошо,", "Смотрите,"] + output = ai.get_similarity(" ".join(self._WORDS_OF_TEXT_IN_LOWER)) + if output[1] != 0: + self._OUTPUT_TEXT = random.choice(a)+" я нашла что-то, что может вам помочь, послушайте: " + output[0] + "\n\nЕсли хотите задать ещё вопрос, то просто скажите его." + else: + self._OUTPUT_TEXT = "Извините, я ничего не смогла найти по вашему запросу...\nЗадайте ваш вопрос снова." + + @property + def _name_of_file_with_lessons (self) -> str: + return "lessons.json" def _has_all_words_in_text_in_lower (self, *words) -> bool: @@ -916,8 +1096,6 @@ def _has_one_word_in_text_in_lower (self, *words) -> bool: def _go_to_main_menu (self) -> None: self._OUTPUT_TEXT = get_text_that_says_user_is_just_in_main_menu ( ) - self._TEXT_TO_SPEECH = get_text_that_says_user_is_just_in_main_menu ( ) - self._TEXT_TO_SPEECH += get_main_commands_of_skill ( ) self._SESSIONAL_DATA["state"] = "in_main_menu" self._BUTTONS.add_buttons_of_main_menu_in_text ( ) @@ -927,6 +1105,7 @@ def _end_the_session (self) -> None: self._CARD = make_big_farewell_picture (farewell_text) self._OUTPUT_TEXT = farewell_text # Без этого выдаёт ошибку, что self._OUTPUT_TEXT нет self._TEXT_TO_SPEECH = farewell_text + self._TEXT_TO_SPEECH += get_random_farewell_sound ( ) self._IS_END_SESSION = True diff --git a/texts_for_users.json b/texts_for_users.json index b759b69..5300415 100644 --- a/texts_for_users.json +++ b/texts_for_users.json @@ -1,5 +1,5 @@ { - "for_new_user": "Приветствую вас в навыке \"Учим Python\"! Здесь вы сможете глубже погрузиться в удивительный мир программирования на языке Python. Навык создан для всех желающих познать программирование с нуля. От мала до велика. У нас много разделов: \"Курс\" - для желающих познать всё с азов, \"Квест\" - для тех, кто хочет быстро проверить свои знания, \"Задачки\" - для гуру-олимпиадников и тех, кто только собирается таковым стать. Кроме того, у нас имеется функция \"Консультанта\", который готов помочь вам в решении ошибок в коде.", + "for_new_user": "Здесь вы сможете глубже погрузиться в удивительный мир программирования на языке Python. Навык создан для всех желающих познать программирование с нуля. От мала до велика. У нас много разделов: \"Курс\" - для желающих познать всё с азов, \"Квест\" - для тех, кто хочет быстро проверить свои знания, \"Задачки\" - для гуру-олимпиадников и тех, кто только собирается таковым стать. Кроме того, у нас имеется функция \"Консультанта\", который готов помочь вам в решении ошибок в коде.", "hello_text": [ "Привет!", "Приветик!", @@ -12,8 +12,8 @@ ], "introduction_to_course": "Что ж, вы решили начать изучение языка Python.\nПройдя этот курс вы познакомитесь с основами программирования, научитесь писать простые программы и понимать код!\nЗдесь и дальше просто скажите: \"Далее\".\nЕсли хотите попасть на главное меню скажите: \"На главное меню\".", "if_user_has_forgotten_commands": [ - "Как ваше настроение? Готовы учиться? Просто скажите одну из моиз команд.", - "Как вы? Хотите учиться Python? Просто скажите одну из моиз команд.", + "Как ваше настроение? Готовы учиться? Просто скажите одну из моих команд.", + "Как вы? Хотите учиться Python? Просто скажите одну из моих команд.", "Как насчёт узнать что-нибудь новое? Просто скажите одну из моих команд.", "Как насчёт выучить всё-таки Python? Скажите любую мою команду.", "Почему бы не выучить Python прямо сейчас? Скажите любую мою команду." @@ -24,6 +24,7 @@ "Квест", "Консультант по Python", "Отправить отчёт", + "Что ты умеешь?", "Помощь" ], "you_stopped_at_lesson": [ @@ -99,6 +100,45 @@ ", вы большой молодец!", ", вы просто молодец!" ], + "resume": [ + "Продолжить?", + "Продолжим?", + "Далее?", + "Дальше?", + "Вперёд?" + ], + "user_has_completed_lesson": [ + "Поздравляю, вы прошли урок!", + "Вы прошли целый урок!", + "Супер, вы прошли урок!", + "Вы прошли урок!", + "Урок пройден, поздравляю!", + "Супер, урок пройден!", + "Вы закончили изучение целого урока. Вы большой молодец!", + "Вы завершили изучение урока! Поздравляю!" + ], + "ask_user_if_he_wants_to_take_next_lesson": [ + "Хотите его изучить?", + "Хотите начать его изучать?", + "Хотите его начать?", + "Хотите его прослушать?", + "Как насчёт продолжить?", + "Продолжим?" + ], + "user_has_completed_course": [ + "Поздравляю! Вы прошли Курс!", + "Поздравляю вас! Вы прошли Курс!", + "Ух ты! Вы прошли весь Курс!", + "Вы полностью прошли Курс! Вы супер-молодец!", + "Вы супер-молодец! Вы прошли Курс целиком!", + "Вы супер-молодец! Вы полностью прошли Курс!" + ], + "soothing_text": [ + "Не волнуйтесь!", + "Не беспокойтесь!", + "Я помогу вам!", + "Всё хорошо!" + ], "win_sounds": [ "", "", diff --git a/useful_functions.py b/useful_functions.py index 48839c6..baf0e40 100644 --- a/useful_functions.py +++ b/useful_functions.py @@ -84,18 +84,18 @@ def calculate_python_knowledge (number_of_correct_answers: int, return round (python_knowledge, 1) -def code_to_speech(code: str) -> str: +def code_to_speech (code: str) -> str: """Переводит код в слова и выводит готовый текст в пронумерованном столбце.""" REPLACEMENTS: dict = _get_replacements ( ) - PAUSE = "sil <[250]>" + PAUSE = "sil<[250]>" lines = code.split("\n") formatted_lines = [ ] for i, line in enumerate(lines, start=1): formatted_line = line for key in REPLACEMENTS.keys(): formatted_line = formatted_line.replace(key, REPLACEMENTS[key]) - formatted_lines.append(f"{PAUSE} строка {i} {PAUSE} {formatted_line}") + formatted_lines.append(f"{PAUSE}строка{i}{PAUSE}{formatted_line}") return "\n".join(formatted_lines) + PAUSE def _get_replacements ( ) -> dict: @@ -126,6 +126,14 @@ def _get_replacements ( ) -> dict: } +def make_big_hello_picture (title: str, description: str = "") -> dict: + return { + "type": "BigImage", + "image_id": "1540737/103847d7e3468a494c6c", + "title": title, + "description": description + } + def make_big_win_picture (title: str, description: str = "") -> dict: return { "type": "BigImage", From 440e217d522b8a13c5bc6ceeda0c9f3ed0e1fbc1 Mon Sep 17 00:00:00 2001 From: TchTech <67865526+TchTech@users.noreply.github.com> Date: Wed, 18 Jun 2025 18:35:14 +0300 Subject: [PATCH 28/31] fix for public release --- consultant.py | 30 ++++++++++++------------------ main4.py | 6 +++++- 2 files changed, 17 insertions(+), 19 deletions(-) diff --git a/consultant.py b/consultant.py index 93e5ea9..1ebb3d7 100644 --- a/consultant.py +++ b/consultant.py @@ -1,8 +1,7 @@ from sklearn.feature_extraction.text import TfidfVectorizer from sklearn.metrics.pairwise import cosine_similarity import json -import pymorphy3 -morph = pymorphy3.MorphAnalyzer() + def index_of_max(lst): maxi = 0 @@ -10,30 +9,25 @@ def index_of_max(lst): if lst[i] > lst[maxi]: maxi = i return maxi + + class ArtificialIntelligence: def __init__(self, name_of_file): with open(name_of_file, "r", encoding="utf-8") as f: doc = dict(json.load(f)) self.base = [] - [self.base.extend(i) for i in [list(i.values()) for i in list(doc.values())]] + a = [list(i.values()) for i in list(doc.values())] + print(a) + [self.base.extend(i) for i in a] self.vectorizer = TfidfVectorizer() self.docs_tfidf = self.vectorizer.fit_transform(self.base) + def get_similarity(self, query): - query = self.lemmatize(self.filter_of_query(query)) + query = self.filter_of_query(query) query_tfidf = self.vectorizer.transform([query]) - return self.base[index_of_max(list(cosine_similarity(query_tfidf, self.docs_tfidf).flatten()))] + a = list(cosine_similarity(query_tfidf, self.docs_tfidf).flatten()) + return [self.base[index_of_max(a)], max(a)] + def filter_of_query(self, query): stop_words = ["не", "без", "через", "у", "но", "о", "и", "как", "python", "а", "к", "в", "с", "за", "или", "либо", "же", "ж", "совсем", "ничуть", "отнюдь", "перед", "при", "про", "под", "по", "до", "чуть", "чуть-чуть"] - return " ".join([i for i in query.split(" ") if not i in stop_words]) - def lemmatize(self, text): - words = text.split() # разбиваем текст на слова - res = list() - for word in words: - p = morph.parse(word)[0] - res.append(p.normal_form) - - return " ".join(res) - -# q = input() -# a = ArtificialIntelligence("lessons.json") -# print("Найдено:", a.get_similarity(q)) + return " ".join([i for i in query.split(" ") if not i in stop_words]) \ No newline at end of file diff --git a/main4.py b/main4.py index 0ddd797..844472f 100644 --- a/main4.py +++ b/main4.py @@ -895,7 +895,11 @@ def _consulting (self) -> None: ai = ArtificialIntelligence("lessons.json") self._BUTTONS.add_buttons ("На главное меню", "Пока!", hide_all = True) a = ["Хм...", "Ага...", "Итак,", "Хорошо,", "Смотрите,"] - self._OUTPUT_TEXT = random.choice(a)+" я нашла что-то, что может вам помочь, послушайте: " + ai.get_similarity(" ".join(self._WORDS_OF_TEXT_IN_LOWER)) + "\nКуда теперь?" + outpt = ai.get_similarity(" ".join(self._WORDS_OF_TEXT_IN_LOWER)) + if outpt[1] != 0: + self._OUTPUT_TEXT = random.choice(a)+" я нашла что-то, что может вам помочь, послушайте: " + outpt[0] + "\nКуда теперь?" + else: + self._OUTPUT_TEXT = "Извините, я ничего не смогла найти по вашему запросу.\nКуда теперь?" self._SESSIONAL_DATA['state'] = "in_main_menu" From a9b5f6f9c183a30b03474ddd449d9ae2d128f6b2 Mon Sep 17 00:00:00 2001 From: TchTech <67865526+TchTech@users.noreply.github.com> Date: Wed, 18 Jun 2025 20:01:52 +0300 Subject: [PATCH 29/31] Update README.md --- README.md | 74 +++++++++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 72 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 239e895..5eb2557 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,72 @@ -# edu_skill - Alice Python education skill +# Учим Python: Ваш Голосовой Наставник по Python в Алисе 🐍 + +[![Skill Status: Active](https://img.shields.io/badge/Status-Active-brightgreen)](https://dialogs.yandex.ru/store/skills/9aa2ecba-alisas-test) +[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT) +[![Yandex Dialogs](https://img.shields.io/badge/Platform-Yandex%20Dialogs-blue)](https://dialogs.yandex.ru/) + +**Хотите освоить Python, но нет времени на учебники? "Учим Python" – это навык для Алисы, который превратит изучение Python в увлекательное голосовое приключение!** + +## 🤖 О навыке + +"Учим Python" – это ваш персональный AI-ассистент по изучению Python. Независимо от вашего уровня подготовки, навык поможет вам: + +* **Получить знания:** Узнавайте, как реализовать различные конструкции и концепции в Python, просто задавая вопросы Алисе голосом. +* **Проверить себя:** Отвечайте на вопросы в формате увлекательного квеста и закрепляйте свои знания. +* **Получить консультацию:** Обратитесь к навыку, и он проконсультирует вас по любым вопросам, связанным с Python. +* **Решать задачи:** Тренируйте свои навыки программирования, решая тщательно отобранные задачки. +* **Стать питонистом:** Копите опыт и знания, чтобы стать настоящим мастером Python! + +## ✨ Ключевые возможности + +* **Голосовой интерфейс:** Учитесь Python, используя только свой голос. +* **Интерактивные уроки:** Получайте знания в удобном и интерактивном формате. +* **Квест-викторина:** Проверьте свои знания в Python с помощью увлекательного квеста. +* **Персональные консультации:** Получайте ответы на свои вопросы по Python в режиме реального времени. +* **Практические задачи:** Решайте задачи по программированию и развивайте свои навыки. +* **Поддержка:** Просто скажите "Помощь" или "Что ты умеешь", и Алиса расскажет вам обо всех возможностях навыка. + +## 🗣️ Как начать + +Чтобы начать изучение Python с Алисой: + +1. Активируйте навык, сказав: "Алиса, запусти навык Учим Python". +2. Используйте голосовые команды, чтобы задавать вопросы, проходить квест или решать задачи. +3. Если вам нужна помощь, просто скажите "Помощь" или "Что ты умеешь". + +**Примеры команд:** + +* "Алиса, как создать список в Python?" +* "Алиса, начни квест по Python." +* "Алиса, дай мне задачу по программированию." +* "Алиса, помощь." + +## 🎯 Для кого этот навык + +Этот навык создан для: + +* Начинающих программистов, которые хотят изучить Python с нуля. +* Опытных программистов, которые хотят освежить свои знания Python. +* Всех, кто интересуется IT и хочет попробовать себя в программировании. + +## 💡 Вдохновение + +Мы создали этот навык для самых смышлёных людей, интересующихся IT. В наши дни таких всё больше и больше. Так почему бы тебе не присоединиться к ним? + +Удачи тебе, юный падаван! 🙂 + +## 🔗 Ссылка на навык + +[Учим Python в магазине навыков Алисы](https://dialogs.yandex.ru/store/skills/9aa2ecba-alisas-test) + +## 💻 Технологии + +* Яндекс.Диалоги +* Python (backend логика) + +## 🤝 Вклад + +Мы открыты для предложений и идей! Если у вас есть какие-либо предложения по улучшению навыка, пожалуйста, свяжитесь с нами. + +## 📜 Лицензия + +Этот проект лицензирован по лицензии MIT - смотрите файл [LICENSE](LICENSE) для деталей. From d4fa4df93a085130cb4a9ca550ba9669f5c0b292 Mon Sep 17 00:00:00 2001 From: TchTech <67865526+TchTech@users.noreply.github.com> Date: Wed, 18 Jun 2025 22:42:59 +0300 Subject: [PATCH 30/31] =?UTF-8?q?=D0=BA=D0=B0=D1=80=D1=82=D0=B8=D0=BD?= =?UTF-8?q?=D0=BA=D0=B8=20=D0=B4=D0=BB=D1=8F=20=D1=80=D0=B8=D0=B4=D0=BC?= =?UTF-8?q?=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- images/1.png | Bin 0 -> 115655 bytes images/2.png | Bin 0 -> 209414 bytes images/3.png | Bin 0 -> 139366 bytes 3 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 images/1.png create mode 100644 images/2.png create mode 100644 images/3.png diff --git a/images/1.png b/images/1.png new file mode 100644 index 0000000000000000000000000000000000000000..acec2d0f58fafe2c064d95dfb30a5ff2f5f5774a GIT binary patch literal 115655 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

gKFz!9bP{y&!&CqPJhwj=)Z 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

    Ixs6d^h4uF@Cibse_+wR!CighrV*R| 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

    f`_V<|WJg70La&uUtAJsCSAZz8$<-%}RyR$o1 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≫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 WbCn{xJPRIzXsGI_6e&M^{yzYqR*T>O literal 0 HcmV?d00001 From b255e322a8c2d1ea91af08ed641172773a11f27f Mon Sep 17 00:00:00 2001 From: TchTech <67865526+TchTech@users.noreply.github.com> Date: Wed, 18 Jun 2025 22:45:48 +0300 Subject: [PATCH 31/31] Update README.md --- README.md | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/README.md b/README.md index 5eb2557..9810a99 100644 --- a/README.md +++ b/README.md @@ -63,6 +63,14 @@ * Яндекс.Диалоги * Python (backend логика) +## 🖼 Скриншоты + +

    + ## 🤝 Вклад Мы открыты для предложений и идей! Если у вас есть какие-либо предложения по улучшению навыка, пожалуйста, свяжитесь с нами.