Lauren Gainsbrook
Lauren Gainsbrook

Reputation: 5

How can I improve this Python code to be more efficient?

I've just started to learn Python (my first dabble in coding) and this is my first time posting... I hope I'm not abusing the forum by asking this question (I'm essentially asking an expert to help me learn). Please let me know if this is frowned upon in the community.

For this assignment from a Michigan open course, I've been instructed to ask a user for input until the user enters "done", at which point the code should calculate the largest, smallest, sum, and average. In all my test-runs, it's worked fine. But I feel like there's probably a much simpler way to write this code. Can anyone offer suggestions for improvement?

largest = None
smallest = None
count = 0
sum = 0
while True:
    try:
        num = raw_input("Enter a number: ")
        if num == "done" : break
        num = float(num)
        count = count + 1
        sum = sum + num
        avg = sum/count
        if largest is None:
            largest = num
        if smallest is None:
            smallest = num
        if num < smallest:
            smallest = num
        elif num > largest:
            largest = num
        continue
    except: print 'Invalid input'

print "Maximum is", int(largest)
print "Minimum is", int(smallest)
print "Count:", int(count)
print "Sum:", int(sum)
print "Average:", avg

Upvotes: 0

Views: 66

Answers (2)

Trelzevir
Trelzevir

Reputation: 765

An alternative approach to accomplish this is to store all of the inputs in a list, and then use the built-ins min(),max(),len() and sum() to find values:

num=raw_input("Enter a number: ")
nums=[]
while num!="done":       #check if user has finished entering inputs
    try:
        nums.append(int(num))       #append the input as an integer to a list
        num=raw_input("Enter a number: ")   #get another input
    except ValueError:
        print "Invalid input"

print "Maximum is",max(nums)
print "Minimum is",min(nums)
print "Count:",len(nums)
print "Sum: ",sum(nums)
print "Average: ",sum(nums)/len(nums)

Output:

Enter a number: 1
Enter a number: 2
Enter a number: 3
Enter a number: 4
Enter a number: 5
Enter a number: 6
Enter a number: done
Maximum is 6
Minimum is 1
Count: 6
Sum:  21
Average:  3.5

Upvotes: 1

willeM_ Van Onsem
willeM_ Van Onsem

Reputation: 476709

Well there are a few things here:

  • you can drop the continue statement since it is the end of the loop anyway;
  • you can compress the if statements into if largest is None or num > largest: this will shortcircuit and make the loop smaller;
  • you can use x += y instead of x = x + y; and
  • you do not have to calculate the average inside the loop; calculating it once when the loop finishes, is enough.

So:

largest = None
smallest = None
count = 0
sum = 0
while True:
    try:
        num = raw_input("Enter a number: ")
        if num == "done" : break
        num = float(num)
        count += 1
        sum += num
        if largest is None or num > largest:
            largest = num
        if smallest is None or num < smallest:
            smallest = num
    except: print 'Invalid input'

print "Maximum is", int(largest)
print "Minimum is", int(smallest)
print "Count:", int(count)
print "Sum:", int(sum)
print "Average:", sum/count

But in terms of big oh, you cannot improve much: calculating the sum, etc. simply require O(n) and it also costs O(n) to read the input anyway.

Furthermore some software engineering advice: don't use the blanket exception, always specify the exception you expect so:

largest = None
smallest = None
count = 0
sum = 0
while True:
    try:
        num = raw_input("Enter a number: ")
        if num == "done" : break
        num = float(num)
        count += 1
        sum += num
        if largest is None or num > largest:
            largest = num
        if smallest is None or num < smallest:
            smallest = num
    except ValueError: print 'Invalid input'

print "Maximum is", int(largest)
print "Minimum is", int(smallest)
print "Count:", int(count)
print "Sum:", int(sum)
print "Average:", sum/count

Upvotes: 1

Related Questions