Возврат не помещается в правый блок

#python #python-2.7

#python #python-2.7

Вопрос:

Я новичок в python и, пробуя небольшое упражнение по кодированию, у меня возникли небольшие проблемы при выполнении return в определенном блоке else. Приведенный ниже код принимает число и умножает каждую цифру до тех пор, пока результат не станет однозначным.

Что я делаю не так?

 def persis(n):
    convert_str = str(n)
    indi_num = [int(i) for i in convert_str ]
    result = reduce(lambda x,y: x*y, indi_num)

    #######
    final = None
    new_result = str(result)
    new_indi_num = [int(i) for i in new_result]

    if len(new_indi_num) > 1:
        persis(int(new_result))

    else:
        print "FINAL RESULT IS: " str(new_indi_num)
        ## return str(new_indi_num) # This Returns None From here##


pas=persis(162)
print pas
  

Это выводит меня

 FINAL RESULT IS: [2]
None
  

Комментарии:

1. Поместите свой return на тот же уровень идентификации, что и else оператор.

2. @MaximilianPeters по-прежнему говорит, что нет

Ответ №1:

Это работает:

 from functools import reduce

def persis(n):
    convert_str = str(n)
    indi_num = [int(i) for i in convert_str ]
    result = reduce(lambda x,y: x*y, indi_num)

    #######
    final = None
    new_result = str(result)
    new_indi_num = [int(i) for i in new_result]

    if len(new_indi_num) > 1:
        return persis(int(new_result))

    else:
        print "FINAL RESULT IS: " str(new_indi_num[0])
        return new_indi_num[0]


pas=persis(162)
print pas
  

Это выводит

 FINAL RESULT IS: 2
2
  

Ответ №2:

Вам нужно изменить persis(int(new_result)) на return persis(int(new_result)) (и вам нужно раскомментировать исходную return инструкцию).

Это рекурсивная функция. Происходит то, что существует по крайней мере два вызова этой функции: «родительский» вызов, который вводит if инструкцию и выполняет другой вызов (дочерний вызов) для persis , и дочерний вызов, который вызывается родительским и входит в блок else. Как только вы раскомментируете оператор return, дочерний вызов корректно вернет желаемое значение; однако он возвращает это значение родительскому, который ничего с ним не делает. Изменяя persis(int(new_result)) на return persis(int(new_result)) , вы убедитесь, что родительский вызов возвращает то же самое, что и дочерний.