В прошлый раз я описал навык Розалии искать в wikipedia. Этот навык далёк от совершенства. Читайте, переходите "Розалия приобретает навык"
В реализованном навыки из прошлой статьи есть два недостатка:
- Описан поиск только одного термина «Python». А я хочу, чтобы Розалия искала любой термин, какой задам.
- Писать программу в одном файле крайне неудобно. Я в дальнейшем собираюсь добавлять навыки Розалии. И если я буду писать все навыки в одном файле, файл разрастется до таких размеров, что мне будет трудно ориентироваться в коде.
Для устранения сих недостатков, отделю мозг от его способностей. Т.е. Розалия должна прочитать команду и обработать её. В зависимости от команды Розалия запускает навык и в качестве ответа выводит результат. Таким образом, я создам еще один файл «Rozalia. py» - это будет мозг Розалии. Идея аналогична ситуации, когда человеку нужно «подойти и что-то взять с полочки» мозг запускает способность ходить, потом протянуть руку, взять и т.д. Эти способности человек приобретает в ходе развития: способность ходить, говорить, писать. Одним за другим к человеку подключаются те или иные способности. Для Розалии же способность – написанный мной модуль. Например, в файле search_wiki.py я описал способность Розалии искать информацию в Wikipedia.
Как эту схему реализовать на языке Python?
Теперь запишу сказанное на языке логики. Есть некоторая функция, которая принимает различные значения, в зависимости от запроса – функция (запрос) или search_wikipedia(query). Переменная query определяет запрос, который я передаю Розалии. Вот как этот реализовать на языке Python:
Перепишу код в файле search_wiki.py следующим образом:
import wikipedia
query=input()
def search_wikipedia(query):
____wikipedia.set_lang("ru")
____return wikipedia.summary(query, - ____sentences=5)
print (search_wikipedia(query))
Символом "____" я показал клавишу табуляции. Командой query = input (), я говорю Python, что хочу ввести что-то с клавиатуры и то, что введу поместить в переменную query. Слово def определяет функцию с именем search_wikipedia. В фигурных скобках я указываю аргумент функции – переменную query. Знаком двоеточие указываю, что после него начинается описание функции - то что она должна делать. В нашем случае функции выполняет только одно действие - wikipedia.summary(query, sentences=5) - получает пять предложений описания термина query из ресурса wikipedia. А переменная query содержит значение, которое я ввожу с клавиатуры.
Как это работает?
Теперь запущу программу и посмотрю, как это работает.
После запуска программы, я вижу просто мигающий курсор. Программа ждет моего ввода с клавиатуры. Ввожу с клавиатуры -
Что такое Python
И после нажатия на ENTER переменная query принимает значение –
Что такое Python
Затем выполняется команда print (search_wikipedia(«Что такое Python»)) – эта команда выводит на экран результат выполнения функции search_wikipedia с аргументом «Что такое Python». В момент выполнения команды print происходит поиск описания действий функции search_wikipedia. Это описание находится после слова def. def –ключевое слово и Python понимает, что после def идет описание действий функции search_wikipedia. А ДЕЙСТВИЕ этой функции только одно – запрос к ресурсу Wikipedia
wikipedia.summary(«Что такое python», sentences=5).
Слово return перед wikipedia.summary(query, sentences=5) говорит Python присвоить функции search_wikipedia результат выполнения функции wikipedia.summary(query, sentences=5) - запись аналогична записи:
search_wikipedia(query)= wikipedia.summary(query, sentences=5).
Где query принимает значение, введенное мной с клавиатуры.
Начало описание функции и конец
После слова двоеточия идет описание действий функции.
def search_wikipedia(query):
____Описание действий функции
Но как Python понимает, где конец описания действий? Очень просто. Описание действий функции от основной программы разделяется клавишей табуляции (таб. ), а код основной программы написан на одном уровне. Поэтому, если не поставить табуляцию перед командами (символом " ____" я показал, что нажата клавиша табуляции)
wikipedia.set_lang("ru")
return wikipedia.summary(query, sentences=5)
Python не сопоставит их с функцией search_wikipedia. А это значит, что данная функция будет не описана и программа при вызове данной функции выдаст ошибку.
Разогрелись не много…. Погнали дальше…
Истина в вине
Физика в вине - сказал поэт.
Но для начала, Розалии нужно взять бокал вина и истина окроется. Не буду делать Розалию пьющей. Поэтому и изобразил бокал и Розалию отдельно. И мне сейчас предстоит отделить Розалию от ее способностей. В файле search_wiki.py – описан навык Розалии, искать в Wikipedia, а в файле rozalia.py я опишу саму сущность Розалии. Для этого открываю файл search_wiki.py и вырежу строки
query=input()
print (search_wikipedia(query))
Т.е. в файле search_wiki.py я оставляю только способность Розалии искать в Wikipedia, а обработку запросов и вывод результатов переношу в её сущность – в файл Rozalia.py вставляю строки:
query=input()
print (search_wikipedia(query))
Но сущность Розалии пока не знает, что это за функция search_wikipedia(query), ведь она описана в файле search_wiki.py. Поэтому в начале файла сущности Розалии напишу import search_wiki.
Таким образом, я могу писать сколько угодно способностей Розалии и добавлять их к основной сущности.
Диалог с Розалией
Если я запущу программу Rozalia.py увижу мигающий курсор, который ждет моего ввода с клавиатуры. Но если бы не я написал код программы, то откуда бы знал, что он там мигает и чего хочет программа? Поэтому сделаю понятней, изменю строки:
query=input() =>>query(«Вы: »)
print (search_wikipedia(query))=>> print («Rozalia: » + search_wikipedia(query))
Программа работает! Розалия научилась писать и отвечать на вопросы. По мне так, что-то не то с выводом текста: мой запрос сливается с текстом Розалии. О, так было бы круче:
Но эту изюминку и многое другое я добавлю в следующий раз. Погружение в Python продолжается.