Возвращает None вместо False

#python #function #return

#python #функция #Возврат

Вопрос:

Итак, я работаю над вопросом о CodingBat, веб-сайте, который предоставляет практические задачи на JS и Python. Я столкнулся с неожиданным результатом. Кстати, вот ссылка на вопрос:https://codingbat.com/prob/p135815 . Теоретически мой код должен возвращать False, но он возвращает none, когда я ставлю print(squirrel_play(50, False))

Код:

 def squirrel_play(temp, is_summer):
if is_summer:
    if temp <= 100:
        if temp >= 60:
            return True
    elif temp <= 60:
        return False
    elif temp >= 100:
        return False
if not is_summer:
    if temp <= 90:
        if temp >= 60:
            return True
    elif temp >= 90: 
        return False
    elif temp <= 60:
        return False
  

когда я запускаю это с помощью print(squirrel_play(50, False)), я не получаю None (я должен получить False)
Почему???

Ответ №1:

С вашим параметром is_summer, равным False, вы находитесь во 2-м условном блоке:

 if not is_summer:
    if temp <= 90:
        if temp >= 60:
            return True
    elif temp >= 90: 
        return False
    elif temp <= 60:
        return False
  

Затем следуйте этому блоку:

  • является ли temp меньше 90? ДА. итак, теперь мы в этом блоке:
 if temp <= 90:
  if temp >= 60:
    return True
  

Здесь происходит то, что вы никогда не доберетесь до elif temp <= 60 , потому что вместо этого вы находитесь в первом условном выражении. Вы могли бы получить приведенный ниже elif только в том случае, если бы вы не удовлетворяли первому условию.

В конце этого if temp <= 90 блока заканчивается вся цепочка условий, и ваша функция возвращает значение по умолчанию None , потому что вы не указали другое возвращаемое значение.

Возможно, вы сможете более четко увидеть это, прочитав весь код целиком:

 def squirrel_play(temp, is_summer):
if is_summer:
    if temp <= 100:
        if temp >= 60:
            return True
    elif temp <= 60:
        return False
    elif temp >= 100:
        return False
if not is_summer:
    if temp <= 90:
        if temp >= 60:
            return True
        else:
           return "This is where I'm returning with 50, and True as my parameters"
    elif temp >= 90: 
        return False
    elif temp <= 60:
        return False
  

Ответ №2:

Вы пытались это отладить? С squirrel_play(50, False) это попадет в:

 def squirrel_play(temp, is_summer):

if is_summer:
    if temp <= 100:
        if temp >= 60:
            return True
    elif temp <= 60:
        return False
    elif temp >= 100:
        return False
if not is_summer:
    if temp <= 90:
        if temp >= 60:
            return True
        # HERE ( 50 is less than 90 but not greater than 60 ) 
        # and you have no return statement for this case
    elif temp >= 90: 
        return False
    elif temp <= 60:
        return False
  

Ответ №3:

Если вы не возвращаете значение из функции Python, None возвращается по умолчанию. Я полагаю, что здесь происходит то, что, поскольку вы используете elif инструкции, поскольку предложение if not is_summer: if temp <= 90: вводится, конечное предложение elif temp <= 60 не достигается. Поэтому функция получает все инструкции if / elif , не возвращая значения, и возвращает None .

Простое решение — заменить все elif s на if s . Затем print(squirrel_play(50, False)) возвращает False (по крайней мере, для меня).

Ответ №4:

Способ, которым вы в настоящее время его закодировали, в вашем

     if temp <= 90:
        if temp >= 60:
            return True
    elif ....
  

если первый if тест выдает значение True, а второй — значение False, то return оператор не выполняется (имейте в виду, что последующие elif тесты не выполняются, потому что первый if оценил значение true), и поэтому функция возвращает None .

На самом деле вы можете упростить функцию, используя операторы сравнения в цепочке:

 def squirrel_play(temp, is_summer):
    if is_summer:
        return 60 <= temp <= 100
    else:
        return 60 <= temp <= 90