M. Vladimir
M. Vladimir

Reputation: 39

Python Perfect Number

In this Python Question, I should get False if the the number is not perfect. instead, I'm getting "None". What should I change?

def perfect(number):
    sum = 0
    is_perfect = False
    if number < 0:
        return is_perfect
    for i in range(1, number):
        if(number % i == 0):
            sum = sum + i
        if (sum == number):
            is_perfect = True
            return is_perfect
print(perfect(8))

Upvotes: 0

Views: 311

Answers (2)

Ulises Bussi
Ulises Bussi

Reputation: 1725

Hi your problem is that you have no return when you don't match if (sum == number):..

so, the simplest solution is to add an return False at the end. But also your sum condition is inside the for that's not fine because you can encounter a fake perfect like 24... so be carefull about that condition

edit 0 is not a perfect number so add the condition to first if

def perfect(number):
    sum = 0
    is_perfect = False
    if number <= 0:
        return is_perfect
    for i in range(1, number):
        if(number % i == 0):
            sum = sum + i
    if (sum == number):
        is_perfect = True
        return is_perfect
    return False

I would totally reshape your code to make it a litle more clear:

def is_perfect(number):
    acum= 0
    if number <= 0:
        return False
    for i in range(1, number):
        if(number % i == 0):
            acum += i
    return (acum == number) #return true if the condition match, False if not

#just to check function 
print([(i,is_perfect(i)) for i in range(1,100) if is_perfect(i)])

#output
[(6, True), (28, True)]

Upvotes: 0

Kumpelinus
Kumpelinus

Reputation: 660

You should return False at the End otherwise None is getting returned implicitly:

def perfect(number):
    ...
    for i in range(1, number):
        ...
    return False

Upvotes: 1

Related Questions