verbalistus
@verbalistus

ЯндексПрактикум, почему бот не видит вложенную функцию?

Дано задание:

На серверы приходит множество запросов — от разных пользователей или от других серверов. Измените функцию process_query() (обработчик запроса), чтобы она поддерживала несколько разных запросов, а не только один.
Добавьте аргумент query в функцию process_query(). Этот аргумент будет сообщать, какой именно запрос необходимо обработать.
В начало функции process_query() добавьте проверку значения переменной query:
если значение равно 'Сколько у меня друзей?' — выведите ответ на этот вопрос, как в предыдущем задании;
в противном случае — выведите '<неизвестный запрос>';
Анфиса должна здороваться при любом запросе.
Добавьте вызов process_query('Сколько у меня друзей?') в основное тело программы.
Добавьте ещё один вызов process_query('Как меня зовут?') в основное тело программы.
Подсказка

Используйте сравнение if query == ... для определения запроса.

Начальный код:
FRIENDS = ['Серёга', 'Соня', 'Дима', 'Алина', 'Егор']
friends_count = 0
def print_friends_count(friends_count):
    if friends_count == 1:
        print('У тебя 1 друг')
    elif 2 <= friends_count <= 4:
        print('У тебя ' + str(friends_count) + ' друга')
    elif friends_count >= 5:
        print('У тебя ' + str(friends_count) + ' друзей')

def process_query():
# перенесите в функцию process_query() вот этот код:
    print("Привет, я Анфиса!")
    count = len(FRIENDS)
    print_friends_count(count)


НаШкодил решение:
FRIENDS = ['Серёга', 'Соня', 'Дима', 'Алина', 'Егор']
count = len(FRIENDS)
def process_query(query):
    print('Привет, я Анфиса!')
    if query == 'Сколько у меня друзей?':
        def print_friends_count(count):
            if count == 1:
                print('У тебя',count,'друг')
            elif 2 <= count <= 4:
                print('У тебя',count,'друга')
            elif count >= 5:
                print('У тебя',count,'друзей')
        print_friends_count(count)
    else:
        print('<неизвестный запрос>')
process_query('Сколько у меня друзей?')
process_query('Как меня зовут?')


Результат удовлетворяет вопросам задания:

Привет, я Анфиса!
У тебя 5 друзей
Привет, я Анфиса!
<неизвестный запрос>


Тем не менее бот не принимает ответ, пишет "Функция print_friends_count() не существует. Не удаляйте её."
Не могу понять в чем причина :(

И еще вопрос:
Функция print_friends_count(count) запускается на выполнение командой print_friends_count(count). Если можно, объясните, пожалуйста, почему вызов функции process_query(query) неприемлем в этой программе. Если вызывать ее после оператора ELSE, командой process_query(query), то происходит цикличный вывод на экран, в зависимости от места вызова функции (отступы +/- 4 пробела на следующей строчке после ELSE):

Привет, я Анфиса!
У тебя 5 друзей
Привет, я Анфиса!
У тебя 5 друзей
...


либо

Привет, я Анфиса!
У тебя 5 друзей
Привет, я Анфиса!
неизвестный запрос
Привет, я Анфиса!
неизвестный запрос
...
  • Вопрос задан
  • 5021 просмотр
Пригласить эксперта
Ответы на вопрос 6
trapwalker
@trapwalker Куратор тега Python
Программист, энтузиаст
Функция в питоне - это объект первого рода.
В питоне всё - объекты. И функция и число и строка и список и словарь и класс и экземпляр класса.
У каждого объекта может быть много имён. Рассматривайте имя объекта, как ярлычок, привязанный к чайному пакетику.
print_friends_count(count)
Здесь print_friends_count это имя переменной, а скобочки после него заставляют вызывать объект, доступный пр этому имени как функцию. Вызов происходит с передачей единственного аргумента, который доступен по имени count.

Если в коде на питоне в каком-то выражении (а вызов функции - это выражение; результат вызова - это всегда какое-то значение, например None; да, None - это тоже объект, его возвращает функция по умолчанию) встречается какое-то имя, то это имя ищется в локальной области видимости этой функции (то есть в самой функции), потом в той области видимости, где объявлена функция, потом еще выше и так далее до самого модуля. Самая верхняя - глобальная область видимости - это модуль. Если имя не нашлось нигде, даже в модуле, то оно поищется среди __builtins__ - это такой словарик с именами и объектами, доступными везде. Если не найдётся и там, то будет ошибка.
В вашем случае функцию следовало оставить на уровне модуля. Вызвать ее можно будет где угодно внутри модуля, но при условии, что оператор объявления функции уже выполнен.

При запуске программы (или импорте модуля) по очереди выполняются все операторы (импорты, объявления функций/классов, присвоение имен результатам каких-то выражений...)

Мне кажется вам стоит скачать книжку Лутца про изучение питона с нуля и вдумчиво прочитать. По порядку.
Ответ написан
@SODINNER
Советую тебе обращаться не в тостер, а именно в Яндекс Практикум, я там проходил вводный курс, поддержка помогает даже без оплаты основного курса и уверяю, они помогут тебе лучше чем люди на тостере.
Ответ написан
@SvetlanaOmsk
Здравствуйте, удалось найти решение? Мой код такой, но проблема у меня в другом. Бот пишет: "Анфиса всегда должна говорить приветствие в начале каждого ответа!"... Как это понимать? В чем проблема? Ошибка в коде? Алгоритме? или что? Куратор не отвечает.
Результат выводит вроде нормально, если убрать элемент из списка, слово "друзья" склоняется как надо, количество элементов тоже меняется. Приветствие уже пробовала ставить везде: и сразу в начале функции, и в каждом условии отдельно, и отдельной функцией прописывала, ошибка остается.

Из-за этой проблемы, пока не разберусь, не могу двигаться дальше.

FRIENDS = ['Серёга', 'Соня', 'Дима', 'Алина', 'Егор']
def process_query(query):
# перенесите в функцию process_query() вот этот код:
    
    if query=="Сколько у меня друзей?":
        print("Привет, я Анфиса!")
        count = len(FRIENDS)
        print_friends_count(count)
        return

    else:
        print("Привет, я Анфиса!")
        print("<неизвестный запрос>")
def print_friends_count(friends_count):
    if friends_count == 1:
        print('У тебя 1 друг')
    elif 2 <= friends_count <= 4:
        print('У тебя ' + str(friends_count) + ' друга')
    elif friends_count >= 5:
        print('У тебя ' + str(friends_count) + ' друзей')

process_query("Сколько у меня друзей?")
process_query("Как меня зовут?")
Ответ написан
@Stikkibr
получилось так

FRIENDS = ['Серёга', 'Соня', 'Дима', 'Алина', 'Егор']

def print_friends_count(friends_count):
if friends_count == 1:
print('У тебя 1 друг')
elif 2 <= friends_count <= 4:
print('У тебя ' + str(friends_count) + ' друга')
elif friends_count >= 5:
print('У тебя ' + str(friends_count) + ' друзей')

# перенесите в функцию process_query() вот этот код:
def process_query(query):
print("Привет, я Анфиса!")
if query == 'Сколько у меня друзей?':
count = len(FRIENDS)
print_friends_count(count)
elif query == 'Кто все мои друзья?':
count = ', '.join(FRIENDS)
print('Твои друзья: ' + count)

else:
print("<неизвестный запрос>")


process_query('Сколько у меня друзей?')
process_query('Как меня зовут?')
process_query('Кто все мои друзья?')
Ответ написан
Комментировать
@Lamefox
Привет! По задаче № 2 принимал муки, потом допетрил, что надо действовать по инструкции, не давая мысли развернуться там, где не надо. Получилось так:

def process_query(query):

print("Привет, я Анфиса!")
count = len(FRIENDS)
#print_friends_count(count) # - зануляю, чтобы дважды не вызывалась функция. Проверка из задания далее:
if query == 'Сколько у меня друзей?': # - есть в подсказках, но и так понятно.
print_friends_count(count)
else:
print('<неизвестный запрос>')

process_query('Сколько у меня друзей?')
process_query('Как меня зовут?')

Задача №3 решена так:

def process_query(query):

print("Привет, я Анфиса!")
count = len(FRIENDS)
#print_friends_count(count)
if query == 'Сколько у меня друзей?':
print_friends_count(count)
elif query == 'Кто все мои друзья?':
print('Твои друзья: '+ ', '.join(FRIENDS))
else:
print('<неизвестный запрос>')

#process_query('Сколько у меня друзей?')
process_query('Как меня зовут?')
process_query('Кто все мои друзья?') - # Задание: Добавьте вызов process_query('Кто все мои друзья?') в тело
# основной программы.
Ответ написан
Комментировать
@tw1sted0s
Ответ на задание 2
FRIENDS = ['Серёга', 'Соня', 'Дима', 'Алина', 'Егор']

def print_friends_count(friends_count):
    if friends_count == 1:
        print('У тебя 1 друг')
    elif 2 <= friends_count <= 4:
        print('У тебя ' + str(friends_count) + ' друга')
    elif friends_count >= 5:
        print('У тебя ' + str(friends_count) + ' друзей')


# перенесите в функцию process_query() вот этот код:
def process_query(query):
    print("Привет, я Анфиса!")
    count = len(FRIENDS)
    if query == 'Сколько у меня друзей?':
        print_friends_count(count)
    else:
        print('<неизвестный запрос>')

    

process_query('Сколько у меня друзей?')
process_query('Как меня зовут?')

Ответ на задание 3
FRIENDS = ['Серёга', 'Соня', 'Дима', 'Алина', 'Егор']

def print_friends_count(friends_count):
    if friends_count == 1:
        print('У тебя 1 друг')
    elif 2 <= friends_count <= 4:
        print('У тебя ' + str(friends_count) + ' друга')
    elif friends_count >= 5:
        print('У тебя ' + str(friends_count) + ' друзей')


# перенесите в функцию process_query() вот этот код:
def process_query(query):
    print("Привет, я Анфиса!")
    count = len(FRIENDS)
    if query == 'Сколько у меня друзей?':
        print_friends_count(count)
    elif query == 'Кто все мои друзья?':
        print('Твои друзья: '+', '.join(FRIENDS))
    else:
        print('<неизвестный запрос>')

process_query('Сколько у меня друзей?')
process_query('Как меня зовут?')
process_query('Кто все мои друзья?')
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы