简体   繁体   中英

Returns None instead of False

So I'm working on a question on CodingBat, a website that provides JS and Python practice problems. I've encountered a unexpected output. Btw here's the link to the question: https://codingbat.com/prob/p135815 . In theory my code should return False but it returns none when I put print(squirrel_play(50, False))

Code:

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

when I run that with print(squirrel_play(50, False)), I get None (I should get False) Why???

Did you try to debug it? With squirrel_play(50, False) it will fall into:

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

With your parameter of is_summer of False, you're in the 2nd conditional block:

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

Then follow this block:

  • is the temp less than 90? yes. so now we're in this block:
if temp <= 90:
  if temp >= 60:
    return True

What is happening here is that you never get to the elif temp <= 60 because you are in the first conditional instead. You could only ever get to the elif below if you didn't satisfy the first condition.

At the end of this if temp <= 90 block the entire conditional chain ends and your function returns the default value of None because you didn't provide another return value.

You can maybe more clearly see this by making the entire code read:

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

The way that you have currently coded it, in your

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

if the first if test evaluates True but the second one evaluates False, then no return statement is reached (bear in mind that the subsequent elif tests are not performed because the first if evaluated true), and the function therefore returns None .

In fact you can simplify the function making use of chained comparison operators :

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

If you don't return a value from a Python function, None is returned by default. I believe that what is happening here is that because you are using elif statements, since the clause if not is_summer: if temp <= 90: is being entered, the final clause elif temp <= 60 is not being reached. Therefore the function gets passed all of the if / elif statements without returning a value, and returns None .

A simple solution is to replace all of the elif s with if s. Then print(squirrel_play(50, False)) returns False (for me at least).

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM