Jenkins
Jenkins

Reputation: 37

Count not incrementing properly in python while loop

Can anyone tell me why when I input 1, 2, 3, and 4 into this code, my output is 6, 2, 3.00? I thought that every time my while loop evaluated to true it would increment the count by one, but the output is not making sense. It's taking the total of 3 of the numbers, but only 2 for the count? I'm probably just overlooking something so an extra pair of eyes would be awesome.

def calcAverage(total, count):
    average = float(total)/float(count)
    return format(average, ',.2f')


def inputPositiveInteger():
    str_in = input("Please enter a positive integer, anything else to quit: ")
    if not str_in.isdigit():
        return -1
    else:
        try:
            pos_int = int(str_in)
            return pos_int
        except:
            return -1


def main():
    total = 0
    count = 0
    while inputPositiveInteger() != -1:
        total += inputPositiveInteger()
        count += 1
    else:
        if count != 0:
            print(total)
            print(count)
            print(calcAverage(total, count))


main()

Upvotes: 1

Views: 1765

Answers (1)

Olivier Melançon
Olivier Melançon

Reputation: 22294

The error with your code is that on this piece of code...

while inputPositiveInteger() != -1:
        total += inputPositiveInteger()

You first call inputPositiveInteger and throw out the result in your condition. You need to store the result, otherwise one input out of two is ignored and the other is added even if it is -1.

num = inputPositiveInteger()
while num != -1:
        total += num 
        count += 1
        num = inputPositiveInteger()

Improvements

Although, note that your code can be significantly improved. See the comments in the following improved version of your code.

def calcAverage(total, count):
    # In Python3, / is a float division you do not need a float cast
    average = total / count 
    return format(average, ',.2f')


def inputPositiveInteger():
    str_int = input("Please enter a positive integer, anything else to quit: ")

    # If str_int.isdigit() returns True you can safely assume the int cast will work
    return int(str_int) if str_int.isdigit() else -1


# In Python, we usually rely on this format to run the main script
if __name__ == '__main__':
    # Using the second form of iter is a neat way to loop over user inputs
    nums = iter(inputPositiveInteger, -1)
    sum_ = sum(nums)

    print(sum_)
    print(len(nums))
    print(calcAverage(sum_, len(nums)))

One detail worth reading about in the above code is the second form of iter.

Upvotes: 1

Related Questions